Transact-SQL 概述

Transact-SQL 对使用 Microsoft® SQL Server™ 非常重要。与 SQL Server 通讯的所有应用程序都通过向服务器发送 Transact-SQL 语句来进行通讯，而与应用程序的用户界面无关。

Transact-SQL 由多种应用程序生成，包括：

  • 通用办公生产应用程序。

  • 使用图形用户界面 (GUI) 的应用程序，使用户得以选择包含要查看的数据的表和列。

  • 使用通用语言语句确定用户所要查看数据的应用程序。

  • 将其数据存储于 SQL Server 数据库中的商用应用程序。这些应用程序既可以是来自其它厂商的应用程序，也可以是内部编写的应用程序。

  • 使用 osql 等实用工具运行的 Transact-SQL 脚本。

  • 由开发系统（如 Microsoft Visual C++®、Microsoft Visual Basic® 或 Microsoft Visual J++®）使用数据库应用程序接口 (API)（如 ADO、OLE DB 以及 ODBC）创建的应用程序。

  • 从 SQL Server 数据库提取数据的 Web 页。

  • 分布式数据库系统，在此系统中将数据从 SQL Server 复制到各个数据库或执行分布式查询。

  • 数据仓库，从联机事务处理 (OLTP) 系统中提取数据，以及对数据汇总以进行决策支持分析，均可在此仓库中进行。

有关 Transact-SQL 如何与 API 以及应用程序组件（如事务控件、游标和锁定）交互的信息，请参见访问和更改关系数据概述。


Transact-SQL 语法规则

Transact-SQL 引用中的语法关系图使用下列规则。

规范 | 用于
大写 | Transact-SQL 关键字。
斜体 | Transact-SQL 语法中用户提供的参数。
| （竖线） | 分隔括号或大括号内的语法项目。只能选择一个项目。
[ ] （方括号） | 可选语法项目。不必键入方括号。
{}（大括号） | 必选语法项。不要键入大括号。
[ ,...n ] | 表示前面的项可重复 n 次。每一项由逗号分隔。
[ ...n ] | 表示前面的项可重复 n 次。每一项由空格分隔。
加粗 | 数据库名、表名、列名、索引名、存储过程、实用工具、数据类型名以及必须按所显示的原样键入的文本。
<标签> ::= | 语法块的名称。此规则用于对可在语句中的多个位置使用的过长语法或语法单元部分进行分组和标记。适合使用语法块的每个位置由括在尖括号内的标签表示：<标签>。

除非另外指定，否则所有对数据库对象名的 Transact-SQL 引用可以是由四部分组成的名称，格式如下：

[
server_name.[database_name].[owner_name].
| database_name.[owner_name].
 | owner_name.
]
]
object_name

  • server_name 指定链接服务器名称或远程服务器名称。

  • 当对象驻留在 SQL Server 数据库中时，database_name 指定该 Microsoft® SQL Server™ 数据库的名称。当对象在链接服务器中时则指定 OLE DB 目录。

  • 如果对象在 SQL Server 数据库中，owner_name 指定拥有该对象的用户。当对象在链接服务器中时则指定 OLE DB 架构名称。

  • object_name 引用对象的名称。

当引用某个特定对象时，不必总是为 SQL Server 指定标识该对象的服务器、数据库和所有者。可以省略中间级节点，而使用句点表示这些位置。对象名的有效格式是：

server.database.owner.object

server.database..object

server..owner.object

server...object

database.owner.object

database..object

owner.object

对象

代码示例规则

除非另外规定，否则示例已使用 SQL Server 查询分析器和以下选项的默认设置进行了测试：

  • QUOTED_IDENTIFIER

  • ANSI_NULLS

  • ANSI_WARNINGS

  • ANSI_PADDING

  • ANSI_NULL_DFLT_ON

  • CONCAT_NULL_YIELDS_NULL

Transact-SQL 引用中的大多数代码示例都已在运行区分大小写排序次序的服务器上进行了测试。测试服务器通常运行 ANSI/ISO 1252 代码页。

Transact-SQL 数据类型分类

具有相似特性的数据类型被划分在分类中。包含两个或三个数据类型的分类一般有一个分类名称，该名称从这个分类中的数据类型衍生而来。例如，money 和 smallmoney 分类包含 money 数据类型和 smallmoney 数据类型。数据类型名称总是显示为粗体，即使用作分类名称的一部分也是如此。

Transact-SQL 数据类型层次结构

下面的数据类型层次结构显示在 SQL Server 文档中使用的 SQL Server 数据类型分类、子分类和数据类型。例如，精确数字分类包含三个子分类：整数、decimal、money 和 smallmoney。

精确数字分类还包含上述三个子分类中的所有数据类型：bigint、int、smallint、tinyint、bit、decimal、money 和 smallmoney。Transact-SQL 参考中任何对精确数字的引用均指上述八种数据类型。

在该层次结构中，由两种或多种数据类型构成的类别名称中使用连词"和"。在 Transact-SQL 参考中，如果名称所处的上下文更适合用"或"，则可能使用连词"或"。

在该层次结构中指定的数据类型还适合同义词。例如，int 引用 int 及其同义词 integer。有关更多信息，请参见数据类型。

数字
精确数字
整数
bigint
int
smallint
tinyint
bit
decimal 和 numeric
decimal
numeric
money 和 smallmoney
money
smallmoney
近似数字
float
real
datetime 和 smalldatetime
datetime
smalldatetime

字符和二进制字符串
字符串
char、varchar 和 text
char 和 varchar
char
varchar
text
Unicode 字符串
nchar 和 nvarchar
nchar
nvarchar
ntext
二进制字符串
binary 和 varbinary
binary
varbinary
image

cursor

sql_variant

table

timestamp

uniqueidentifier

Transact-SQL 引用中使用的其它数据类型分类在下面两个层次结构中加以描述：

text、ntext 和 image
text 和 ntext
text
ntext
image

短字符串
短字符
char 和 varchar
char
varchar
nchar 和 nvarchar
nchar
nvarchar
binary 和 varbinary
binary
varbinary


Transact-SQL 中的新特性和增强的功能

Microsoft® SQL Server™ 2000 中的 Transact-SQL 提供新特性以及增强的语句、存储过程、函数、数据类型、DBCC 语句和信息架构视图。

数据类型
新数据类型
bigint | table
sql_variant |

数据库控制台命令 (DBCC)
新命令
DBCC CHECKCONSTRAINTS | DBCC DROPCLEANBUFFERS
DBCC CLEANTABLE | DBCC FREEPROCCACHE
DBCC CONCURRENCYVIOLATION | DBCC INDEXDEFRAG

增强的命令
DBCC CHECKALLOC | DBCC CHECKFILEGROUP
DBCC CHECKDB | DBCC SHOWCONTIG
DBCC CHECKTABLE |

函数
新函数
BINARY_CHECKSUM | fn_virtualfilestats
CHECKSUM | GETUTCDATE
CHECKSUM_AGG | HAS_DBACCESS
COLLATIONPROPERTY | IDENT_CURRENT
COUNT_BIG | INDEXKEY_PROPERTY
DATABASEPROPERTYEX | OBJECTPROPERTY
fn_helpcollations | OPENDATASOURCE
fn_listextendedproperty | OPENXML
fn_servershareddrives | ROWCOUNT_BIG
fn_trace_geteventinfo | SCOPE_IDENTITY
fn_trace_getfilterinfo | SERVERPROPERTY
fn_trace_getinfo | SESSIONPROPERTY
fn_trace_gettable | SQL_VARIANT_PROPERTY

信息架构视图
新信息架构视图
PARAMETERS | ROUTINE_COLUMNS
ROUTINES |

复制存储过程
新复制存储过程
sp_addmergealternatepublisher | sp_getqueuedrows
sp_addscriptexec | sp_getsubscriptiondtspackagename
sp_adjustpublisheridentityrange | sp_helparticledts
sp_attachsubscription | sp_helpmergealternatepublisher
sp_browsesnapshotfolder | sp_helpreplicationoption
sp_browsemergesnapshotfolder | sp_ivindexhasnullcols
sp_changesubscriptiondtsinfo | sp_marksubscriptionvalidation
sp_copysnapshot | sp_mergearticlecolumn
sp_disableagentoffload | sp_repladdcolumn
sp_dropanonymouseagent | sp_repldropcolumn
sp_dropmergealternatepublisher | sp_restoredbreplication
sp_enableagentoffload | sp_resyncmergesubscription
sp_getagentoffloadinfo | sp_vupgrade_replication

保留关键字

COLLATE、FUNCTION 和 OPENXML 是 SQL Server 2000 中的保留关键字。

以下这些词已不再是保留关键字。

AVG | COMMITTED
CONFIRM | CONTROLROW
COUNT | ERROREXIT
FLOPPY | ISOLATION
LEVEL | MAX
MIN | MIRROREXIT
ONCE | ONLY
PERM | PERMANENT
PIPE | PREPARE
PRIVILEGES | REPEATABLE
SERIALIZABLE | SUM
TAPE | TEMP
TEMPORARY | UNCOMMITTED
WORK |

语句
新语句
ALTER FUNCTION | DROP FUNCTION
CREATE FUNCTION |

增强的语句
ALTER DATABASE | CREATE TABLE
ALTER TABLE | CREATE TRIGGER
BACKUP | INDEXPROPERTY
COLUMNPROPERTY | OBJECTPROPERTY
CREATE INDEX | RESTORE
CREATE STATISTICS |

系统存储过程
新系统存储过程
sp_addextendedproperty | sp_delete_maintenance_plan_job
sp_add_log_shipping_database | sp_dropextendedproc
sp_add_log_shipping_plan | sp_get_log_shipping_monitor_info
sp_add_log_shipping_plan_database | sp_helpconstraint
sp_add_log_shipping_primary | sp_helpindex
sp_add_log_shipping_secondary | sp_help_maintenance_plan
sp_add_maintenance_plan | sp_invalidate_textptr
sp_add_maintenance_plan_db | sp_remove_log_shipping_monitor
sp_add_maintenance_plan_job | sp_resolve_logins
sp_can_tlog_be_applied | sp_settriggerorder
sp_change_monitor_role | sp_trace_create
sp_change_primary_role | sp_trace_generateevent
sp_change_secondary_role | sp_trace_setevent
sp_create_log_shipping_monitor_account | sp_trace_setfilter
sp_define_log_shipping_monitor | sp_trace_setstatus
sp_delete_log_shipping_database | sp_updateextendedproperty
sp_delete_log_shipping_plan | sp_update_log_shipping_monitor_info
sp_delete_log_shipping_plan_database | sp_update_log_shipping_plan
sp_delete_log_shipping_primary | sp_update_log_shipping_plan_database
sp_delete_log_shipping_secondary | sp_xml_preparedocument
sp_delete_maintenance_plan | sp_xml_removedocument
sp_delete_maintenance_plan_db |

增强的系统存储过程
sp_helptrigger | sp_serveroption
sp_tableoption | sp_who

系统表
新系统表
logmarkhistory | MSsync_states
log_shipping_databases | sysdbmaintplan_databases
log_shipping_monitor | sysdbmaintplan_history
log_shipping_plan_databases | sysdbmaintplan_jobs
log_shipping_plan_history | sysdbmaintplans
log_shipping_plans | sysmergeschemaarticles
log_shipping_secondaries | sysopentapes
Mssub_identity_range |


!> （不大于）

比较两个表达式（比较运算符）。当比较非空表达式时，如果左边操作数的值不大于右边的操作数，则结果为 TRUE；否则结果为 FALSE。如果两个操作数中有一个或者两个都为 NULL，并且 SET ANSI_NULLS 被设置为 ON，则结果为 NULL。如果 SET ANSI_NULLS 被设置为 OFF，则当一个操作数为 NULL 时结果为 FALSE，当两个操作数都为 NULL 时结果为 TRUE。

语法

expressionexpression

参数

expression

是任何有效的 Microsoft® SQL Server™ 表达式。两个表达式都必须有可隐式转换的数据类型。转换取决于数据类型优先级。有关更多信息，请参见数据类型的优先顺序。

结果类型

Boolean

请参见

数据类型

表达式

运算符（比较运算符）


!< （不小于）

比较两个表达式（比较运算符）。当比较非空表达式时，如果左边操作数的值不小于右边的操作数，则结果为 TRUE；否则结果为 FALSE。如果两个操作数中有一个或者两个都为 NULL，并且 SET ANSI_NULLS 被设置为 ON，则结果为 NULL。如果 SET ANSI_NULLS 被设置为 OFF，则当一个操作数为 NULL 时结果为 FALSE，当两个操作数都为 NULL 时结果为 TRUE。

语法

expressionexpression

参数

expression

是任何有效的 Microsoft® SQL Server™ 表达式。两个表达式都必须有可隐式转换的数据类型。转换取决于数据类型优先级。有关更多信息，请参见数据类型的优先顺序。

结果类型

Boolean

请参见

数据类型

表达式

运算符（比较运算符）


!=（不等于）

测试某个表达式是否不等于另一个表达式（比较运算符）。其功能与不等于 (<>) 比较运算符相同。

请参见

表达式

<>（不等于）

运算符（比较运算符）


% （通配符 -- 需匹配的字符）

 Transact-SQL 参考

%（通配符 — 需匹配的字符）

匹配包含零个或多个字符的任意字符串。这个通配符既可以用作前缀也可以用作后缀。

请参见

LIKE


%（模）

提供两数相除后的余数。

语法

dividend % divisor

参数

dividend

是被除数的数字表达式。dividend 必须是整型数据类型分类的任何有效 Microsoft® SQL Server™ 表达式。（模是两个整数相除后剩余的整数。）

divisor

除数的数字表达式。divisor 可以是具有数字数据类型分类中任何数据类型的任何有效 SQL Server 表达式。

结果类型

int

注释

求模算术运算符可以和列名、数字常量或任何具有整型数据类型分类的有效表达式组合共同在 SELECT 语句的选择列表中使用。

示例

下面的示例返回每本书的书号以及年销售总额 (ytd_sales * price) 除以每本书的价格（转换为整型值）所得的模（余数）。

USE pubs
GO
SELECT title_id,
   CAST((ytd_sales * price) AS int) % CAST(price AS int) AS Modulo
FROM titles
WHERE price IS NOT NULL and type = 'trad_cook'
ORDER BY title_id
GO

请参见

表达式

函数

LIKE

运算符

SELECT


&（按位 AND）

在两个整型值之间执行按位逻辑与运算。

语法

expression & expression

参数

expression

是任何有效的 Microsoft® SQL Server™ 表达式，必须由整数数据类型分类中的任何数据类型组成。expression 是经过处理并转换为二进制数字以便进行位运算的整型参数。

结果类型

如果输入值为 int，则返回 int；如果输入值为 smallint，则返回 smallint；或者如果输入值为 tinyint，则返回 tinyint。

注释

通过从两个表达式取对应的位，位运算符 & 在两个表达式之间执行按位逻辑与运算。只有当输入表达式中两个位（正在被解析的当前位）的值都为 1 时，结果中的位才被设置为 1；否则，结果中的位被设置为 0。

位运算符 & 只可以用在具有整型数据类型分类的表达式上。

如果左右表达式的整型数据类型不同（例如，左边 expression 的数据类型是 smallint，右边 expression 的数据类型是 int），那么将较小的数据类型的参数转换为较大的数据类型。在该示例中，数据类型为 smallint 的 expression 被转换为 int 数据类型。

示例

下面的示例创建一个具有 int 数据类型的表以显示值，并将该表放入一行中。

USE master
GO
IF EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES
      WHERE TABLE_NAME = 'bitwise')
   DROP TABLE bitwise
GO
CREATE TABLE bitwise
(
 a_int_value int NOT NULL,
 b_int_value int NOT NULL
)
GO
INSERT bitwise VALUES (170, 75)
GO

下面的查询在 a_int_value 列和 b_int_value 列上执行按位 AND 运算。

USE MASTER
GO
SELECT a_int_value & b_int_value
FROM bitwise
GO

下面是结果集：

-----------
10

(1 row(s) affected)

170（a_int_value 或 A，如下所示 ）的二进制表示为 0000 0000 1010 1010。75（b_int_value 或 B，如下所示）的二进制表示为 0000 0000 0100 1011。在这两个值之间执行按位 AND 运算所产生的二进制结果是 0000 0000 0000 1010，即十进制数 10。

(A & B)
         0000    0000 1010 1010
         0000 0000 0100 1011
         -------------------
         0000 0000 0000 1010

请参见

表达式

运算符（位运算符）


>（大于）

比较两个表达式（比较运算符）。当比较非空表达式时，如果左边操作数的值大于右边的操作数，则结果为 TRUE；否则结果为FALSE。如果两个操作数中有一个或者两个都为 NULL，并且 SET ANSI_NULLS 被设置为 ON，则结果为 NULL。如果 SET ANSI_NULLS 被设置为 OFF，则当一个操作数为 NULL 时结果为 FALSE，当两个操作数都为 NULL 时结果为 TRUE。

语法

expression > expression

参数

expression

是任何有效的 Microsoft® SQL Server™ 表达式。两个表达式都必须有可隐式转换的数据类型。转换取决于数据类型优先级。有关更多信息，请参见数据类型的优先顺序。

结果类型

Boolean

请参见

数据类型

表达式

运算符（比较运算符）


>=（大于或等于）

比较两个表达式（比较运算符）。当比较非空表达式时，如果左边操作数的值大于或等于右边的操作数，则结果为 TRUE；否则结果为 FALSE。如果两个操作数中有一个或者两个都为 NULL，并且 SET ANSI_NULLS 被设置为 ON，则结果为 NULL。如果 SET ANSI_NULLS 被设置为 OFF，则当一个操作数为 NULL 时结果为 FALSE，当两个操作数都为 NULL 时结果为 TRUE。

语法

expression > = expression

参数

expression

是任何有效的 Microsoft® SQL Server™ 表达式。两个表达式都必须有可隐式转换的数据类型。转换取决于数据类型优先级。有关更多信息，请参见数据类型的优先顺序。

结果类型

Boolean

请参见

数据类型

表达式

运算符（比较运算符）


<>（不等于）

比较两个表达式（比较运算符）。当比较非空表达式时，如果左边操作数的数值不等于右边的操作数，则结果为 TRUE；否则结果为 FALSE。如果两个操作数中有一个或者两个都为 NULL，并且 SET ANSI_NULLS 被设置为 ON，则结果为 NULL。如果 SET ANSI_NULLS 被设置为 OFF，则当一个操作数为 NULL 时结果为 FALSE，当两个操作数都为 NULL 时结果为 TRUE。

语法

expression < > expression

参数

expression

是任何有效的 Microsoft® SQL Server™ 表达式。两个表达式都必须有可隐式转换的数据类型。转换取决于数据类型优先级。有关更多信息，请参见数据类型的优先顺序。

结果类型

Boolean

请参见

数据类型

表达式

运算符（比较运算符）


<（小于）

比较两个表达式（比较运算符）。当比较非空表达式时，如果左边操作数的值小于右边的操作数，则结果为 TRUE；否则结果为FALSE。如果两个操作数中有一个或者两个都为 NULL，并且 SET ANSI_NULLS 被设置为 ON，则结果为 NULL。如果 SET ANSI_NULLS 被设置为 OFF，则当一个操作数为 NULL 时结果为 FALSE，当两个操作数都为 NULL 时结果为 TRUE。

语法

expression < expression

参数

expression

是任何有效的 Microsoft® SQL Server™ 表达式。两个表达式都必须有可隐式转换的数据类型。转换取决于数据类型优先级。有关更多信息，请参见数据类型的优先顺序。

结果类型

Boolean

请参见

数据类型

表达式

运算符（比较运算符）


<=（小于或等于）

比较两个表达式（比较运算符）。当比较非空表达式时，如果左边操作数的值小于或等于右边的操作数，则结果为 TRUE；否则结果为 FALSE。如果两个操作数中有一个或者两个都为 NULL，并且 SET ANSI_NULLS 被设置为 ON，则结果为 NULL。如果 SET ANSI_NULLS 被设置为 OFF，则当一个操作数为 NULL 时结果为 FALSE，当两个操作数都为 NULL 时结果为 TRUE。

语法

expression = < expression

参数

expression

是任何有效的 Microsoft® SQL Server™ 表达式。两个表达式都必须有可隐式转换的数据类型。转换取决于数据类型优先级。有关更多信息，请参见数据类型的优先顺序。

结果类型

Boolean

请参见

数据类型

表达式

运算符（比较运算符）


-（负）

一元运算符，返回数字表达式的负值（一元运算符）。

语法

numeric_expression

参数

numeric_expression

是数字数据类型分类中任何数据类型（datetime 或 smalldatetime 数据类型除外）的任何有效 Microsoft® SQL Server™ 表达式。

结果类型

除了无符号 tinyint 表达式被提升为有符号的 smallint 结果之外，返回 numeric_expression 的数据类型。

示例
A. 将一个变量设置为负数

下面的示例将一个变量设置为负数。

DECLARE @MyNumber decimal(10,2)
@MyNumber = -123.45
B. 对一个数值取负

下面的示例对变量进行取负。

DECLARE @Num1 int
SET @Num1 = 5
SELECT -@Num1

请参见

数据类型

表达式

运算符


-（减）

两个数相减。该减法算术运算符也可以从日期中减去一个以天数为单位数值。

语法

expression - expression

参数

expression

是数字数据类型分类中任何数据类型（bit 数据类型除外）的任何有效 Microsoft® SQL Server™ 表达式。

结果类型

返回优先级较高的参数的数据类型。有关更多信息，请参见数据类型的优先顺序。

示例
A. 在 SELECT 语句中使用减法

下面的示例返回公司每种图书的年度净收入。

USE pubs
GO
SELECT title,
   (
      (price * ytd_sales) * CAST( ( (100 - royalty) / 100.0 )
         AS MONEY)
      ) AS IncomeAfterRoyalty
FROM titles
WHERE royalty <> 0
ORDER BY title_id ASC
GO

括号可以用来更改执行的顺序。括号内的计算要首先执行。如果括号有嵌套，则最内层的计算优先。例如，如果使用括号强制先计算减法再计算乘法（在这种情况下得到一个毫无意义的数据），则前一个查询的结果和意义会发生更改。

B. 使用日期减法

下面的示例从 datetime 日期中减去若干天。

USE pubs
GO
DECLARE @altstartdate datetime
SET @altstartdate = '1/10/1900 3:00 AM'
SELECT @altstartdate - 1.5 AS 'Subtract Date'

下面是结果集：

Subtract Date
--------------------
Jan 8 1900  3:00PM

(1 row(s) affected)

请参见

数据类型

表达式

函数

运算符

SELECT


--（注释）

表示用户提供的文本。可以将注释插入单独行中、嵌套（只限 --）在 Transact-SQL 命令行的末端，或者 Transact-SQL 语句中。服务器不对注释进行评估。两个连字符 (--) 是 SQL-92 标准的注释指示符。

语法

-- text_of_comment

参数

text_of_comment

包含注释文本的字符串。

注释

将 -- 用于单行或嵌套的注释。用 -- 插入的注释由换行字符分界。

注释没有最大长度限制。

说明 在注释中包含 GO 命令会生成一个错误信息。

示例

下面的示例使用 -- 注释字符。

-- Choose the pubs database.
USE pubs
-- Choose all columns and all rows from the titles table.
SELECT *
FROM titles
ORDER BY title_id ASC -- We don't have to specify ASC because that
-- is the default.

请参见

/*...*/（注释）

控制流语言

使用注释


*（乘）

两个表达式相乘（算术乘法运算符）。

语法

expression * expression

参数

expression

是数字数据类型分类中任何数据类型（datetime 或 smalldatetime 数据类型除外）的任何有效 Microsoft® SQL Server™ 表达式。

结果类型

返回优先级较高的参数的数据类型。有关更多信息，请参见数据类型的优先顺序。

示例

下面的示例检索现代食谱图书的标识号和价格，并使用 * 算术运算符将价格乘以 1.15。

USE pubs
SELECT title_id, price * 1.15 AS NewPrice
FROM titles
WHERE type = 'mod_cook'
ORDER BY title_id ASC

请参见

数据类型

表达式

函数

运算符

SELECT

WHERE


/（除）

用一个数除以另一个数（算术除法运算符）。

语法

dividend / divisor

参数

dividend

是要被除的数字表达式。dividend 可以是数字数据类型分类中的任何数据类型（datetime 或 smalldatetime 数据类型除外）的任何有效 Microsoft® SQL Server™ 表达式。

divisor

除数的数字表达式。divisor 可以是具有数字数据类型分类中任何数据类型（datetime 和 smalldatetime 数据类型除外）的任何有效 SQL Server 表达式。

结果类型

返回优先级较高的参数的数据类型。有关数据类型优先级的更多信息，请参见数据类型的优先顺序。

如果用一个整型的 divisor 去除整型的 dividend，其结果是一个整数，小数部分被截断。

注释

由 / 运算符返回的实际值是用第一个表达式除以第二个表达式所得的商。

示例

下面的示例使用除法算术运算符计算编写商务图书的作者应得的版税。

USE pubs
GO
SELECT ((ytd_sales * price) * royalty)/100 AS 'Royalty Amount'
FROM titles
WHERE type = 'business'
ORDER BY title_id

请参见

数据类型

表达式

函数

运算符

SELECT

WHERE


/*...*/（注释）

表示用户提供的文本。服务器不对位于 /* 和 */ 注释字符之间的文本进行评估。

语法

/ * text_of_comment * /

参数

text_of_comment

包含注释文本的字符串。

注释

注释可以插入单独行中，或者 Transact-SQL 语句中。多行的注释必须用 /* 和 */ 指明。用于多行注释的样式规则是，第一行用 /* 开始，接下来的注释行用 ** 开始，并且用 */ 结束注释。

注释没有最大长度限制。

说明 在注释中包含 GO 命令会生成一个错误信息。

示例

下面的示例使用注释来注明和测试在开发触发器的不同阶段期间的行为。在下面的示例中，将部分的触发器标为注释语句是为了缩小问题范围，并且只测试其中一个条件。使用了两种注释语句样式，SQL-92 样式的注释 (--) 分别以单独和嵌套的方式显示。

说明 下面 CREATE TRIGGER 语句失败的原因是命名为 employee_insupd 的触发器已经存在于 pubs 数据库中。

CREATE TRIGGER employee_insupd
/*
   Because CHECK constraints can only reference the column(s)
   on which the column- or table-level constraint has
   been defined, any cross-table constraints (in this case,
   business rules) need to be defined as triggers.

   Employee job_lvls (on which salaries are based) should be within
   the range defined for their job. To get the appropriate range,
   the jobs table needs to be referenced. This trigger will be
   invoked for INSERT and UPDATES only.
*/
ON employee
FOR INSERT, UPDATE
AS
/* Get the range of level for this job type from the jobs table. */
DECLARE @min_lvl tinyint,      -- Minimum level var. declaration
   @max_lvl tinyint,         -- Maximum level var. declaration
   @emp_lvl tinyint,         -- Employee level var. declaration
   @job_id smallint            -- Job ID var. declaration
SELECT @min_lvl = min_lvl,      -- Set the minimum level
   @max_lvl = max_lvl,          -- Set the maximum level
   @emp_lvl = i.job_lvl,      -- Set the proposed employee level
   @job_id = i.job_id         -- Set the Job ID for comparison
FROM employee e, jobs j, inserted i
WHERE e.emp_id = i.emp_id AND i.job_id = j.job_id
IF (@job_id = 1) and (@emp_lvl <> 10)
BEGIN
   RAISERROR ('Job id 1 expects the default level of 10.', 16, 1)
   ROLLBACK TRANSACTION
END
/* Only want to test first condition. Remaining ELSE is commented out.
-- Comments within this section are unaffected by this commenting style.
ELSE
IF NOT (@emp_lvl BETWEEN @min_lvl AND @max_lvl) -- Check valid range
BEGIN
   RAISERROR ('The level for job_id:%d should be between %d and %d.',
      16, 1, @job_id, @min_lvl, @max_lvl)
   ROLLBACK TRANSACTION
END
*/
GO

请参见

--（注释）

控制流语言

使用注释


@@CONNECTIONS

返回自上次启动 Microsoft® SQL Server™ 以来连接或试图连接的次数。

语法

@@CONNECTIONS

返回类型

integer

注释

连接与用户不同。例如，应用程序可以打开多个与 SQL Server 的连接，而不需要用户监视这些连接。

若要显示一个包含几个 SQL Server 统计信息的报表，包括试图连接统计信息，请运行 sp_monitor。

示例

下面的示例显示了到当前日期和时间为止试图登录的次数。

SELECT GETDATE() AS 'Today's Date and Time',
   @@CONNECTIONS AS 'Login Attempts'

下面是结果集：

Today's Date and Time              Login Attempts
---------------------------        ---------------
1998-04-09 14:28:46.940            18

请参见

配置函数

sp_monitor


@@CPU_BUSY

返回自上次启动 Microsoft® SQL Server™ 以来 CPU 的工作时间，单位为毫秒（基于系统计时器的分辨率）。

语法

@@CPU_BUSY

返回类型

integer

注释

若要显示包含几个 SQL Server 统计信息的报表，包括 CPU 活动统计信息，请运行 sp_monitor。

示例

下面的示例显示了到当前日期和时间为止 SQL Server CPU 的活动。

SELECT @@CPU_BUSY AS 'CPU ms', GETDATE() AS 'As of'

下面是结果集：

CPU ms               As of
-----------------    ---------------------------
20                   1998-04-18  14:43:08.180

请参见

@@IDLE

@@IO_BUSY

sp_monitor

系统统计函数


@@CURSOR_ROWS

返回连接上最后打开的游标中当前存在的合格行的数量。为提高性能，Microsoft® SQL Server™ 可以异步填充大键集和静态游标。可调用 @@CURSOR_ROWS，以确定当它被调用时，符合游标的行的数目被进行了检索。

返回值 | 描述
-m | 游标被异步填充。返回值 (-m) 是键集中当前的行数。
-1 | 游标为动态。因为动态游标可反映所有更改，所以符合游标的行数不断变化。因而永远不能确定地说所有符合条件的行均已检索到。
0 | 没有被打开的游标，没有符合最后打开的游标的行，或最后打开的游标已被关闭或被释放。
n | 游标已完全填充。返回值 (n) 是在游标中的总行数。

语法

@@CURSOR_ROWS

返回类型

integer

注释

若最后打开的游标是异步打开的，则 @@CURSOR_ROWS 返回的值是负数。若 sp_configure cursor threshold 的值大于0，则键集驱动程序或静态游标被异步打开，且游标结果集中的行数大于游标阈值。

示例

下面的示例声明了一个游标，并且用 SELECT 显示 @@CURSOR_ROWS 的值。在游标打开前，设置值为 0，值 -1 则表示游标键集被异步填充。

SELECT @@CURSOR_ROWS
DECLARE authors_cursor CURSOR FOR
SELECT au_lname FROM authors
OPEN authors_cursor
FETCH NEXT FROM authors_cursor
SELECT @@CURSOR_ROWS
CLOSE authors_cursor
DEALLOCATE authors_cursor

-----------
0

(1 row(s) affected)

au_lname
----------------------------------------
White

(1 row(s) affected)

-----------
-1

(1 row(s) affected)

请参见

异步填充

游标函数

OPEN


@@DATEFIRST

返回 SET DATEFIRST 参数的当前值，SET DATEFIRST 参数指明所规定的每周第一天：1 对应星期一，2 对应星期二，依次类推，用 7 对应星期日。

语法

@@DATEFIRST

返回类型

tinyint

注释

美国英语中默认 7 对应星期日。

示例

下面的示例将每周第一天设为 5 （星期五），并假定当日是星期六。SELECT 语句返回 DATEFIRST 值和当日是此周的第几天。

SET DATEFIRST 5
SELECT @@DATEFIRST AS '1st Day', DATEPART(dw, GETDATE()) AS 'Today'

下面是结果集。从星期五算起，今天（星期六）是第二天。

1st Day           Today
----------------  --------------
5                 2

请参见

DATEPART

配置函数

SET DATEFIRST


@@DBTS

为当前数据库返回当前 timestamp 数据类型的值。这一 timestamp 值保证在数据库中是唯一的。

语法

@@DBTS

返回类型

varbinary

注释

@@DBTS 返回当前数据库最后所使用的时间戳值。当带有 timestamp 列的一行被插入或更新时，会产生一个新的时间戳值。

示例

下面的示例从 pubs 数据库返回当前的 timestamp 值。

USE pubs
SELECT @@DBTS

请参见

配置函数

游标并发

数据类型


@@ERROR

返回最后执行的 Transact-SQL 语句的错误代码。

语法

@@ERROR

返回类型

integer

注释

当 Microsoft® SQL Server™ 完成 Transact-SQL 语句的执行时，如果语句执行成功，则 @@ERROR 设置为 0。若出现一个错误，则返回一条错误信息。@@ERROR 返回此错误信息代码，直到另一条 Transact-SQL 语句被执行。您可以在 sysmessages 系统表中查看与 @@ERROR 错误代码相关的文本信息。

由于 @@ERROR 在每一条语句执行后被清除并且重置，应在语句验证后立即检查它，或将其保存到一个局部变量中以备事后查看。

示例
A.用 @@ERROR 检测一个特定错误

下面的示例用 @@ERROR 在一个 UPDATE 语句中检测限制检查冲突（错误 #547）。

USE pubs
GO
UPDATE authors SET au_id = '172 32 1176'
WHERE au_id = "172-32-1176"

IF @@ERROR = 547
   print "A check constraint violation occurred"
B.用 @@ERROR 有条件地退出一个过程

在此示例中，IF...ELSE 语句在存储过程中的 INSERT 语句后检测 @@ERROR。@@ERROR 变量的值将决定传给调用程序的返回值，以指示此过程的成功与失败。

USE pubs
GO

-- Create the procedure.
CREATE PROCEDURE add_author
@au_id varchar(11),@au_lname varchar(40),
@au_fname varchar(20),@phone char(12),
@address varchar(40) = NULL,@city varchar(20) = NULL,
@state char(2) = NULL,@zip char(5) = NULL,
@contract bit = NULL
AS

-- Execute the INSERT statement.
INSERT INTO authors
(au_id,  au_lname, au_fname, phone, address,
 city, state, zip, contract) values
(@au_id,@au_lname,@au_fname,@phone,@address,
 @city,@state,@zip,@contract)

-- Test the error value.
IF @@ERROR <> 0
BEGIN
   -- Return 99 to the calling program to indicate failure.
   PRINT "An error occurred loading the new author information"
   RETURN(99)
END
ELSE
BEGIN
   -- Return 0 to the calling program to indicate success.
   PRINT "The new author information has been loaded"
   RETURN(0)
END
GO
C.用 @@ERROR 检测几条语句的成功

下面的示例取决于 INSERT 和 DELETE 语句的成功操作。局部变量在两条语句后均被设置为 @@ERROR 的值，并且用于此操作的共享错误处理例程中。

USE pubs
GO
DECLARE @del_error int, @ins_error int
-- Start a transaction.
BEGIN TRAN

-- Execute the DELETE statement.
DELETE authors
WHERE au_id = '409-56-7088'

-- Set a variable to the error value for
-- the DELETE statement.
SELECT @del_error = @@ERROR

-- Execute the INSERT statement.
INSERT authors
   VALUES('409-56-7008', 'Bennet', 'Abraham', '415 658-9932',
   '6223 Bateman St.', 'Berkeley', 'CA', '94705', 1)
-- Set a variable to the error value for
-- the INSERT statement.
SELECT @ins_error = @@ERROR

-- Test the error values.
IF @del_error = 0 AND @ins_error = 0
BEGIN
   -- Success. Commit the transaction.
   PRINT "The author information has been replaced"
   COMMIT TRAN
END
ELSE
BEGIN
   -- An error occurred. Indicate which operation(s) failed
   -- and roll back the transaction.
   IF @del_error <> 0
      PRINT "An error occurred during execution of the DELETE
      statement."

   IF @ins_error <> 0
      PRINT "An error occurred during execution of the INSERT
      statement."

   ROLLBACK TRAN
END
GO
D. 与 @@ROWCOUNT 一同使用 @@ERROR

下面的示例用 @@ERROR 和 @@ROWCOUNT 验证一条 UPDATE 语句的操作。为任何可能出现的错误而检验 @@ERROR 的值，而用 @@ROWCOUNT 保证更新已成功应用于表中的某行。

USE pubs
GO
CREATE PROCEDURE change_publisher
@title_id tid,
@new_pub_id char(4)
AS

-- Declare variables used in error checking.
DECLARE @error_var int, @rowcount_var int

-- Execute the UPDATE statement.
UPDATE titles SET pub_id = @new_pub_id
WHERE title_id = @title_id

-- Save the @@ERROR and @@ROWCOUNT values in local
-- variables before they are cleared.
SELECT @error_var = @@ERROR, @rowcount_var = @@ROWCOUNT

-- Check for errors. If an invalid @new_pub_id was specified
-- the UPDATE statement returns a foreign-key violation error #547.
IF @error_var <> 0
BEGIN
   IF @error_var = 547
   BEGIN
      PRINT "ERROR: Invalid ID specified for new publisher"
      RETURN(1)
   END
   ELSE
   BEGIN
      PRINT "ERROR: Unhandled error occurred"
      RETURN(2)
   END
END

-- Check the rowcount. @rowcount_var is set to 0
-- if an invalid @title_id was specified.
IF @rowcount_var = 0
BEGIN
   PRINT "Warning: The title_id specified is not valid"
   RETURN(1)
END
ELSE
BEGIN
   PRINT "The book has been updated with the new publisher"
   RETURN(0)
END
GO

请参见

错误处理

@@ROWCOUNT

SET @local_variable

sysmessages

系统函数


@@FETCH_STATUS

返回被 FETCH 语句执行的最后游标的状态，而不是任何当前被连接打开的游标的状态。

返回值 | 描述
0 | FETCH 语句成功。
-1 | FETCH 语句失败或此行不在结果集中。
-2 | 被提取的行不存在。

语法

@@FETCH_STATUS

返回类型

integer

注释

由于 @@FETCH_STATUS 对于在一个连接上的所有游标是全局性的，要小心使用 @@FETCH_STATUS 。在执行一条 FETCH 语句后，必须在对另一游标执行另一 FETCH 语句前测试 @@FETCH_STATUS 。在任何提取操作出现在此连接上前，@@FETCH_STATUS 的值没有定义。

例如，用户从一个游标执行一条 FETCH 语句，然后调用一个存储过程，此存储过程打开并处理另一个游标的结果。当控制从被调用的存储过程返回后，@@FETCH_STATUS 反映的是在存储过程中执行的最后的 FETCH 语句的结果，而不是在存储过程被调用之前的 FETCH 语句的结果。

示例

下面的示例用 @@FETCH_STATUS 控制在一个 WHILE 循环中的游标活动。

DECLARE Employee_Cursor CURSOR FOR
SELECT LastName, FirstName FROM Northwind.dbo.Employees
OPEN Employee_Cursor
FETCH NEXT FROM Employee_Cursor
WHILE @@FETCH_STATUS = 0
BEGIN
   FETCH NEXT FROM Employee_Cursor
END
CLOSE Employee_Cursor
DEALLOCATE Employee_Cursor

请参见

游标函数

FETCH


@@IDENTITY

返回最后插入的标识值。

语法

@@IDENTITY

返回类型

numeric

注释

在一条 INSERT、SELECT INTO 或大容量复制语句完成后，@@IDENTITY 中包含此语句产生的最后的标识值。若此语句没有影响任何有标识列的表，则 @@IDENTITY 返回 NULL。若插入了多个行，则会产生多个标识值，@@IDENTITY 返回最后产生的标识值。如果此语句激发一个或多个执行产生标识值的插入操作的触发器，则语句执行后立即调用 @@IDENTITY 将返回由触发器产生的最后的标识值。若 INSERT 或 SELECT INTO 语句失败或大容量复制失败，或事务被回滚，则 @@IDENTITY 值不会还原为以前的设置。

在返回插入到表的 @@IDENTITY 列的最后一个值方面，@@IDENTITY、SCOPE_IDENTITY 和 IDENT_CURRENT 函数类似。

@@IDENTITY 和 SCOPE_IDENTITY 将返回在当前会话的所有表中生成的最后一个标识值。但是，SCOPE_IDENTITY 只在当前作用域内返回值，而 @@IDENTITY 不限于特定的作用域。

IDENT_CURRENT 不受作用域和会话的限制，而受限于指定的表。IDENT_CURRENT 返回任何会话和任何作用域中为特定表生成的标识值。有关更多信息，请参见 IDENT_CURRENT。

示例

下面的示例向带有标识列的表中插入一行，并用 @@IDENTITY 显示在新行中使用的标识值。

INSERT INTO jobs (job_desc,min_lvl,max_lvl)
VALUES ('Accountant',12,125)
SELECT @@IDENTITY AS 'Identity'

请参见

CREATE TABLE

IDENT_CURRENT

INSERT

SCOPE_IDENTITY

SELECT

系统函数


@@IDLE

返回 Microsoft® SQL Server™ 自上次启动后闲置的时间，单位为毫秒（基于系统计时器的分辨率）。

语法

@@IDLE

返回类型

integer

注释

若要显示包含几个 SQL Server 统计信息的报表，可运行 sp_monitor。

示例

下面的示例显示 SQL Server 自启动到当前时间闲置的毫秒数。

SELECT @@IDLE AS 'Idle ms', GETDATE() AS 'As of'

下面是结果集：

Idle Ms              As of
-----------------    ---------------------------
277593               1998-04-18  16:41:07.160

请参见

@@CPU_BUSY

sp_monitor

@@IO_BUSY

系统统计函数


@@IO_BUSY

返回 Microsoft® SQL Server™ 自上次启动后用于执行输入和输出操作的时间，单位为毫秒（基于系统计时器的分辨率）。

语法

@@IO_BUSY

返回类型

integer

注释

若要显示包含几个 SQL Server 统计信息的报表，可运行 sp_monitor。

示例

下面的示例显示 SQL Server 自启动到目前已用于执行输入/输出操作的毫秒数。

SELECT @@IO_BUSY AS 'IO ms', GETDATE() AS 'As of'

下面是结果集：

IO ms                As of
------------------   -----------------------------
31                   1998-04-18  16:49:49.650

请参见

@@CPU_BUSY

sp_monitor

系统统计函数


@@LANGID

返回当前所使用语言的本地语言标识符(ID)。

语法

@@LANGID

返回类型

smallint

注释

若要查看语言设置信息（包括语言 ID 号），可不带参数运行 sp_helplanguage。

示例

下面的示例将当前会话的语言设置为意大利语 (Italian)，然后用 @@LANGID 返回意大利语的 ID。

SET LANGUAGE 'Italian'
SELECT @@LANGID AS 'Language ID'

下面是结果集：

Language ID
--------------------
6

请参见

配置函数

SET LANGUAGE

sp_helplanguage


@@LANGUAGE

返回当前使用的语言名。

语法

@@LANGUAGE

返回类型

nvarchar

注释

若要查看语言设置信息（包括合法的官方语言名），可不带参数运行 sp_helplanguage。

示例

下面的示例返回当前会话的语言。

SELECT @@LANGUAGE AS 'Language Name'

下面是结果集：

Language Name
-----------------------------
us_english

请参见

配置函数

SET LANGUAGE

sp_helplanguage


@@LOCK_TIMEOUT

返回当前会话的当前锁超时设置，单位为毫秒。

语法

@@LOCK_TIMEOUT

返回类型

integer

注释

SET LOCK_TIMEOUT 允许应用程序设置语句等待阻塞资源的最长时间。当一条语句已等待超过 LOCK_TIMEOUT所设置的时间，则被锁住的语句将自动取消，并给应用程序返回一条错误信息。

在一个连接的开始，@@LOCK_TIMEOUT 返回一个 –1值。

示例

下面的示例显示当一个 LOCK_TIMEOUT 值未被设置时的结果集。

SELECT @@LOCK_TIMEOUT

下面是结果集：

----------------
-1

下面的示例设置 LOCK_TIMEOUT 为 1800 毫秒，然后调用 @@LOCK_TIMEOUT。

SET LOCK_TIMEOUT 1800
SELECT @@LOCK_TIMEOUT

下面是结果集：

------------------------------
1800

请参见

配置函数

自定义锁超时

SET LOCK_TIMEOUT


@@MAX_CONNECTIONS

返回 Microsoft® SQL Server™ 上允许的同时用户连接的最大数。返回的数不必为当前配置的数值。

语法

@@MAX_CONNECTIONS

返回类型

integer

注释

实际允许的用户连接数也依赖于所安装 SQL Server 的版本以及应用程序和硬件的限制。

若要将 SQL Server 重新配置为更少的连接，应使用 sp_configure。

示例

下面的示例假定 SQL Server 尚未被重新配置更少的用户连接。

SELECT @@MAX_CONNECTIONS

下面是结果集：

------------------
32767

请参见

sp_configure

配置函数

user connections 选项


@@MAX_PRECISION

返回 decimal 和 numeric 数据类型所用的精度级别，即该服务器中当前设置的精度。

语法

@@MAX_PRECISION

返回类型

tinyint

注释

默认情况下，最大精度返回 38。

示例
SELECT @@MAX_PRECISION

请参见

配置函数

decimal 和 numeric

精度、小数位数和长度


@@NESTLEVEL

返回当前存储过程执行的嵌套层次（初始值为 0）。

语法

@@NESTLEVEL

返回类型

integer

注释

每当一个存储过程调用另一个存储过程时，嵌套层次即进行递增。超过最大层数 32 时，事务即被终止。

示例

下面的示例创建两个过程：其中一个过程调用另一个过程，每个过程都显示自身的 @@NESTLEVEL 设置值。

CREATE PROCEDURE innerproc as
select @@NESTLEVEL AS 'Inner Level'
GO

CREATE PROCEDURE outerproc as
select @@NESTLEVEL AS 'Outer Level'
EXEC innerproc
GO

EXECUTE outerproc
GO

下面是结果集：

Outer Level
-----------------
1

Inner Level
-----------------
2

请参见

配置函数

创建存储过程

@@TRANCOUNT


@@OPTIONS

返回当前 SET 选项的信息。

语法

@@OPTIONS

返回类型

integer

注释

可以用"sp_configure 用户选项"配置选项统一修改 SET 选项。每个用户有一个 @@OPTIONS 函数代表其配置环境。从第一次登录开始，系统管理员即为所有的用户分配一个默认的配置设置。

可以用 SET 语句更改语言和查询处理选项。

示例

下面的示例设置 NOCOUNT ON 选项，然后检测 @@OPTIONS 的值。NOCOUNT ON 选项可防止将会话中每一条语句所影响的行数消息发回给请求的客户机。@@OPTIONS 的值被设置为 512 (0x0200)，代表 NOCOUNT 选项。下面的示例检测客户端是否启用了 NOCOUNT 选项。例如，它有助于跟踪客户端的性能差异。

SET NOCOUNT ON
IF @@OPTIONS & 512 > 0
   RAISERROR ('Current user has SET NOCOUNT turned on.',1,1)

请参见

配置函数

sp_configure

user options 选项


@@PACK_RECEIVED

返回 Microsoft® SQL Server™ 自上次启动后从网络上读取的输入数据包数目。

语法

@@PACK_RECEIVED

返回类型

integer

注释

若要显示包含几个 SQL Server 统计信息的报表，其中包括发送和接收数据包的信息，可运行 sp_monitor。

示例
SELECT @@PACK_RECEIVED

请参见

@@PACK_SENT

sp_monitor

系统统计函数


@@PACK_SENT

返回 Microsoft® SQL Server™ 自上次启动后写到网络上的输出数据包数目。

语法

@@PACK_SENT

返回类型

integer

注释

若要显示包含几个 SQL Server 统计信息的报表，其中包括发送和接收数据包的信息，可运行 sp_monitor。

示例
SELECT @@PACK_SENT

请参见

@@PACK_RECEIVED

sp_monitor

系统统计函数


@@PACKET_ERRORS

返回自 SQL Server 上次启动后，在 Microsoft® SQL Server™ 连接上发生的网络数据包错误数。

语法

@@PACKET_ERRORS

返回类型

integer

注释

若要显示包含几个 SQL Server 统计信息的报表，包括数据包错误，可运行 sp_monitor。

示例
SELECT @@PACKET_ERRORS

请参见

@@PACK_RECEIVED

@@PACK_SENT

sp_monitor

系统统计函数


@@PROCID

返回当前过程的存储过程标识符 (ID) 。

语法

@@PROCID

返回类型

integer

示例

下面的示例创建了一个过程，在此过程内用 SELECT 显示 @@PROCID 设置。

CREATE PROCEDURE testprocedure AS
SELECT @@PROCID AS 'ProcID'
GO
EXEC testprocedure
GO

请参见

CREATE PROCEDURE

元数据函数


@@REMSERVER

当远程 Microsoft® SQL Server™ 数据库服务器在登录记录中出现时，返回它的名称。

语法

@@REMSERVER

返回类型

nvarchar(256)

注释

@@REMSERVER 使存储过程可以查看它在其上运行的数据库服务器名。

示例

下面的示例创建一个过程，名为 check_server，它返回远程服务器名。

CREATE PROCEDURE check_server
AS
SELECT @@REMSERVER

存储过程创建在本地服务器 SEATTLE1 上。用户登录到远程服务器 LONDON2 上，然后运行 check_server。

exec SEATTLE1...check_server

下面是结果集：

---------------
LONDON2

请参见

配置函数

配置远程服务器


@@ROWCOUNT

返回受上一语句影响的行数。

语法

@@ROWCOUNT

返回类型

integer

注释

任何不返回行的语句将这一变量设置为 0 ，如 IF 语句。

示例

下面的示例执行 UPDATE 语句并用 @@ROWCOUNT 来检测是否有发生更改的行。

UPDATE authors SET au_lname = 'Jones'
WHERE au_id = '999-888-7777'
IF @@ROWCOUNT = 0
   print 'Warning: No rows were updated'

请参见

@@ERROR

系统函数


@@SERVERNAME

返回运行 Microsoft® SQL Server™ 的本地服务器名称。

语法

@@SERVERNAME

返回类型

nvarchar

注释

SQL Server 安装程序在安装时将服务器名设置为计算机名。可通过使用 sp_addserver 然后重新启动 SQL Server 来更改 @@SERVERNAME。不过，通常不需要这种方法。

当安装有多个 SQL Server 实例时，如果本地服务器名自安装后未发生更改，则 @@SERVERNAME 返回以下本地服务器名信息。

实例 | 服务器信息
默认实例 | '服务器名'
命名实例 | '服务器名\实例名'
虚拟服务器 - 默认实例 | '虚拟服务器名'
虚拟服务器 - 命名实例 | '虚拟服务器名\实例名'

尽管 @@SERVERNAME 函数和 SERVERPROPERTY 函数的 SERVERNAME 属性可能返回相似格式的字符串，但信息会有所不同。SERVERNAME 属性会自动报告计算机网络名的更改。

相比之下，@@SERVERNAME 不报告此更改。@@SERVERNAME 报告使用 sp_addserver 或 sp_dropserver 存储过程对本地服务器名所做的更改。

示例
SELECT @@SERVERNAME

请参见

配置函数

SERVERPROPERTY

sp_addserver


@@SERVICENAME

返回 Microsoft® SQL Server™ 正在其下运行的注册表键名。若当前实例为默认实例，则 @@SERVICENAME 返回 MSSQLServer；若当前实例是命名实例，则该函数返回实例名。

语法

@@SERVICENAME

返回类型

nvarchar

注释

SQL Server 作为名为 MSSQLServer 的服务在 Microsoft Windows NT® 上运行。它不在 Windows® 95/98 上作为服务运行，因为该操作系统不支持服务。

示例
SELECT @@SERVICENAME

下面是结果集：

------------------------------
MSSQLServer

请参见

配置函数

SQL Server 服务


@@SPID

返回当前用户进程的服务器进程标识符 (ID)。

语法

@@SPID

返回类型

smallint

注释

@@SPID 可以在 sp_who 输出结果中标识当前用户进程。

示例

下面的示例返回当前用户进程的进程 ID、登录名和用户名。

SELECT @@SPID AS 'ID', SYSTEM_USER AS 'Login Name', USER AS 'User Name'

下面是结果集：

ID     Login Name       User Name
-----  -------------    -----------
11     sa               dbo

请参见

配置函数

sp_lock

sp_who


@@TEXTSIZE

返回 SET 语句 TEXTSIZE 选项的当前值，它指定 SELECT 语句返回的 text 或 image 数据的最大长度，以字节为单位。

语法

@@TEXTSIZE

返回类型

integer

注释

默认大小是 4096 字节。

示例

下面的示例用 SELECT 语句显示用 SET TEXTSIZE 语句改变前后的 @@TEXTSIZE 值。

SELECT @@TEXTSIZE
SET TEXTSIZE 2048
SELECT @@TEXTSIZE

下面是结果集：

------------------------
64512

------------------------
2048

请参见

配置函数

SET TEXTSIZE


@@TIMETICKS

返回一刻度的微秒数。

语法

@@TIMETICKS

返回类型

integer

注释

每一刻度的时间量依赖于计算机。操作系统的一刻度是 31.25 毫秒，或是三十分之一秒。

示例
SELECT @@TIMETICKS

请参见

系统统计函数


@@TOTAL_ERRORS

返回 Microsoft® SQL Server™ 自上次启动后，所遇到的磁盘读/写错误数。

语法

@@TOTAL_ERRORS

返回类型

integer

注释

若要显示包含几个 SQL Server 统计信息的报表，包括错误总数信息，可运行 sp_monitor。

示例

下面的示例显示了 SQL Server 到当前日期和时间为止所遇到的错误数。

SELECT @@TOTAL_ERRORS AS 'Errors', GETDATE() AS 'As of'

下面是结果集：

Errors         As of
-------        -------------------------------
0              1998-04-21  22:07:30.013

请参见

sp_monitor

系统统计函数


@@TOTAL_READ

返回 Microsoft® SQL Server™ 自上次启动后读取磁盘（不是读取高速缓存）的次数。

语法

@@TOTAL_READ

返回类型

integer

注释

若要显示包含几个 SQL Server 统计信息的报表，包括读写活动信息，可运行 sp_monitor。

示例

下面的示例显示了到当前日期和时间为止的总的磁盘读写次数。

SELECT @@TOTAL_READ AS 'Reads', @@TOTAL_WRITE AS 'Writes', GETDATE() AS 'As of'

下面是结果集：

Reads       Writes        As of
---------   -----------   ------------------------------
978         124           1998-04-21 22:14:22.37

请参见

sp_monitor

系统统计函数

@@TOTAL_WRITE


@@TOTAL_WRITE

返回 Microsoft® SQL Server™ 自上次启动后写入磁盘的次数。

语法

@@TOTAL_WRITE

返回类型

integer

注释

若要显示包含几个 SQL Server 统计信息的报表，包括读写活动信息，可运行 sp_monitor。

示例

下面的示例显示了到当前日期和时间为止总的磁盘读写次数。

SELECT @@TOTAL_READ AS 'Reads', @@TOTAL_WRITE AS 'Writes', GETDATE() AS 'As of'

下面是结果集：

Reads       Writes        As of
---------   -----------   ------------------------------
978         124           1998-04-21 22:14:22.37

请参见

sp_monitor

系统统计函数

@@TOTAL_READ


@@TRANCOUNT

返回当前连接的活动事务数。

语法

@@TRANCOUNT

返回类型

integer

注释

BEGIN TRANSACTION 语句使 @@TRANCOUNT 递增 1。ROLLBACK TRANSACTION 将 @@TRANCOUNT 递减为 0，但 ROLLBACK TRANSACTION savepoint_name 语句并不影响 @@TRANCOUNT 值。COMMIT TRANSACTION 或 COMMIT WORK 将 @@TRANCOUNT 递减 1。

示例

下面的示例用 @@TRANCOUNT 测试应该提交的打开事务。

BEGIN TRANSACTION
UPDATE authors SET au_lname = upper(au_lname)
WHERE au_lname = 'White'
IF @@ROWCOUNT = 2
   COMMIT TRAN

IF @@TRANCOUNT > 0
BEGIN
   PRINT 'A transaction needs to be rolled back'
   ROLLBACK TRAN
END

请参见

BEGIN TRANSACTION

COMMIT TRANSACTION

ROLLBACK TRANSACTION

系统函数


@@VERSION

返回 Microsoft® SQL Server™ 当前安装的日期、版本和处理器类型。

语法

@@VERSION

返回类型

nvarchar

注释

@@VERSION 返回的信息与 xp_msver 存储过程返回的产品名、版本、平台和文件数据相似，但 xp_msver 存储过程提供更详细的信息。

示例

下面的示例返回当前安装的日期、版本和处理器类型。

SELECT @@VERSION

请参见

配置函数

xp_msver


[ ]（通配符 -- 需匹配的字符）

 Transact-SQL 参考

[ ]（通配符 — 需匹配的字符）

匹配指定范围内或者属于方括号所指定的集合中的任意单个字符。

请参见

LIKE


[^]（通配符字符 -- 无需匹配的字符）

 Transact-SQL 参考

[^]（通配符字符 — 无需匹配的字符）

匹配不处于指定范围内或者不属于方括号内指定集合中的任意单个字符。

请参见

LIKE


^（按位互斥 OR）

在 Transact-SQL 语句中，将两个给定的整型值转换为二进制表达式，对其执行按位互斥 OR 运算。

语法

expression ^ expression

参数

expression

是任何有效的 Microsoft® SQL Server™ 表达式（表达式必须由整数数据类型分类中的任何数据类型组成，或者由 binary 或 varbinary 数据类型组成）。expression 是一个经过处理并转换为二进制数字以便进行位运算的整数。

说明 在位运算中，只有一个 expression 可以是 binary 或 varbinary 数据类型。

结果类型

如果输入值为 int，则返回 int；如果输入值为 smallint，则返回 smallint；或者如果输入值为 tinyint，则返回 tinyint。

注释

通过从两个表达式取对应的位，位运算符 ^ 在两个表达式之间执行按位逻辑异或运算。如果在输入表达式的当前正在被解析的位中，某个位（但不是两个位）的值为 1，则结果中位的值被设置为 1；如果两个位的值都为 0 或者都为1，那么结果中该位的值被清除为 0。

位运算符 ^ 只可以用在具有整型数据类型分类的列上。

如果左右表达式的整型数据类型不同（例如，左边 expression 的数据类型是 smallint，右边 expression 的数据类型是 int），那么较小的数据类型的参数将转换为较大的数据类型。在该示例中，数据类型为 smallint 的 expression 被转换为 int 数据类型。

示例

下面的示例创建一个具有 int 数据类型的表以显示原始的值，并将该表放入一行中。

USE master
GO
IF EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES
      WHERE TABLE_NAME = 'bitwise')
   DROP TABLE bitwise
GO
CREATE TABLE bitwise
(
 a_int_value int NOT NULL,
b_int_value int NOT NULL
)
GO
INSERT bitwise VALUES (170, 75)
GO

下面的查询在 a_int_value 列和 b_int_value 列上执行按位互斥 OR 运算。

USE MASTER
GO
SELECT a_int_value ^ b_int_value
FROM bitwise
GO

下面是结果集：

-----------
225

(1 row(s) affected)

170（a_int_value 或 A，如下所示）的二进制表示为 0000 0000 1010 1010。75（b_int_value 或 B，如下所示）的二进制表示为 0000 0000 0100 1011。在这两个值之间执行按位互斥 OR 运算所产生的二进制结果是 0000 0000 1110 0001，即十进制数 225。

(A ^ B)
         0000 0000 1010 1010
         0000 0000 0100 1011
         -------------------
         0000 0000 1110 0001

请参见

表达式

运算符（位运算符）


_（通配符 -- 匹配一个字符）

 Transact-SQL 参考

_（通配符 — 匹配一个字符）

匹配任意单个字符，并且可以被用作前缀或后缀。

请参见

LIKE


|（按位 OR）

在 Transact-SQL 语句中，将两个给定的整型值转换为二进制表达式，对其执行按位逻辑或运算。

语法

expression | expression

参数

expression

是任何有效的 Microsoft® SQL Server™ 表达式（表达式必须由整数数据类型分类中的任何数据类型组成。expression 是一个经过处理并转换为二进制数字以便进行位运算的整数。

结果类型

如果输入值为 int，则返回 int；如果输入值为 smallint，则返回 smallint；或者如果输入值为 tinyint，则返回 tinyint。

注释

通过从两个表达式取对应的位，位运算符 | 在两个表达式之间执行按位逻辑或运算。如果在输入表达式中有一个位为 1 或者两个位均为 1（正在被解析的当前位），那么结果中的位被设置为 1；如果输入表达式中的两个位都不为 1，则结果中该位的值被设置为 0。

位运算符 | 要求有两个表达式，并且只可以用在具有整型数据类型分类的表达式上。

如果左右表达式的整型数据类型不同（例如，左边 expression 的数据类型是 smallint，右边 expression 的数据类型是 int），那么将较小的数据类型的参数转换为较大的数据类型。在该示例中，数据类型为 smallint 的 expression 被转换为 int 数据类型。

示例

下面的示例创建一个具有 int 数据类型的表以显示原始的值，并将该表放入一行中。

USE master
GO
IF EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES
      WHERE TABLE_NAME = 'bitwise')
   DROP TABLE bitwise
GO
CREATE TABLE bitwise
(
 a_int_value int NOT NULL,
b_int_value int NOT NULL
)
GO
INSERT bitwise VALUES (170, 75)
GO

下面的查询在 a_int_value 列和 b_int_value 列上执行按位 OR 运算。

USE MASTER
GO
SELECT a_int_value | b_int_value
FROM bitwise
GO

下面是结果集：

-----------
235

(1 row(s) affected)

170（a_int_value 或 A，如下所示）的二进制表示为 0000 0000 1010 1010。75（b_int_value 或 B，如下所示）的二进制表示为 0000 0000 0100 1011。在这两个值之间执行按位 OR 运算所产生的二进制结果是 0000 0000 1110 1011，即十进制数 235。

(A | B)
         0000 0000 1010 1010
         0000 0000 0100 1011
         -------------------
         0000 0000 1110 1011

请参见

表达式

运算符（位运算符）


~（按位 NOT）

在 Transact-SQL 语句中，将某个给定的整型值转换为二进制表达式，对其执行按位逻辑非运算。

语法

~ expression

参数

expression

是任何有效的 Microsoft® SQL Server™ 表达式（表达式必须由整数数据类型分类中的任何数据类型组成，或者由 binary 或 varbinary 数据类型组成）。expression 是一个经过处理并转换为二进制数字以便进行位运算的整数。

结果类型

如果输入值为 int，则返回 int；如果输入值为 smallint，则返回 smallint；如果输入值为 tinyint，则返回 tinyint；或者如果输入值为 bit，则返回 bit。

注释

通过从两个表达式取对应的位，位运算符 ~ 对 expression 执行按位逻辑非运算。如果 expression 中某个位（正在被解析的当前位）的值为 0，则结果中该位的值被设置为 1；否则，结果中该位的值将被清除为 0。

位运算符 ~ 只可以用在整数类型分类的列上。

重要 每当执行任意类型的位运算时，位运算中所使用的表达式的存储长度是非常重要的。建议在存储值时，使用相同的字节数。例如，将十进制数 5 存储为 tinyint、smallint 或 int 数据类型时，所生成的值将用不同的字节数存储。tinyint 用 1 个字节存储数据，smallint 用 2 个字节存储数据，int 用 4 个字节存储数据。因此，与直接进行二进制或十六进制转换相比，在一个 int 数据类型的十进制数上执行位运算会产生不同的结果，当使用 ~（按位 NOT）运算符时，尤其如此。按位 NOT 运算可以对长度较小的变量执行操作，但是当该变量转换为较长的数据类型时，则高 8 位的值就有可能与期望的值不同。建议先将数据类型较小的变量转换为较大的数据类型，然后对所得的结果执行按位 NOT 运算。

示例

下面的示例创建一个具有 int 数据类型的表以显示值，并将该表放入一行中。

USE master
GO
IF EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES
      WHERE TABLE_NAME = 'bitwise')
   DROP TABLE bitwise
GO
CREATE TABLE bitwise
(
 a_int_value tinyint NOT NULL,
b_int_value tinyint NOT NULL
)
GO
INSERT bitwise VALUES (170, 75)
GO

下面的查询在 a_int_value 列和 b_int_value 列上执行按位 NOT 运算。

USE MASTER
GO
SELECT ~ a_int_value, ~ b_int_value
FROM bitwise

下面是结果集：

--- ---
85  180

(1 row(s) affected)

170（a_int_value 或 A，如下所示）的二进制表示为 0000 0000 1010 1010。在该值上执行按位 NOT 运算所产生的二进制结果是 0000 0000 0101 0101，即十进制数 85。

 (~A)
         0000 0000 1010 1010
         -------------------
         0000 0000 0101 0101

请参见

表达式

运算符（位运算符）


+（加）

两个数相加。这个加法算术运算符也可以将一个以天为单位的数字加到日期中。

语法

expression + expression

参数

expression

是数字分类中任何数据类型（bit 数据类型除外）的任何有效 Microsoft® SQL Server™ 表达式。

结果类型

返回优先级较高的参数的数据类型。有关更多信息，请参见数据类型的优先顺序。

示例
A. 使用加法运算符计算客户可订购的总单元数

下面的示例将 Products 表中当前库存产品的数量和当前已定购的所有产品的单元数量相加。

USE Northwind
GO
SELECT ProductName, UnitsInStock + UnitsOnOrder
FROM Products
ORDER BY ProductName ASC
GO
B. 使用加法运算符将天数加到日期和时间值中

下面的示例将若干天数加到 datetime 日期上。

USE master
GO
SET NOCOUNT ON
DECLARE @startdate datetime, @adddays int
SET @startdate = '1/10/1900 12:00 AM'
SET @adddays = 5
SET NOCOUNT OFF
SELECT @startdate + 1.25 AS 'Start Date',
   @startdate + @adddays AS 'Add Date'

下面是结果集：

Start Date                  Add Date
--------------------------- ---------------------------
Jan 11 1900  6:00AM         Jan 15 1900 12:00AM

(1 row(s) affected)
C. 将字符和整型数据类型相加

本示例通过将字符数据类型转换为 int，将 int 数据类型值与字符值相加。如果在 char 字符串中有无效的字符，则 SQL Server 将返回错误。

DECLARE @addvalue int
SET @addvalue = 15
SELECT '125127' + @addvalue

下面是结果集：

-----------------------
125142

(1 row(s) affected)

请参见

CAST 和 CONVERT

数据类型转换

数据类型

表达式

函数

运算符

SELECT


+（正）

一元运算符，返回数字表达式的正值（一元运算符）。

语法

+ numeric_expression

参数

numeric_expression

是数字数据类型分类中任何数据类型（datetime 或 smalldatetime 数据类型除外）的任何有效 Microsoft® SQL Server™ 表达式。

结果类型

除了无符号的 tinyint 表达式被提升为 smallint 结果之外，返回 numeric_expression 的数据类型。

示例

该示例将变量设置为正值。

DECLARE @MyNumber decimal(10,2)
SET @MyNumber = +123.45

请参见

数据类型

表达式

运算符


+（字符串串联）

字符串表达式中的运算符，将两个或多个字符或二进制字符串、列或字符串和列名的组合串联到一个表达式中（字符串运算符）。

语法

expression + expression

参数

expression

是字符和二进制数据类型分类中任何数据类型（image、ntext 或 text 数据类型除外）的任何有效 Microsoft® SQL Server™ 表达式。两个表达式都必须具有相同的数据类型，或者其中的一个表达式必须能够隐式地转换为具有另一种数据类型的表达式。

在二进制字符串连同任何字符串与二进制字符串之间进行串联时，必须使用字符数据的显式转换。下面的示例显示了对于二进制串联，何时必须使用 CONVERT（或 CAST），何时不需要使用 CONVERT（或 CAST）。

DECLARE @mybin1 binary(5), @mybin2 binary(5)
SET @mybin1 = 0xFF
SET @mybin2 = 0xA5
-- No CONVERT or CAST function is necessary because this example
-- concatenates two binary strings.
SELECT @mybin1 + @mybin2
-- A CONVERT or CAST function is necessary because this example
-- concatenates two binary strings plus a space.
SELECT CONVERT(varchar(5), @mybin1) + ' '
    + CONVERT(varchar(5), @mybin2)
-- Here is the same conversion using CAST
SELECT CAST(@mybin1 AS varchar(5)) + ' '
    + CAST(@mybin2 AS varchar(5))
结果类型

返回优先级最高的参数的数据类型。有关更多信息，请参见数据类型的优先顺序。

注释

当串联空值时，由 sp_dboption 的 concat null yields null 设置或者 SET CONCAT_NULL_YIELDS_NULL 决定某个 expression 为 NULL 时的行为。根据 concat null yields null 或者将 SET CONCAT_NULL_YIELDS_NULL 启用为 ON，'string' + NULL 将返回 NULL。如果禁用了 concat null yields null 或 SET CONCAT_NULL_YIELDS_NULL，则结果为 'string'。

示例
A. 使用字符串串联

下面的示例从多个字符列中创建单个列（在列标题 Name 下），其中含有作者的姓氏，后面跟一个逗号和一个空格，然后是作者的名字。结果集是按照作者的姓氏，然后按照作者名字以字母递增顺序排列的。

USE pubs
SELECT (au_lname + ', ' + au_fname) AS Name
FROM authors
ORDER BY au_lname ASC, au_fname ASC

下面是结果集：

Name
--------------------------------------------------------------
Bennet, Abraham
Blotchet-Halls, Reginald
Carson, Cheryl
DeFrance, Michel
del Castillo, Innes
Dull, Ann
Green, Marjorie
Greene, Morningstar
Gringlesby, Burt
Hunter, Sheryl
Karsen, Livia
Locksley, Charlene
MacFeather, Stearns
McBadden, Heather
O'Leary, Michael
Panteley, Sylvia
Ringer, Albert
Ringer, Anne
Smith, Meander
Straight, Dean
Stringer, Dirk
White, Johnson
Yokomoto, Akiko

(23 row(s) affected)
B. 组合数字和日期数据类型

该示例使用 CAST 函数将 numeric 和 date 数据类型串联起来。

USE pubs
SELECT 'The order date is ' + CAST(ord_date AS varchar(30))
FROM sales
WHERE ord_num = 'A2976'
ORDER BY ord_num

下面是结果集：

------------------------------------------------
The order date is May 24 1993 12:00AM

(1 row(s) affected)
C. 使用多个字符串串联

下面的示例串联多个字符串，形成一个长字符串。若要显示居住在 California 州的每个作者的姓氏和名字的首字母，则应该在姓氏后面设置一个逗号，并在名字的首字母后放置一个句点。

USE pubs
SELECT (au_lname + ',' + SPACE(1) + SUBSTRING(au_fname, 1, 1) + '.') AS Name
FROM authors
WHERE state = 'CA'
ORDER BY au_lname ASC, au_fname ASC

下面是结果集：

Name
--------------------------------------------
Bennet, A.
Carson, C.
Dull, A.
Green, M.
Gringlesby, B.
Hunter, S.
Karsen, L.
Locksley, C.
MacFeather, S.
McBadden, H.
O'Leary, M.
Straight, D.
Stringer, D.
White, J.
Yokomoto, A.

(15 row(s) affected)

请参见

CAST 和 CONVERT

数据类型转换

数据类型

表达式

函数

运算符

SELECT

SET

设置数据库选项

sp_dboption


=（等于）

比较两个表达式（比较运算符）。当比较非空表达式时，如果两个操作数相等，则结果为 TRUE；否则结果为 FALSE。如果两个操作数中有一个或者两个都为 NULL，并且 SET ANSI_NULLS 被设置为 ON，则结果为 NULL。如果 SET ANSI_NULLS 被设置为 OFF，则当一个操作数为 NULL 时结果为 FALSE，当两个操作数都为 NULL 时结果为 TRUE。

语法

expression = expression

参数

expression

是任何有效的 Microsoft® SQL Server™ 表达式。两个表达式都必须有可隐式转换的数据类型。转换取决于数据类型优先级。有关更多信息，请参见数据类型的优先顺序。

结果类型

Boolean

请参见

数据类型

表达式

运算符（比较运算符）


ABS

返回给定数字表达式的绝对值。

语法

ABS ( numeric_expression )

参数

numeric_expression

精确数字或近似数字数据类型类别的表达式（bit 数据类型除外）。

返回类型

返回与 numeric_expression 相同的类型。

示例

下例显示了 ABS 函数对三个不同数字的效果。

SELECT ABS(-1.0), ABS(0.0), ABS(1.0)

下面是结果集：

---- ---- ----
1.0  .0   1.0

ABS 函数可能产生溢出错误，例如：

SELECT ABS(convert(int, -2147483648))

下面是错误信息：

Server: Msg 8115, Level 16, State 2
Arithmetic overflow error converting expression to type int.

请参见

CAST 和 CONVERT

数据类型

数学函数


ACOS

返回以弧度表示的角度值，该角度值的余弦为给定的 float 表达式；本函数亦称反余弦。

语法

ACOS ( float_expression )

参数

float_expression

是 float 或 real 类型的表达式，其取值范围从 -1 到 1。对超过此范围的参数值，函数将返回 NULL 并且报告域错误。

返回类型

float

示例

下例返回给定角的 ACOS 值。

SET NOCOUNT OFF
DECLARE @angle float
SET @angle = -1
SELECT 'The ACOS of the angle is: ' + CONVERT(varchar, ACOS(@angle))

下面是结果集：

---------------------------------
The ACOS of the angle is: 3.14159

(1 row(s) affected)

下例将参数 @angle 设置为超出有效范围的值。

SET NOCOUNT OFF
DECLARE @angle float
SET @angle = 1.01
SELECT 'The ACOS of the angle is: ' + CONVERT(varchar, ACOS(@angle))

下面是结果集：

--------------------------------------------------------
NULL

(1 row(s) affected)

A domain error occurred.

请参见

数学函数


ALL

用标量值与单列集中的值进行比较。

语法

scalar_expression { = | <> | != | > | >= | !>| < | <= | !< } ALL ( subquery )

参数

scalar_expression

是任何有效的 Microsoft® SQL Server™ 表达式。

{ = | <> | != | > | >= | !> | < | <= | !< }

是比较运算符。

subquery

是返回单列结果集的子查询。返回列的数据类型必须与 scalar_expression 的数据类型相同。

是受限的 SELECT 语句（不允许使用 ORDER BY 子句、COMPUTE 子句和 INTO 关键字）。

返回类型

Boolean

结果值

如果所有给定的比较对（scalar_expression, x）均为 TRUE，其中 x 是单列集中的值，则返回 TRUE；否则返回 FALSE。

请参见

CASE

表达式

函数

LIKE

运算符（逻辑运算符）

SELECT（子查询）

WHERE


ALTER DATABASE

在数据库中添加或删除文件和文件组。也可用于更改文件和文件组的属性，例如更改文件的名称和大小。ALTER DATABASE 提供了更改数据库名称、文件组名称以及数据文件和日志文件的逻辑名称的能力。

ALTER DATABASE 支持数据库选项的设置。在早期版本的 Microsoft® SQL Server™ 中，这些选项可以通过 sp_dboption 存储过程来设置。在此次发布的版本中，SQL Server 继续支持 sp_dboption存储过程，但在未来版本中可能不再支持。可使用 DATABASEPROPERTYEX 函数检索数据库选项的当前设置。

语法

ALTER DATABASE database
{ ADD FILE < filespec > [ ,...n ] [ TO FILEGROUP filegroup_name ]
| ADD LOG FILE < filespec > [ ,...n ]
| REMOVE FILE logical_file_name
| ADD FILEGROUP filegroup_name
| REMOVE FILEGROUP filegroup_name
| MODIFY FILE < filespec >
| MODIFY NAME = new_dbname
| MODIFY FILEGROUP filegroup_name {filegroup_property | NAME = new_filegroup_name }
| SET < optionspec > [ ,...n ] [ WITH < termination > ]
| COLLATE < collation_name >
}

< filespec > ::=

( NAME = logical_file_name
 [ , NEWNAME = new_logical_name ]
[ , FILENAME = 'os_file_name' ]
[ , SIZE = size ]
[ , MAXSIZE = { max_size | UNLIMITED } ]
[ , FILEGROWTH = growth_increment ] )

< optionspec > ::=

<state_option>
| < cursor_option >
| < auto_option >
| < sql_option >
| < recovery_option >

< state_option > ::=
{ SINGLE_USER | RESTRICTED_USER | MULTI_USER }
        | { OFFLINE | ONLINE }
| { READ_ONLY | READ_WRITE }

< termination > ::=
ROLLBACK AFTER integer [ SECONDS ]
| ROLLBACK IMMEDIATE
| NO_WAIT

    < cursor_option > ::=
CURSOR_CLOSE_ON_COMMIT { ON | OFF }
| CURSOR_DEFAULT { LOCAL | GLOBAL }

    < auto_option > ::=
AUTO_CLOSE { ON | OFF }
        | AUTO_CREATE_STATISTICS { ON | OFF }
        | AUTO_SHRINK { ON | OFF }
        | AUTO_UPDATE_STATISTICS { ON | OFF }

    < sql_option > ::=
ANSI_NULL_DEFAULT { ON | OFF }
| ANSI_NULLS { ON | OFF }
| ANSI_PADDING { ON | OFF }
| ANSI_WARNINGS { ON | OFF }
| ARITHABORT { ON | OFF }
| CONCAT_NULL_YIELDS_NULL { ON | OFF }
| NUMERIC_ROUNDABORT { ON | OFF }
| QUOTED_IDENTIFIER { ON | OFF }
| RECURSIVE_TRIGGERS { ON | OFF }

< recovery_option > ::=
RECOVERY { FULL | BULK_LOGGED | SIMPLE }
| TORN_PAGE_DETECTION { ON | OFF }

参数

database

是要更改的数据库的名称。

ADD FILE

指定要添加文件。

TO FILEGROUP

指定要将指定文件添加到的文件组。

filegroup_name

是要添加指定文件的文件组名称。

ADD LOG FILE

指定要将日志文件添加到指定的数据库。

REMOVE FILE

从数据库系统表中删除文件描述并删除物理文件。只有在文件为空时才能删除。

ADD FILEGROUP

指定要添加文件组。

filegroup_name

是要添加或除去的文件组名称。

REMOVE FILEGROUP

从数据库中删除文件组并删除该文件组中的所有文件。只有在文件组为空时才能删除。

MODIFY FILE

指定要更改给定的文件，更改选项包括 FILENAME、SIZE、FILEGROWTH 和 MAXSIZE。一次只能更改这些属性中的一种。必须在 <filespec> 中指定 NAME，以标识要更改的文件。如果指定了 SIZE，那么新大小必须比文件当前大小要大。只能为 tempdb 数据库中的文件指定 FILENAME，而且新名称只有在 Microsoft SQL Server 重新启动后才能生效。

若要更改数据文件或日志文件的逻辑名称，应在 NAME 选项中指定要改名的逻辑文件名称，并在 NEWNAME 选项中指定文件的新逻辑名称。

示例如下：

MODIFY FILE (NAME = logical_file_name, NEWNAME = new_logical_name...)。

可同时运行几个 ALTER DATABASE database MODIFY FILE 语句以实现多个修改文件操作时性能最优。

MODIFY NAME = new_dbname

重命名数据库。

MODIFY FILEGROUP filegroup_name { filegroup_property | NAME = new_filegroup_name }

指定要修改的文件组和所需的改动。

如果指定 filegroup_name 和 NAME = new_filegroup_name，则将此文件组的名称改为 new_filegroup_name。

如果指定 filegroup_name 和 filegroup_property，则表示给定文件组属性将应用于此文件组。filegroup_property 的值有：

READONLY
指定文件组为只读。不允许更新其中的对象。主文件组不能设置为只读。只有具有排它数据库访问权限的用户才能将文件组标记为只读。
READWRITE
逆转 READONLY 属性。允许更新文件组中的对象。只有具有排它数据库访问权限的用户才能将文件组标记为读/写。
DEFAULT
将文件组指定为默认数据库文件组。只能有一个数据库文件组是默认的。CREATE DATABASE 语句将主文件组设置为初始的默认文件组。如果在 CREATE TABLE、ALTER TABLE 或者 CREATE INDEX 语句中没有指定文件组，则新表及索引将在默认文件组—中创建。

WITH <termination>

指定当数据库从一种状态转换到另一种状态时，何时回滚未完成的事务。只能指定一条 termination 子句，而且该子句应跟在 SET 子句后面。

ROLLBACK AFTER integer [SECONDS] | ROLLBACK IMMEDIATE
设定是在指定秒数之后回滚还是立即回滚。如果省略了 termination 子句，那么将允许事务自主提交或回滚。
NO_WAIT
指定如果请求的数据库语句或选项更改只有等待事务自主提交或回滚才能立即完成，该请求将失败。

COLLATE < collation_name >

指定数据库的排序规则。排序规则名称既可以是 Windows 排序规则名称，也可以是 SQL 排序规则名称。如果没有指定排序规则，则将 SQL Server 实例的默认排序规则指派为数据库的排序规则。

有关 Windows 和 SQL 排序规则名称的更多信息，请参见 COLLATE。

<filespec>

控制文件属性。

NAME
指定文件的逻辑名称。
logical_file_name
是在 Microsoft SQL Server 中引用文件时所用的名称。该名称在数据库中必须唯一，并应遵循标识符规则。该名称可以是字符或 Unicode 常量、常规标识符或定界标识符。有关更多信息，请参见使用标识符。
FILENAME
指定操作系统中的文件名。当和 MODIFY FILE一起使用时，只能对 tempdb 数据库中的文件指定 FILENAME。新 tempdb 文件名只有在 SQL Server 停止并重新启动后才能生效。
'os_file_name'
由操作系统使用的文件的路径和文件名。该文件必须驻留在安装 SQL Server 的服务器上。数据文件和日志文件不应置于压缩的文件系统中。

如果文件位于原始分区上，那么 os_file_name 必须仅指定该原始分区的驱动器字母。每个原始分区上只能存放一个文件。原始分区上的文件不会自动增长；因此，os_file_name 指定原始分区时，不需要指定 MAXSIZE 和 FILEGROWTH 参数。

SIZE
指定文件大小。
size
是文件的大小。后缀 KB、MB、GB 和 TB 可用于指定千字节、兆字节、千兆字节或兆兆字节。默认值为 MB。指定一个整数，不要包含小数位。size 的最小值是 512 KB，如果 size 未指定，默认值是 1 MB。当随 ADD FILE 一起指定时，size 是文件的初始大小。当随 MODIFY FILE 一起指定时，size 是文件的新大小，而且必须大于文件的当前大小。
MAXSIZE
指定最大的文件大小。
max_size
是最大的文件大小。后缀 KB、MB、GB 和 TB 可用于指定千字节、兆字节、千兆字节或兆兆字节。默认值为 MB。指定一个整数，不要包含小数位。如果没有指定 max_size，那么文件大小将一直增长，直至磁盘填满为止。当磁盘即将填满时，Microsoft Windows NT® 应用程序日志将向管理员发出警告。
UNLIMITED
指定文件大小可一直增加直至磁盘已满。
FILEGROWTH
指定文件增长的增量。
growth_increment
每次需要新的空间时为文件添加的空间大小。值为 0 表示不增长。该值可按 MB、KB 或 % 的形式指定。指定一个整数，不要包含小数位。如果指定了 %，那么文件增量为文件发生增长时文件大小的指定百分比。如果未在数量后面指定 MB、KB 或 %，则默认值为 MB。如果 FILEGROWTH 未指定，默认值为 10%，且最小值为 64 KB。指定的大小舍入为最接近的 64 KB 的倍数。

<state_option>

控制用户对数据库的访问，数据库是否处于联机状态，以及是否允许写操作。

SINGLE_USER | RESTRICTED_USER | MULTI_USER
控制哪些用户可以访问数据库。如果指定为 SINGLE_USER，那么同一时间只能有一个用户访问数据库。如果指定为 RESTRICTED_USER，那么只有 db_owner、dbcreator 或 sysadmin 角色的成员可以使用数据库。MULTI_USER 使数据库返回到正常操作状态。
OFFLINE | ONLINE
控制数据库是联机还是脱机。
READ_ONLY | READ_WRITE
指定数据库是否处于只读模式。在只读模式下，用户可以从数据库中读取数据，但不能修改数据。当指定 READ_ONLY 时，数据库不能处于使用状态。master 数据库是一个例外，当该数据库设置为 READ_ONLY 时，只有系统管理员才能使用该数据库。READ_WRITE 使数据库返回到读写操作状态。

<cursor_option>

控制游标选项。

CURSOR_CLOSE_ON_COMMIT ON | OFF
如果指定为 ON，在事务提交或回滚时所有打开的游标都将关闭。如果指定为 OFF，那么在事务提交时打开的游标仍保持打开；而回滚事务时关闭所有除定义为 INSENSITIVE 或 STATIC 之外的游标。
CURSOR_DEFAULTLOCAL | GLOBAL
控制游标作用域默认为 LOCAL 还是 GLOBAL。

<auto_option>

控制自动选项。

AUTO_CLOSE ON | OFF
如果指定为 ON，那么最后一个用户退出后，数据库将干净地关闭，其占用的资源将释放。如果指定为 OFF，那么最后一个用户退出后数据库仍保持打开。
AUTO_CREATE_STATISTICS ON | OFF
如果指定为 ON，那么所有优化查询需要但缺少的统计信息都会在查询优化时自动生成。
AUTO_SHRINK ON | OFF
如果指定为 ON，数据库文件将定期自动收缩。
AUTO_UPDATE_STATISTICS ON | OFF
如果指定为 ON，所有查询优化所需的过时的统计信息在都将在优化时自动重建。如果指定为 OFF，统计信息必须手工更新。

<sql_option>

控制 ANSI 遵从性选项。

ANSI_NULL_DEFAULT ON | OFF
如果指定为 ON，CREATE TABLE 在确定列是否允许空值时遵从 SQL-92 规则。
ANSI_NULLS ON | OFF
如果指定为 ON，所有与空值的比较运算结果为 UNKNOWN。如果指定为 OFF，非 UNICODE 值与空值的比较运算在两者均为 NULL 时结果为 TRUE。
ANSI_PADDING ON | OFF
如果指定为 ON，在比较或插入前，字符串将填充为同一长度。如果指定为 OFF，字符串将不填充。
ANSI_WARNINGS ON | OFF
如果指定为 ON，当出现诸如被零除的情况时将产生错误或警告。
ARITHABORT ON | OFF
如果指定为 ON，在执行查询时如果发生溢出或被零除，该查询将终止。
CONCAT_NULL_YIELDS_NULL ON | OFF
如果指定为 ON，当串联操作的两个操作数中任意一个为 NULL 时，结果也为 NULL。如果指定为 OFF，空值将按空字符串对待。默认设置为 OFF。
QUOTED_IDENTIFIER ON | OFF
如果指定为 ON，双引号将可用于包含定界标识符。
NUMERIC_ROUNDABORT ON | OFF
如果指定为 ON，当表达式中出现精度损失时将产生错误。
RECURSIVE_TRIGGERS ON | OFF
如果指定为 ON，将允许递归激发触发器。RECURSIVE_TRIGGERS OFF（默认值）只禁止直接递归。若要也禁用间接递归，请使用 sp_configure 将 nested triggers 服务器选项设置为 0。

<recovery_options>

控制数据库恢复选项。

RECOVERY FULL | BULK_LOGGED | SIMPLE
如果指定为 FULL，系统将对介质错误提供完全保护。如果数据文件损坏，介质恢复可以还原所有已提交的事务。

如果指定为 BULK_LOGGED，将在介质错误保护程度与某些大规模或大容量操作的最优性能及日志存储空间最少占用量之间进行权衡。这些操作包括 SELECT INTO、大容量装载操作（bcp 和 BULK INSERT）、CREATE INDEX 以及文本和图象操作（WRITETEXT 和 UPDATETEXT）。

在大容量日志记录恢复模型下，对整个类只做最少的日志记录，并且无法逐个操作地控制日志记录行为。

如果指定为 SIMPLE，系统将提供占用日志空间最小的备份策略。服务器故障恢复不再需要的日志空间可被自动重用。

重要 简单恢复模型比其它两种模型更容易管理，但数据文件损坏时造成数据丢失的可能性更大。最近的数据库备份或差异数据库备份之后的更改都将丢失，必须手工重新输入。

默认恢复模型由 model 数据库的恢复模型确定。若要更改新数据库的默认值，请用 ALTER DATABASE 设置 model 数据库的恢复选项。

TORN_PAGE_DETECTION ON | OFF
如果指定为 ON，将可以检测到未完成的页。默认设置为 ON。
注释

若要删除数据库，请使用 DROP DATABASE 语句。若要更改数据库名称，请使用 sp_renamedb。有关减小数据库大小的更多信息，请参见 DBCC SHRINKDATABASE。

在对数据库应用不同的或新的排序规则时，应确保符合以下条件：

  1. 您是当前数据库的唯一用户。

  2. 没有依赖数据库排序规则的架构绑定对象。

    如果数据库中存在以下依赖数据库排序规则的对象，则 ALTER DATABASE database COLLATE 语句将失败。SQL Server 将针对每一个阻塞 ALTER 操作的对象返回一个错误信息：

    • 通过 SCHEMABINDING 创建的用户定义函数和视图。

    • 计算列。

    • CHECK 约束。

    • 表值函数返回包含字符列的表，这些列继承了默认的数据库排序规则。
  3. 改变数据库的排序规则不会在任何数据对象的系统名称中产生重复名称。

    如果改变排序规则后出现重复的名称，则下列命名空间可能导致改变数据库排序规则的操作失败：

    • 对象名（如过程、表、触发器或视图）。

    • 架构名（如组、角色或用户）。

    • 标量类型名（如系统和用户定义类型）。

    • 全文目录名称。

    • 对象内的列名或参数名。

    • 表范围内的索引名。

    由新的排序规则产生的重复名称将导致改变操作失败，SQL Server 将返回错误信息，指出重复名称所在的命名空间。

当 BACKUP 语句正在执行时，不能添加或删除文件。

若要在 size 参数中指定兆字节的分数，应通过乘以数字 1024 将该值转换为千字节。例如，应指定 1536 KB 而不是 1.5MB（1.5 x 1024 = 1536）。

权限

ALTER DATABASE 权限默认授予 sysadmin 和 dbcreator 固定服务器角色成员以及 db_owner 固定数据库角色成员。这些权限是不可传递的。

示例
A. 向数据库中添加文件

下例创建数据库，并更改该数据库以添加一个 5 MB 大小的新数据文件。

USE master
GO
CREATE DATABASE Test1 ON
(
 NAME = Test1dat1,
 FILENAME = 'c:\Program Files\Microsoft SQL Server\MSSQL\Data\t1dat1.ndf',
 SIZE = 5MB,
 MAXSIZE = 100MB,
 FILEGROWTH = 5MB
)
GO
ALTER DATABASE Test1
ADD FILE
(
 NAME = Test1dat2,
 FILENAME = 'c:\Program Files\Microsoft SQL Server\MSSQL\Data\t1dat2.ndf',
 SIZE = 5MB,
 MAXSIZE = 100MB,
 FILEGROWTH = 5MB
)
GO
B. 向数据库中添加由两个文件组成的文件组

下例在示例 A 中所创建的 Test1 数据库中创建一个文件组，并将两个 5 MB 的文件添加到该文件组。然后下例将 Test1FG1 设置为默认文件组。

USE master
GO
ALTER DATABASE Test1
ADD FILEGROUP Test1FG1
GO

ALTER DATABASE Test1
ADD FILE
( NAME = test1dat3,
  FILENAME = 'c:\Program Files\Microsoft SQL Server\MSSQL\Data\t1dat3.ndf',
  SIZE = 5MB,
  MAXSIZE = 100MB,
  FILEGROWTH = 5MB),
( NAME = test1dat4,
  FILENAME = 'c:\Program Files\Microsoft SQL Server\MSSQL\Data\t1dat4.ndf',
  SIZE = 5MB,
  MAXSIZE = 100MB,
  FILEGROWTH = 5MB)
TO FILEGROUP Test1FG1

ALTER DATABASE Test1
MODIFY FILEGROUP Test1FG1 DEFAULT
GO
C. 向数据库中添加两个日志文件

下例向数据库中添加两个 5 MB 大小的日志文件。

USE master
GO
ALTER DATABASE Test1
ADD LOG FILE
( NAME = test1log2,
  FILENAME = 'c:\Program Files\Microsoft SQL Server\MSSQL\Data\test2log.ldf',
  SIZE = 5MB,
  MAXSIZE = 100MB,
  FILEGROWTH = 5MB),
( NAME = test1log3,
  FILENAME = 'c:\Program Files\Microsoft SQL Server\MSSQL\Data\test3log.ldf',
  SIZE = 5MB,
  MAXSIZE = 100MB,
  FILEGROWTH = 5MB)
GO
D. 从数据库中删除文件

下例将示例 B 中添加到数据库 Test1 中的一个文件删除。

USE master
GO
ALTER DATABASE Test1
REMOVE FILE test1dat4
GO
E. 更改文件

下例将示例 B 中添加到数据库 Test1 中的一个文件增加大小。

USE master
GO
ALTER DATABASE Test1
MODIFY FILE
   (NAME = test1dat3,
   SIZE = 20MB)
GO
F. 将主文件组设置为默认文件组

假定原来另一个文件组设置为默认文件组，下例将主文件组设置为默认文件组。

USE master
GO
ALTER DATABASE MyDatabase
MODIFY FILEGROUP [PRIMARY] DEFAULT
GO

请参见

CREATE DATABASE

DROP DATABASE

sp_helpdb

sp_helpfile

sp_helpfilegroup

sp_renamedb

sp_spaceused

使用恢复模型


ALTER FUNCTION

更改先前由CREATE FUNCTION 语句创建的现有用户定义函数，但不会更改权限，也不影响相关的函数、存储过程或触发器。

有关 ALTER FUNCTION 语句所用参数的更多信息，请参见 CREATE FUNCTION。

语法

标量函数

ALTER FUNCTION [ owner_name. ] function_name
( [ { @parameter_name scalar_parameter_data_type [ = default ] } [ ,...n ] ] )

RETURNS scalar_return_data_type

[ WITH < function_option> [,...n] ]

[ AS ]

BEGIN
function_body
RETURN scalar_expression
END

内嵌表值函数

ALTER FUNCTION [ owner_name. ] function_name
( [ { @parameter_name scalar_parameter_data_type [ = default ] } [ ,...n ] ] )

RETURNS TABLE

[ WITH < function_option > [ ,...n ] ]

[ AS ]

RETURN [ ( ] select-stmt [ ) ]

多语句表值函数

ALTER FUNCTION [ owner_name. ] function_name
( [ { @parameter_name scalar_parameter_data_type [ = default ] } [ ,...n ] ] )

RETURNS @return_variable TABLE < table_type_definition >

[ WITH < function_option > [ ,...n ] ]

[ AS ]

BEGIN
function_body
RETURN
END

< function_option > ::=
{ ENCRYPTION | SCHEMABINDING }

< table_type_definition > ::=
    ( { column_definition | table_constraint } [ ,...n ] )

参数

owner_name

拥有待更改的用户定义函数的用户 ID 名。owner_name 必须是现有用户 ID。

function_name

是要更改的用户定义函数。函数名称必须符合标识符的规则，对其所有者来说，该名称在数据库中必须是唯一的。

@parameter_name

用户定义函数的参数。可声明一个或多个参数。函数最多可以有 1,024 个参数。用户必须在执行函数时提供每个所声明参数的值（除非定义了该参数的默认值）。当该函数的参数有默认值时，在调用该函数时必须指定"default"关键字才能获得默认值。此行为不同于在存储过程中有默认值的参数，在存储过程中省略参数也意味着使用默认值。

使用 @ 符号作为第一个字符来指定参数名称。参数名称必须符合标识符的规则。每个函数的参数仅用于该函数本身；相同的参数名称可以用在其它函数中。参数只能代替常量；而不能用于代替表名、列名或其它数据库对象的名称。

scalar_parameter_data_type

参数的数据类型。所有标量数据类型（包括 bigint 和 sql_variant）都可用作用户定义函数的参数。不支持 timestamp 数据类型。不能指定非标量类型（例如 cursor 和 table）。

scalar_return_data_type

是标量用户定义函数的返回值。scalar_return_data_type 可以是 SQL Server 支持的任何标量数据类型（text、ntext、image 和 timestamp 除外）。

scalar_expression

指定标量函数返回标量值。

TABLE

指定表值函数的返回值为表。

在内嵌表值函数中，通过单个 SELECT 语句定义 TABLE 返回值。内嵌函数没有相关联的返回变量。

在多语句表值函数中，@return_variable 是 TABLE 变量，用于存储和累积应作为函数值返回的行。

function_body

指定一组 Transact-SQL 语句定义函数的值，这些语句合在一起不会产生副作用。function_body 只用于标量函数和多语句表值函数。

在标量函数中，function_body 是一系列合起来求得标量值的 Transact-SQL 语句。

在多语句表值函数中，function_body 是一系列填充表返回变量的 Transact-SQL 语句。

select-stmt

是定义内嵌表值函数返回值的单个 SELECT 语句。

ENCRYPTION

指出 SQL Server 加密包含 CREATE FUNCTION 语句文本的系统表列。使用 ENCRYPTION 可以避免将函数作为 SQL Server 复制的一部分发布。

SCHEMABINDING

指定将函数绑定到它所引用的数据库对象。如果其它架构绑定对象引用该函数，此条件将防止更改该函数。

函数与其所引用对象的绑定关系只有在发生以下两种情况之一时才被解除：

  • 除去了函数。

  • 在未指定 SCHEMABINDING 选项的情况下更改了函数（使用 ALTER 语句）。

有关函数绑定到架构所必须满足的条件列表，请参见 CREATE FUNCTION。

注释

不能用 ALTER FUNCTION 将标量值函数更改为表值函数，反之亦然。同样地，也不能用 ALTER FUNCTION 将行内函数更改为多语句函数，反之亦然。

权限

ALTER FUNCTION 权限默认授予 sysadmin 固定服务器角色成员、db_owner 和 db_ddladmin 固定数据库角色成员和函数的所有者且不可转让。

函数的所有者对其函数具有 EXECUTE 权限。不过，也可将此权限授予其他用户。

请参见

CREATE FUNCTION

DROP FUNCTION


ALTER PROCEDURE

更改先前通过执行 CREATE PROCEDURE 语句创建的过程，但不会更改权限，也不影响相关的存储过程或触发器。有关 ALTER PROCEDURE 语句所用参数的更多信息，请参见 CREATE PROCEDURE。

语法

ALTER PROC [ EDURE ] procedure_name [ ; number ]
[ { @parameter data_type }
[ VARYING ] [ = default ] [ OUTPUT ]
    ] [ ,...n ]

[ WITH
{ RECOMPILE | ENCRYPTION
        | RECOMPILE , ENCRYPTION
}
]
[ FOR REPLICATION ]
AS
    sql_statement [ ...n ]

参数

procedure_name

是要更改的过程的名称。过程名称必须符合标识符规则。

;number

是现有的可选整数，该整数用来对具有同一名称的过程进行分组，以便可以用一条 DROP PROCEDURE 语句全部除去它们。

@parameter

过程中的参数。

data_type

是参数的数据类型。

VARYING

指定作为输出参数支持的结果集（由存储过程动态构造，内容可以变化）。仅适用于游标参数。

default

参数的默认值。

OUTPUT

表明参数是返回参数。

n

是表示最多可指定 2.100 个参数的占位符。

{RECOMPILE | ENCRYPTION | RECOMPILE, ENCRYPTION}

RECOMPILE 表明 Microsoft® SQL Server™ 不会高速缓存该过程的计划，该过程将在运行时重新编译。

ENCRYPTION 表示 SQL Server 加密 syscomments 表中包含 ALTER PROCEDURE 语句文本的条目。使用 ENCRYPTION 可防止将过程作为 SQL Server 复制的一部分发布。

说明 在升级过程中，SQL Server 利用存储在 syscomments 中的加密注释来重新创建加密过程。

FOR REPLICATION

指定不能在订阅服务器上执行为复制创建的存储过程。使用 FOR REPLICATION 选项创建的存储过程可用作存储过程筛选，且只能在复制过程中执行。本选项不能和 WITH RECOMPILE 选项一起使用。

AS

过程将要执行的操作。

sql_statement

过程中要包含的任意数目和类型的 Transact-SQL 语句。但有一些限制。有关更多信息，请参见 CREATE PROCEDURE 中的"sql_statement 限制"。

n

是表示该过程中可以包含多条 Transact-SQL 语句的占位符。有关更多信息，请参见 CREATE PROCEDURE。

注释

有关 ALTER PROCEDURE的更多信息，参阅 CREATE PROCEDURE 中的注释。

说明 如果原来的过程定义是用 WITH ENCRYPTION 或 WITH RECOMPILE 创建的，那么只有在 ALTER PROCEDURE 中也包含这些选项时，这些选项才有效。

权限

ALTER PROCEDURE 权限默认授予 sysadmin 固定服务器角色成员、db_owner 和 db_ddladmin 固定数据库角色成员和过程的所有者且不可转让。

用 ALTER PROCEDURE 更改的过程的权限和启动属性保持不变。

示例

下例创建称为 Oakland_authors 的过程，默认情况下，该过程包含所有来自加利福尼亚州奥克兰市的作者。随后授予了权限。然后，当该过程需更改为能够检索所有来自加利福尼亚州的作者时，用 ALTER PROCEDURE 重新定义了该存储过程。

USE pubs
GO
IF EXISTS(SELECT name FROM sysobjects WHERE name = 'Oakland_authors' AND type = 'P')
   DROP PROCEDURE Oakland_authors
GO
-- Create a procedure from the authors table that contains author
-- information for those authors who live in Oakland, California.
USE pubs
GO
CREATE PROCEDURE Oakland_authors
AS
SELECT au_fname, au_lname, address, city, zip
FROM pubs..authors
WHERE city = 'Oakland'
and state = 'CA'
ORDER BY au_lname, au_fname
GO
-- Here is the statement to actually see the text of the procedure.
SELECT o.id, c.text
FROM sysobjects o INNER JOIN syscomments c ON o.id = c.id
WHERE o.type = 'P' and o.name = 'Oakland_authors'
-- Here, EXECUTE permissions are granted on the procedure to public.
GRANT EXECUTE ON Oakland_authors TO public
GO
-- The procedure must be changed to include all
-- authors from California, regardless of what city they live in.
-- If ALTER PROCEDURE is not used but the procedure is dropped
-- and then re-created, the above GRANT statement and any
-- other statements dealing with permissions that pertain to this
-- procedure must be re-entered.
ALTER PROCEDURE Oakland_authors
WITH ENCRYPTION
AS
SELECT au_fname, au_lname, address, city, zip
FROM pubs..authors
WHERE state = 'CA'
ORDER BY au_lname, au_fname
GO
-- Here is the statement to actually see the text of the procedure.
SELECT o.id, c.text
FROM sysobjects o INNER JOIN syscomments c ON o.id = c.id
WHERE o.type = 'P' and o.name = 'Oakland_authors'
GO

请参见

数据类型

DROP PROCEDURE

EXECUTE

设计存储过程

系统表

使用标识符


ALTER TABLE

通过更改、添加、除去列和约束，或者通过启用或禁用约束和触发器来更改表的定义。

语法

ALTER TABLE table
{ [ ALTER COLUMN column_name
{ new_data_type [ ( precision [ , scale ] ) ]
[ COLLATE < collation_name > ]
[ NULL | NOT NULL ]
| {ADD | DROP } ROWGUIDCOL }
]
    | ADD
{ [ < column_definition > ]
        | column_name AS computed_column_expression
} [ ,...n ]
| [ WITH CHECK | WITH NOCHECK ] ADD
{ < table_constraint > } [ ,...n ]
| DROP
{ [ CONSTRAINT ] constraint_name
| COLUMN column } [ ,...n ]
| { CHECK | NOCHECK } CONSTRAINT
{ ALL | constraint_name [ ,...n ] }
| { ENABLE | DISABLE } TRIGGER
{ ALL | trigger_name [ ,...n ] }
}

< column_definition > ::=
{ column_name data_type }
[ [ DEFAULT constant_expression ] [ WITH VALUES ]
    | [ IDENTITY [ ( seed , increment ) [ NOT FOR REPLICATION ] ] ]
]
    [ ROWGUIDCOL ]
[ COLLATE < collation_name > ]
[ < column_constraint > ] [ ...n ]

< column_constraint > ::=
[ CONSTRAINT constraint_name ]
{ [ NULL | NOT NULL ]
        | [ { PRIMARY KEY | UNIQUE }
[ CLUSTERED | NONCLUSTERED ]
[ WITH FILLFACTOR = fillfactor ]
[ ON { filegroup | DEFAULT } ]
]
        | [ [ FOREIGN KEY ]
REFERENCES ref_table [ ( ref_column ) ]
[ ON DELETE { CASCADE | NO ACTION } ]
[ ON UPDATE { CASCADE | NO ACTION } ]
[ NOT FOR REPLICATION ]
]
        | CHECK [ NOT FOR REPLICATION ]
( logical_expression )
}

< table_constraint > ::=
[ CONSTRAINT constraint_name ]
{ [ { PRIMARY KEY | UNIQUE }
        [ CLUSTERED | NONCLUSTERED ]
{ ( column [ ,...n ] ) }
[ WITH FILLFACTOR = fillfactor ]
[ ON { filegroup | DEFAULT } ]
]
        |    FOREIGN KEY
[ ( column [ ,...n ] ) ]
REFERENCES ref_table [ ( ref_column [ ,...n ] ) ]
[ ON DELETE { CASCADE | NO ACTION } ]
[ ON UPDATE { CASCADE | NO ACTION } ]
[ NOT FOR REPLICATION ]
| DEFAULT constant_expression
[ FOR column ] [ WITH VALUES ]
        |    CHECK [ NOT FOR REPLICATION ]
( search_conditions )
}

参数

table

是要更改的表的名称。如果表不在当前数据库中或者不属于当前用户所拥有，可以显式指定数据库和所有者。

ALTER COLUMN

指定要更改给定列。如果兼容级别是 65 或小于 65，将不允许使用 ALTER COLUMN。有关更多信息，请参见 sp_dbcmptlevel。

要更改的列不能是：

  • 数据类型为 text、image、ntext 或 timestamp 的列。

  • 表的 ROWGUIDCOL 列。

  • 计算列或用于计算列中的列。

  • 被复制列。

  • 用在索引中的列，除非该列数据类型是 varchar、nvarchar 或 varbinary，数据类型没有更改，而且新列大小等于或者大于旧列大小。

  • 用在由 CREATE STATISTICS 语句创建的统计中的列。首先用 DROP STATISTICS 语句删除统计。由查询优化器自动生成的统计会由 ALTER COLUMN 自动除去。

  • 用在 PRIMARY KEY 或 [FOREIGN KEY] REFERENCES 约束中的列。

  • 用在 CHECK 或 UNIQUE 约束中的列，除非用在 CHECK 或 UNIQUE 约束中的可变长度列的长度允许更改。

  • 有相关联的默认值的列，除非在不更改数据类型的情况下允许更改列的长度、精度或小数位数。

有些数据类型的更改可能导致数据的更改。例如，将数据类型为 nchar 或 nvarchar 的列更改为 char 或 varchar 类型，将导致扩展字符的转换。有关更多信息，请参见 CAST 和 CONVERT。降低列的精度和小数位数可能导致数据截断。

column_name

是要更改、添加或除去的列的名称。对于新列，如果数据类型为 timestamp，column_name 可以省略。对于 timestamp 数据类型的列，如果未指定 column_name，将使用名称 timestamp。

new_data_type

是要更改的列的新数据类型。要更改的列的 new_data_type 应符合下列准则：

  • 原来的数据类型必须可以隐式转换为新数据类型。

  • new_data_type 类型不能为 timestamp。

  • 对 ALTER COLUMN，ANSI 空默认值始终打开；如果没有指定，列将可为空。

  • 对 ALTER COLUMN，ANSI 填充始终打开。

  • 如果要更改的列是标识列，new_data_type 必须是支持标识属性的数据类型。

  • 将忽略 SET ARITHABORT 的当前设置。ALTER TABLE 语句的行为如同 ARITHABORT 选项为 ON 时一样。

precision

是指定数据类型的精度。有关有效精度值的更多信息，请参见精度、小数位数和长度。

scale

是指定数据类型的小数位数。有关有效小数位数值的更多信息，请参见精度、小数位数和长度。

COLLATE < collation_name >

为更改列指定新的排序规则。排序规则名称既可以是 Windows 排序规则名称，也可以是 SQL 排序规则名称。有关列表及更多信息，请参见 Windows 排序规则名称 和 SQL 排序规则名称。

COLLATE 子句只能用于更改数据类型为 char、varchar、text、nchar、nvarchar 和 ntext 的列的排序规则。如果未指定，则此列采用数据库的默认排序规则。

若满足下列条件，则 ALTER COLUMN 不能更改排序规则：

  • 检查约束、外键约束或计算列引用了更改列。

  • 在此列上创建了索引、统计或全文索引。更改列的排序规则时，该列上自动创建的统计将除去。

  • SCHEMABOUND 视图或函数引用了此列。

有关 COLLATE 子句的更多信息，请参见 COLLATE。

NULL | NOT NULL

指定该列是否可接受空值。不允许空值的列只有在指定了默认值的情况下，才能用 ALTER TABLE 语句向表中添加。添加到表中的新列要么允许空值，要么必须指定默认值。

如果新列允许空值，而且没有指定默认值，那么新列在表中每一行都包含空值。如果新列允许空值并且指定了新列的默认值，那么可以使用 WITH VALUES 选项在表中所有现有行的新列中存储默认值。

如果新列不允许空值，那么新列必须具有 DEFAULT 定义，而且新列的所有现有行中将自动装载该默认值。

可在 ALTER COLUMN 语句中指定 NULL 以使 NOT NULL 列允许空值，但 PRIMARY KEY 约束中的列除外。只有列中不包含空值时，ALTER COLUMN 中才可指定 NOT NULL。必须将空值更新为非空值后，才允许执行 ALTER COLUMN NOT NULL 语句，比如：

UPDATE MyTable SET NullCol = N'some_value' WHERE NullCol IS NULL

ALTER TABLE MyTable ALTER COLUMN NullCOl NVARCHAR(20) NOT NULL

如果 ALTER COLUMN 中指定了 NULL 或 NOT NULL，那么必须同时指定 new_data_type [(precision [, scale ])]。如果不更改数据类型、精度和小数位数，请指定列的这些值的当前值。

[ {ADD | DROP} ROWGUIDCOL ]

指定在指定列上添加或除去 ROWGUIDCOL 属性。ROWGUIDCOL 是一个关键字，表示列是行全局唯一标识符列。对于每个表只能指派一个 uniqueidentifier 列作为 ROWGUIDCOL 列。ROWGUIDCOL 属性只能指派给 uniqueidentifier 列。

ROWGUIDCOL 属性并不强制列中所存储值的唯一性。该属性也不会为插入到表中的新行自动生成值。若要为每列生成唯一值，那么或者在 INSERT 语句中使用 NEWID 函数，或者将 NEWID 函数指定为该列的默认值。

ADD

指定要添加一个或多个列定义、计算列定义或者表约束。

computed_column_expression

是一个定义计算列的值的表达式。计算列是并不物理地存储在表中的虚拟列，该列用表达式计算得出，该表达式使用同一表中的其它列。例如，计算列的定义可以是：cost AS price * qty。表达式可以是非计算列的列名、常量、函数、变量，也可以是用一个或多个运算符连接的上述元素的任意组合。表达式不能为子查询。

计算列可用于选择列表、WHERE 子句、ORDER BY 字句或其它任何可以使用常规表达式的位置，但下列情况除外：

  • 计算列不能用作 DEFAULT 或 FOREIGN KEY 约束定义，也不能与 NOT NULL 约束定义一起使用。但是，如果计算列由具有确定性的表达式定义，并且索引列中允许计算结果的数据类型，则可将该列用作索引中的键列，或用作 PRIMARY KEY 或 UNIQUE 约束的一部分。

    例如，如果表中有整数列 a 和 b，那么计算列 a+b 上可建立索引，而计算列 a+DATEPART(dd, GETDATE()) 上则不能，因为该值将在后续调用时更改。

  • 计算列不能作为 INSERT 或 UPDATE 语句的目标。

    说明 由于表中计算列所用列中的各行可能有不同的值，所以计算列的每一行可能有不同的值。

n

是表示前面的项可重复 n 次的占位符。

WITH CHECK | WITH NOCHECK

指定表中的数据是否用新添加的或重新启用的 FOREIGN KEY 或 CHECK 约束进行验证。如果没有指定，对于新约束，假定为 WITH CHECK，对于重新启用的约束，假定为 WITH NOCHECK。

WITH CHECK 和 WITH NOCHECK 子句不能用于 PRIMARY KEY 和 UNIQUE 约束。

如果不想用新 CHECK 或 FOREIGN KEY 约束对现有数据进行验证，请用 WITH NOCHECK，除了个别情况，不建议这样使用。新约束将在以后的所有更新中生效。任何在添加约束时由 WITH NOCHECK 抑制的约束违规都可能导致将来的更新失败，如果这些更新操作要更新的行中包含不符合约束条件的数据。

查询优化器不考虑用 WITH NOCHECK 定义的约束。将忽略这些约束，直到使用 ALTER TABLE table CHECK CONSTRAINT ALL语句重新启用这些约束为止。

DROP { [CONSTRAINT] constraint_name | COLUMN column_name }

指定从表中删除 constraint_name 或者 column_name。如果兼容级别小于或等于 65，将不允许 DROP COLUMN。可以列出多个列或约束。下面的列不能除去：

  • 被复制列。

  • 用在索引中的列。

  • 用在 CHECK、FOREIGN KEY、UNIQUE 或 PRIMARY KEY 约束中的列。

  • 有相关联的默认值（由 DEFAULT 关键字定义）的列，或绑定到默认对象的列。

  • 绑定到规则的列。

{ CHECK | NOCHECK} CONSTRAINT

指定启用或禁用 constraint_name。如果禁用，将来插入或更新该列时将不用该约束条件进行验证。此选项只能与 FOREIGN KEY 和 CHECK 约束一起使用。

ALL
指定使用 NOCHECK 选项禁用所有约束，或者使用 CHECK 选项启用所有约束。

{ENABLE | DISABLE} TRIGGER

指定启用或禁用 trigger_name。当一个触发器被禁用时，它对表的定义依然存在；然而，当在表上执行 INSERT、UPDATE 或 DELETE 语句时，触发器中的操作将不执行，除非重新启用该触发器。

ALL
指定启用或禁用表中所有的触发器。
trigger_name
指定要启用或禁用的触发器名称。

column_name data_type

新列的数据类型。data_type 可以是任何 Microsoft® SQL Server™ 数据类型或用户定义数据类型。

DEFAULT

是指定列默认值的关键字。DEFAULT 定义可用于为表中现有行的新列提供值。DEFAULT 定义不能添加到具有 timestamp 数据类型、IDENTITY 属性、现有 DEFAULT 定义或绑定默认值的列。如果列已有默认值，必须除去旧默认值后才能添加新默认值。为同 SQL Server 先前版本保持兼容性，向 DEFAULT 赋予约束名是可能的。

IDENTITY

指定新列是标识列。在表中添加新行时，SQL Server 为列提供一个唯一的增量值。标识列通常与 PRIMARY KEY 约束一起用作表的唯一行标识符。IDENTITY 属性可赋予 tinyint、smallint、int、bigint、decimal(p,0) 或者 numeric(p,0) 列。对于每个表只能创建一个标识列。DEFAULT 关键字和绑定默认值不能用于标识列。要么种子和增量都同时指定，要么都不指定。如果二者都未指定，则取默认值 (1,1)。

Seed
是用于表中所装载的第一行的值。
Increment
是添加到前一行的标识值的增量值。

NOT FOR REPLICATION

指定当复制登录（如 sqlrepl）向表中插入数据时，不强制 IDENTITY 属性。也可对约束指定 NOT FOR REPLICATION。当复制登录向表中插入数据时，不检查约束条件。

CONSTRAINT

指定 PRIMARY KEY、UNIQUE、FOREIGN KEY 或 CHECK 约束的开始，或者指定 DEFAULT 定义的开始。

constrain_name

是新约束。约束的名称必须符合标识符规则，但其名称的首字符不能为 #。如果没有提供 constraint_name，约束使用系统生成的名称。

PRIMARY KEY

是通过唯一索引对给定的一列或多列强制实体完整性的约束。对每个表只能创建一个 PRIMARY KEY 约束。

UNIQUE

是通过唯一索引为给定的一列或多列提供实体完整性的约束。

CLUSTERED | NONCLUSTERED

指定为 PRIMARY KEY 或 UNIQUE 约束创建聚集或非聚集索引。PRIMARY KEY 约束默认为 CLUSTERED；UNIQUE 约束默认为 NONCLUSTERED。

如果表中已存在聚集约束或索引，那么在 ALTER TABLE 中就不能指定 CLUSTERED。如果表中已存在聚集约束或索引，PRIMARY KEY 约束默认为 NONCLUSTERED。

WITH FILLFACTOR = fillfactor

指定 SQL Server 存储索引数据时每个索引页的充满程度。用户指定的 fillfactor 取值范围从 1 到 100。如果没有指定，那么默认值为 0。创建索引时，fillfactor 值越低，不必分配新空间即可添加的新索引条目的可用空间就越多。有关详细信息，请参见 CREATE INDEX。

ON {filegroup | DEFAULT}

指定为约束创建的索引的存储位置。如果指定了 filegroup，索引将在该文件组内创建。如果指定了 DEFAULT，索引将在默认文件组内创建。如果未指定 ON，索引将在表所在的文件组内创建。当为 PRIMARY KEY 或 UNIQUE 约束添加聚集索引时，如果指定了 ON，那么创建聚集索引时整个表都将移到指定的文件组中。

在这里，DEFAULT 不是一个关键字。DEFAULT 是默认文件组的标识符，必须用符号界定，如 ON "DEFAULT" 或 ON [DEFAULT]。

FOREIGN KEY...REFERENCES

是为列中数据提供引用完整性的约束。FOREIGN KEY 约束要求列中的每个值在被引用表的指定列中都存在。

ref_table

是 FOREIGN KEY 约束所引用的表。

ref_column

是新 FOREIGN KEY 约束所引用的一列或多列（置于括号中）。

ON DELETE {CASCADE | NO ACTION}

指定当表中被更改的行具有引用关系，并且该行所引用的行从父表中删除时，要对被更改行采取的操作。默认设置为 NO ACTION。

如果指定 CASCADE，则从父表中删除被引用行时，也将从引用表中删除引用行。如果指定 NO ACTION，SQL Server 将产生一个错误并回滚父表中的行删除操作。

如果表中已存在 ON DELETE 的 INSTEAD OF 触发器，那么就不能定义 ON DELETE 的CASCADE 操作。

例如，在 Northwind 数据库中，Orders 表和 Customers 表之间有引用关系。Orders.CustomerID 外键引用 Customers.CustomerID 主键。

如果对 Customers 表的某行执行 DELETE 语句，并且为 Orders.CustomerID 指定 ON DELETE CASCADE 操作，则 SQL Server 将在 Orders 表中检查是否有与被删除的行相关的一行或多行。如果存在相关行，那么 Orders 表中的相关行将随 Customers 表中的被引用行一同删除。

反之，如果指定 NO ACTION，若在 Orders 表中至少有一行引用 Customers 表中要删除的行，则 SQL Server 将产生一个错误并回滚 Customers 表中的删除操作。

ON UPDATE {CASCADE | NO ACTION}

指定当表中被更改的行具有引用关系，并且该行所引用的行在父表中更新时，要对被更改行采取的操作。默认设置为 NO ACTION。

如果指定 CASCADE，则在父表中更新被引用行时，也将在引用表中更新引用行。如果指定 NO ACTION，SQL Server 将产生一个错误并回滚父表中的行更新操作。

如果表中已存在 ON DELETE 的 INSTEAD OF 触发器，那么就不能定义 ON DELETE 的CASCADE 操作。

例如，在 Northwind 数据库中，Orders 表和 Customers 表之间有引用关系。Orders.CustomerID 外键引用 Customers.CustomerID 主键。

如果对 Customers 表的某行执行 UPDATE 语句，并且为 Orders.CustomerID 指定 ON UPDATE CASCADE 操作，则 SQL Server 将在 Orders 表中检查是否有与被更新行相关的一行或多行。如果存在相关行，那么 Orders 表中的相关行将随 Customers 表中的被引用行一同更新。

反之，如果指定了 NO ACTION，若在 Orders 表中至少存在一行引用 Customers 表中要更新的行，那么 SQL Server 将引发一个错误并回滚 Customers 表中的更新操作。

[ASC | DESC]

指定加入到表约束中的一列或多列的排序次序。默认设置为 ASC。

WITH VALUES

指定在添加到现有行的新列中存储 DEFAULT constant_expression 中所给定的值。只有在 ADD 列子句中指定了 DEFAULT 的情况下，才能使用 WITH VALUES。如果要添加的列允许空值且指定了 WITH VALUES，那么将在现有行的新列中存储默认值。如果没有指定 WITH VALUES 且列允许空值，那么将在现有行的新列中存储 NULL 值。如果新列不允许空值，那么不论是否指定 WITH VALUES，都将在现有行的新列中存储默认值。

column[,...n]

是新约束所用的一列或多列（置于括号中）。

constant_expression

是用作列的默认值的字面值、NULL 或者系统函数。

FOR column

指定与表级 DEFAULT 定义相关联的列。

CHECK

是通过限制可输入到一列或多列中的可能值强制域完整性的约束。

logical_expression

是用于 CHECK 约束的返回 TRUE 或 FALSE 的逻辑表达式。用于 CHECK 约束的 Logical_expression 不能引用其它表，但可引用同一表中同一行的其它列。

注释

若要添加新数据行，请使用 INSERT 语句。若要删除数据行，请使用 DELETE 或 TRUNCATE TABLE 语句。若要更改现有行中的值，请使用 UPDATE 语句。

ALTER TABLE 语句指定的更改将立即实现。如果这些更改需要修改表中的行，ALTER TABLE 将更新这些行。ALTER TABLE 将获取表上的架构修改锁，以确保在更改期间其它连接不能引用该表（甚至不能引用其元数据）。对表进行的更改将记录于日志中，并且可以完全恢复。影响非常大的表中所有行的更改，比如除去一列或者用默认值添加 NOT NULL 列，可能需要较长时间才能完成，并会生成大量日志记录。如同影响大量行的 INSERT、UPDATE 或者 DELETE 语句一样，这一类 ALTER TABLE 语句也应小心使用。

如果过程高速缓存中存在引用该表的执行计划，ALTER TABLE 会将这些执行计划标记为下次执行时重新编译。

如果 ALTER TABLE 语句指定更改其它表所引用的列值，那么根据引用表中 ON UPDATE 或者 ON DELETE 所指定的操作，将发生以下两个事件之一。

  • 如果在引用表中没有指定值或指定了 NO ACTION（默认值），那么 ALTER TABLE 语句导致的更改父表中被引用列的操作将回滚，并且 SQL Server 将引发一个错误。

  • 如果在引用表中指定了 CASCADE，那么由 ALTER TABLE 语句导致的对父表的更改将应用于父表及其相关表。

添加 sql_variant 列的 ALTER TABLE 语句会生成下列警告：

The total row size (xx) for table 'yy' exceeds the maximum number of bytes per row (8060). Rows that exceed the maximum number of bytes will not be added.

因为 sql_variant 的最大长度为 8016 个字节，所以产生该警告。当某 sql_variant 列所含值接近最大长度时，即会超过行长度的最大字节限制。

ALTER TABLE 语句对具有架构绑定视图的表执行时，所受限制与当前在更改具有简单索引的表时所受的限制相同。添加列是允许的。但是，不允许删除或更改参与架构绑定视图的表中的列。如果 ALTER TABLE 语句要求更改用在架构绑定视图中的列，更改操作将失败，并且 SQL Server 将引发一条错误信息。有关 SCHEMABINDING 和索引视图的更多信息，请参见 CREATE VIEW。

创建引用表的架构绑定视图不会影响在基表上添加或删除触发器。

当除去约束时，作为约束的一部分而创建的索引也将除去。而通过 CREATE INDEX 创建的索引必须使用 DROP INDEX 语句来除去。DBCC DBREINDEX 语句可用来重建约束定义的索引部分；而不必使用 ALTER TABLE 先除去再重新添加约束。

必须删除所有基于列的索引和约束后，才能删除列。

添加约束时，所有现有数据都要进行约束违规验证。如果发生违规，ALTER TABLE 语句将失败并返回一个错误。

当在现有列上添加新 PRIMARY KEY 或 UNIQUE 约束时，该列中的数据必须唯一。如果存在重复值，ALTER TABLE 语句将失败。当添加 PRIMARY KEY 或 UNIQUE 约束时，WITH NOCHECK 选项不起作用。

每个 PRIMARY KEY 和 UNIQUE 约束都将生成一个索引。UNIQUE 和 PRIMARY KEY 约束的数目不能导致表上非聚集索引的数目大于 249，聚集索引的数目大于 1。

如果要添加的列的数据类型为 uniqueidentifier，那么该列可以使用 NEWID() 函数作为默认值，以向表中现有行的新列提供唯一标识符值。

SQL Server 在列定义中并不强制以特定的顺序指定 DEFAULT、IDENTITY、ROWGUIDCOL 或列约束。

ALTER TABLE 的 ALTER COLUMN 子句并不会在列上绑定或取消绑定任何规则。必须分别使用 sp_bindrule 或 sp_unbindrule 来绑定或取消绑定规则。

可将规则绑定到用户定义数据类型。然后 CREATE TABLE 将自动在以该用户定义数据类型定义的列上绑定该规则。当用 ALTER COLUMN 更改列数据类型时，并不会取消绑定这些规则。原用户定义数据类型上的规则仍然绑定在该列上。在 ALTER COLUMN 更改了列的数据类型之后，随后执行的任何从该用户定义数据类型上取消绑定规则的 sp_unbindrule 都不会导致从更改了数据类型的列上取消绑定该规则。如果 ALTER COLUMN 将列的数据类型更改为绑定了规则的用户定义数据类型，那么绑定到新数据类型的规则不会绑定到该列。

权限

ALTER TABLE 权限默认授予表的所有者、sysadmin 固定服务器角色成员、db_owner 和 db_ddladmin 固定数据库角色成员且不可转让。

示例
A. 更改表以添加新列

下例添加一个允许空值的列，而且没有通过 DEFAULT 定义提供值。各行的新列中的值将为 NULL。

CREATE TABLE doc_exa ( column_a INT)
GO
ALTER TABLE doc_exa ADD column_b VARCHAR(20) NULL
GO
EXEC sp_help doc_exa
GO
DROP TABLE doc_exa
GO
B. 更改表以除去列

下例修改表以删除一列。

CREATE TABLE doc_exb ( column_a INT, column_b VARCHAR(20) NULL)
GO
ALTER TABLE doc_exb DROP COLUMN column_b
GO
EXEC sp_help doc_exb
GO
DROP TABLE doc_exb
GO
C. 更改表以添加具有约束的列

下例向表中添加具有 UNIQUE 约束的新列。

CREATE TABLE doc_exc ( column_a INT)
GO
ALTER TABLE doc_exc ADD column_b VARCHAR(20) NULL
   CONSTRAINT exb_unique UNIQUE
GO
EXEC sp_help doc_exc
GO
DROP TABLE doc_exc
GO
D. 更改表以添加未验证的约束

下例向表中的现有列上添加约束。该列中存在一个违反约束的值；因此，利用 WITH NOCHECK 来防止对现有行验证约束，从而允许该约束的添加。

CREATE TABLE doc_exd ( column_a INT)
GO
INSERT INTO doc_exd VALUES (-1)
GO
ALTER TABLE doc_exd WITH NOCHECK
ADD CONSTRAINT exd_check CHECK (column_a > 1)
GO
EXEC sp_help doc_exd
GO
DROP TABLE doc_exd
GO
E. 更改表以添加多个带有约束的列

下例向表中添加多个带有约束的新列。第一个新列具有 IDENTITY 属性；表中每一行的标识列都将具有递增的新值。

CREATE TABLE doc_exe ( column_a INT CONSTRAINT column_a_un UNIQUE)
GO
ALTER TABLE doc_exe ADD

/* Add a PRIMARY KEY identity column. */
column_b INT IDENTITY
CONSTRAINT column_b_pk PRIMARY KEY,

/* Add a column referencing another column in the same table. */
column_c INT NULL
CONSTRAINT column_c_fk
REFERENCES doc_exe(column_a),

/* Add a column with a constraint to enforce that   */
/* nonnull data is in a valid phone number format.  */
column_d VARCHAR(16) NULL
CONSTRAINT column_d_chk
CHECK
(column_d IS NULL OR
column_d LIKE "[0-9][0-9][0-9]-[0-9][0-9][0-9][0-9]" OR
column_d LIKE
"([0-9][0-9][0-9]) [0-9][0-9][0-9]-[0-9][0-9][0-9][0-9]"),

/* Add a nonnull column with a default.  */
column_e DECIMAL(3,3)
CONSTRAINT column_e_default
DEFAULT .081
GO
EXEC sp_help doc_exe
GO
DROP TABLE doc_exe
GO
F. 添加具有默认值的可为空的列

下例添加可为空的、具有 DEFAULT 定义的列，并使用 WITH VALUES 为表中的各现有行提供值。如果没有使用 WITH VALUES，那么每一行的新列中都将具有 NULL 值。

ALTER TABLE MyTable
ADD AddDate smalldatetime NULL
CONSTRAINT AddDateDflt
DEFAULT getdate() WITH VALUES
G. 禁用并重新启用一个约束

下例禁用用于限制可接受的薪水数据的约束。WITH NOCHECK CONSTRAINT 与 ALTER TABLE 一起使用，以禁用该约束并使正常情况下会引起约束违规的插入操作得以执行。WITH CHECK CONSTRAINT 重新启用该约束。

CREATE TABLE cnst_example
(id INT NOT NULL,
 name VARCHAR(10) NOT NULL,
 salary MONEY NOT NULL
    CONSTRAINT salary_cap CHECK (salary < 100000)
)

-- Valid inserts
INSERT INTO cnst_example VALUES (1,"Joe Brown",65000)
INSERT INTO cnst_example VALUES (2,"Mary Smith",75000)

-- This insert violates the constraint.
INSERT INTO cnst_example VALUES (3,"Pat Jones",105000)

-- Disable the constraint and try again.
ALTER TABLE cnst_example NOCHECK CONSTRAINT salary_cap
INSERT INTO cnst_example VALUES (3,"Pat Jones",105000)

-- Reenable the constraint and try another insert, will fail.
ALTER TABLE cnst_example CHECK CONSTRAINT salary_cap
INSERT INTO cnst_example VALUES (4,"Eric James",110000)
H. 禁用并重新启用触发器

下例使用 ALTER TABLE 的 DISABLE TRIGGER 选项来禁用触发器，以使正常情况下会违反触发器条件的插入操作得以执行。然后下例使用 ENABLE TRIGGER 重新启用触发器。

CREATE TABLE trig_example
(id INT,
name VARCHAR(10),
salary MONEY)
go
-- Create the trigger.
CREATE TRIGGER trig1 ON trig_example FOR INSERT
as
IF (SELECT COUNT(*) FROM INSERTED
WHERE salary > 100000) > 0
BEGIN
print "TRIG1 Error: you attempted to insert a salary > $100,000"
ROLLBACK TRANSACTION
END
GO
-- Attempt an insert that violates the trigger.
INSERT INTO trig_example VALUES (1,"Pat Smith",100001)
GO
-- Disable the trigger.
ALTER TABLE trig_example DISABLE TRIGGER trig1
GO
-- Attempt an insert that would normally violate the trigger
INSERT INTO trig_example VALUES (2,"Chuck Jones",100001)
GO
-- Re-enable the trigger.
ALTER TABLE trig_example ENABLE TRIGGER trig1
GO
-- Attempt an insert that violates the trigger.
INSERT INTO trig_example VALUES (3,"Mary Booth",100001)
GO

请参见

DROP TABLE

sp_help


ALTER TRIGGER

更改原来由 CREATE TRIGGER 语句创建的触发器定义。有关 ALTER TRIGGER 语句所用参数的更多信息，请参见 CREATE TRIGGER。

语法

ALTER TRIGGER trigger_name
ON ( table | view )
[ WITH ENCRYPTION ]
{
{ ( FOR | AFTER | INSTEAD OF ) { [ DELETE ] [ , ] [ INSERT ] [ , ] [ UPDATE ] }
[ NOT FOR REPLICATION ]
AS
sql_statement [ ...n ]
}
    |
    { ( FOR | AFTER | INSTEAD OF ) { [ INSERT ] [ , ] [ UPDATE ] }
[ NOT FOR REPLICATION ]
AS
{ IF UPDATE ( column )
[ { AND | OR } UPDATE ( column ) ]
[ ...n ]
        | IF ( COLUMNS_UPDATED ( ) { bitwise_operator } updated_bitmask )
{ comparison_operator } column_bitmask [ ...n ]
}
        sql_statement [ ...n ]
    }
}

参数

trigger_name

是要更改的现有触发器。

table | view

是触发器在其上执行的表或视图。

WITH ENCRYPTION

加密 syscomments 表中包含 ALTER TRIGGER 语句文本的条目。使用 WITH ENCRYPTION 可防止将触发器作为 SQL Server 复制的一部分发布。

说明 如果原来的触发器定义是用 WITH ENCRYPTION 或 RECOMPILE 创建的，那么只有在 ALTER TRIGGER 中也包含这些选项时，这些选项才有效。

AFTER

指定触发器只有在触发它的 SQL 语句执行成功后才触发。所有的引用级联操作和约束检查也必须成功完成后，才能执行此触发器。

如果仅指定了 FOR 关键字，那么 AFTER 是默认设置。

AFTER 触发器只能定义在表上。

INSTEAD OF

指定执行触发器而不是触发 SQL 语句，从而替代触发语句的操作。

在表或视图上，每个 INSERT、UPDATE 或 DELETE 语句最多可以定义一个 INSTEAD OF 触发器。然而，可以在每个具有 INSTEAD OF 触发器的视图上定义视图。

INSTEAD OF 触发器不允许定义在用 WITH CHECK OPTION 创建的视图上。如果向指定了 WITH CHECK OPTION 选项的视图添加 INSTEAD OF 触发器，SQL Server 将引发一个错误。用户必须用 ALTER VIEW 删除该选项后才能定义 INSTEAD OF 触发器。

{ [DELETE] [,] [INSERT] [,] [UPDATE] } | { [INSERT] [,] [UPDATE]}

是指定在表或视图上执行哪些数据修改语句时将激活触发器的关键字。必须至少指定一个选项。在触发器定义中允许使用以任意顺序组合的这些关键字。如果指定的选项多于一个，需用逗号分隔这些选项。

对于 INSTEAD OF 触发器，不允许在具有 ON DELETE 级联操作引用关系的表上使用 DELETE 选项。同样，也不允许在具有 ON UPDATE 级联操作引用关系的表上使用 UPDATE 选项。有关更多信息，请参见 ALTER TABLE。

NOT FOR REPLICATION

表示当复制登录（如 sqlrepl）更改触发器所涉及的表时，不应执行该触发器。

AS

是触发器要执行的操作。

sql_statement

是触发器的条件和操作。

n

是表示触发器中可以包含多条 Transact-SQL 语句的占位符。

IF UPDATE (column)

测试在指定的列上进行的 INSERT 或 UPDATE 操作，不能用于 DELETE 操作。

可以在触发器主体中的任意位置使用 UPDATE(column)。

{AND | OR}

指定要测试 INSERT 或 UPDATE 操作的另一个列。

column

是要测试 INSERT 或 UPDATE 操作的列名。

IF (COLUMNS_UPDATED())

判断提及的一列或多列是插入还是更新，仅用于 INTSERT 或 UPDATE 触发器中。COLUMNS_UPDATED 返回 varbinary 位模式，该位模式表示表的哪些列进行了插入操作，哪些列进行了更新操作。

可以在触发器主体中的任意位置使用 COLUMNS_UPDATED。

bitwise_operator

是用于比较运算的位运算符。

updated_bitmask

是整型位掩码，表示实际更新或插入的列。例如，表 t1 包含列 C1、C2、C3、C4 和 C5。假定表 t1 上有 UPDATE 触发器，若要检查列 C2、C3 和 C4 是否都有更新，指定值 14；若要检查是否只有列 C2 有更新，指定值 2。

comparison_operator

是比较运算符。使用等号 (=) 检查 updated_bitmask 中指定的所有列是否都实际进行了更新。使用大于号 (>) 来检查 updated_bitmask 中指定的列是否有进行过更新的，或者没有全部进行更新。

column_bitmask

是要检查的列的整型位掩码。

注释

有关 ALTER TRIGGER 的更多信息，请参见 CREATE TRIGGER 中的注释。

说明 由于 Microsoft 不支持在系统表上添加用户定义触发器，所以建议不要在系统表上创建用户定义触发器。

通过表和视图上的 INSTEAD OF 触发器，ALTER TRIGGER 支持可手工更新的视图。Microsoft® SQL Server™ 以相同的方式对所有类型的触发器（AFTER、INSTEAD-OF）应用 ALTER TRIGGER。

可用 sp_settriggerorder 指定表上第一个和最后一个执行的 AFTER 触发器。在表上只能指定一个第一个执行及一个最后一个执行的 AFTER 触发器。如果该表上还有其它 AFTER 触发器，那么这些触发器将以未定义的顺序执行。

如果 ALTER TRIGGER 语句更改了第一个或最后一个触发器，则将除去已修改触发器上设置的第一个或最后一个特性，而且必须用 sp_settriggerorder 重置排序值。

只有当激发触发器的 SQL 语句（包括所有与被更新或删除对象有关的引用级联操作和约束检查）成功执行后，AFTER 触发器才会执行。AFTER 触发器操作要检查激发触发器的语句的运行结果（也包括所有由激发语句引起的 UPDATE 和 DELETE 引用级联操作）。

如果一个子表或引用表上的 DELETE 操作是由于父表的 CASCADE DELETE 操作所引起的，并且子表上定义了 DELETE 的 INSTEAD OF 触发器，那么将忽略该触发器并执行 DELETE 操作。

权限

ALTER TRIGGER 的权限默认地授予 db_owner 和 db_ddladmin 固定数据库角色的成员，以及表所有者。这些权限是不可传递的。

示例

下例首先创建一个触发器，当用户在表 roysched 中添加或更改数据时，该触发器向客户端打印一条用户定义消息。然后，使用 ALTER TRIGGER 语句使该触发器仅对 INSERT 活动有效。该触发器有助于提醒向表中插入行或更新行的用户及时通知书的作者和出版商。

USE pubs
GO
CREATE TRIGGER royalty_reminder
ON roysched
WITH ENCRYPTION
FOR INSERT, UPDATE
AS RAISERROR (50009, 16, 10)

-- Now, alter the trigger.
USE pubs
GO
ALTER TRIGGER royalty_reminder
ON roysched
FOR INSERT
AS RAISERROR (50009, 16, 10)

消息 50009 是 sysmessages 中的用户定义消息。有关创建用户定义消息的更多信息，请参见 sp_addmessage。

请参见

DROP TRIGGER

设计存储过程

sp_addmessage

事务

使用标识符


ALTER VIEW

更改一个先前创建的视图（用 CREATE VIEW 创建），包括索引视图，但不影响相关的存储过程或触发器，也不更改权限。有关 ALTER VIEW 语句中所用参数的更多信息，请参见 CREATE VIEW。

语法

ALTER VIEW [ < database_name > .] [ < owner > .] view_name [ ( column [ ,...n ] ) ]
[ WITH < view_attribute > [ ,...n ] ]
AS
    select_statement
[ WITH CHECK OPTION ]

< view_attribute > ::=
{ ENCRYPTION | SCHEMABINDING | VIEW_METADATA }

参数

view_name

是要更改的视图。

column

是一列或多列的名称，用逗号分开，将成为给定视图的一部分。

重要 只有在 ALTER VIEW 执行前后列名称不变的情况下，列上的权限才会保持不变。

说明 在视图的各列中，列名的权限在 CREATE VIEW 或 ALTER VIEW 语句间均适用，与基础数据源无关。例如，如果授予了 CREATE VIEW 语句中 title_id 列上的权限，那么 ALTER VIEW 语句可以将 title_id 列改名（例如改为 qty），但权限仍与使用 title_id 的视图上的权限相同。

n

是表示 column 可重复 n 次的占位符。

WITH ENCRYPTION

加密 syscomments 表中包含 ALTER VIEW 语句文本的条目。使用 WITH ENCRYPTION 可防止将视图作为 SQL Server 复制的一部分发布。

SCHEMABINDING

将视图绑定到架构上。指定 SCHEMABINDING 时，select_statement 必须包含由所引用的表、视图或用户定义函数组成的两部分名称 (owner.object)。

不能除去参与到用架构绑定子句创建的视图中的视图或表，除非该视图已被除去或更改而不再具有架构绑定。否则，SQL Server 会产生错误。另外，对于参与具有架构绑定的视图的表，如果其上的 ALTER TABLE 语句影响了该视图的定义，则这些语句将会失败。

VIEW_METADATA

在为引用视图的查询请求浏览模式元数据时，指定 SQL Server 将向 DBLIB、ODBC 和 OLE DB API 返回有关视图的元数据信息，而不是返回基表或表。浏览模式元数据是由 SQL Server 向客户端 DB-LIB、ODBC 和 OLE DB API 返回的附加元数据，它允许客户端 API 实现可更新的客户端游标。浏览模式元数据包含有关结果集内的列所属基表的信息。

对于用 VIEW_METADATA 选项创建的视图，当在结果集中描述视图内的列时，浏览模式元数据返回相对于基表名的视图名。

当用 VIEW_METADATA 创建视图时，如果该视图具有 INSERT 或 UPDATE INSTEAD OF 触发器，则视图的所有列（timestamp 除外）都是可更新的。请参见 CREATE VIEW 中的"可更新视图"。

AS

是视图要执行的操作。

select_statement

是定义视图的 SELECT 语句。

WITH CHECK OPTION

强制视图上执行的所有数据修改语句都必须符合由定义视图的 select_statement 设置的准则。

注释

有关 ALTER VIEW 的更多信息，请参见 CREATE VIEW 中的注释。

说明 如果原来的视图定义是用 WITH ENCRYPTION 或 CHECK OPTION 创建的，那么只有在 ALTER VIEW 中也包含这些选项时，这些选项才有效。

如果使用 ALTER VIEW 更改当前正在使用的视图，Microsoft® SQL Server™ 将在该视图上放一个排它架构锁。当锁已授予，并且该视图没有活动用户时，SQL Server 将从过程缓存中删除该视图的所有复本。引用该视图的现有计划将继续保留在缓存中，但当唤醒调用时将重新编译。

ALTER VIEW 可应用于索引视图。然而，ALTER VIEW 将无条件地除去视图上的所有索引。

权限

ALTER VIEW 的权限默认地授予 db_owner 和 db_ddladmin 固定数据库角色的成员，以及视图所有者。这些权限是不可传递的。

若要更改视图，用户必须具有 ALTER VIEW 权限，并且对视图中引用的表、视图和表值函数具有 SELECT 权限，对视图中调用的标量值函数具有 EXECUTE 权限。

此外，用户若要更改视图 WITH SCHEMABINDING，则必须对每一个引用的表、视图和用户定义函数具有 REFERENCES 权限。

示例
A. 更改视图

下例创建称为 All_authors 的视图，该视图包含全部的作者。权限授予了视图，但需求改为从犹他州选择作者。于是，使用 ALTER VIEW 替换了该视图。

-- Create a view from the authors table that contains all authors.
CREATE VIEW All_authors (au_fname, au_lname, address, city, zip)
AS
SELECT au_fname, au_lname, address, city, zip
FROM pubs..authors
GO
-- Grant SELECT permissions on the view to public.
GRANT SELECT ON All_authors TO public
GO
-- The view needs to be changed to include all authors
-- from Utah.
-- If ALTER VIEW is not used but instead the view is dropped and
-- re-created, the above GRANT statement and any other statements
-- dealing with permissions that pertain to this view
-- must be re-entered.
ALTER VIEW All_authors (au_fname, au_lname, address, city, zip)
AS
SELECT au_fname, au_lname, address, city, zip
FROM pubs..authors
WHERE state = 'UT'
GO
B. 在视图中使用 @@ROWCOUNT 函数

下例使用 @@ROWCOUNT 函数作为视图定义的一部分。

USE pubs
GO
CREATE VIEW yourview
AS
    SELECT title_id, title, mycount = @@ROWCOUNT, ytd_sales
    FROM titles
GO
SELECT *
FROM yourview
GO
-- Here, the view is altered.
USE pubs
GO
ALTER VIEW yourview
AS
    SELECT title, mycount = @@ ROWCOUNT, ytd_sales
    FROM titles
    WHERE type = 'mod_cook'
GO
SELECT *
FROM yourview
GO

请参见

CREATE TABLE

CREATE VIEW

DROP VIEW

设计存储过程

SELECT

使用标识符


AND

连结两个布尔型表达式并当两个表达式都为 TRUE 时返回 TRUE。当语句中有多个逻辑运算符时，AND 运算符将首先计算。可以通过使用括号更改计算次序。

语法

boolean_expression AND boolean_expression

参数

boolean_expression

任何有效的 Microsoft® SQL Server™ 表达式都将返回下列布尔值：TRUE FALSE 或 UNKNOWN。

结果类型

Boolean

结果值

当两个表达式均为 TRUE 时返回 TRUE。

注释

下表概括了使用 AND 运算符比较 TRUE 和 FALSE 时的结果。

 | TRUE | FALSE | UNKNOWN
TRUE | TRUE | FALSE | UNKNOWN
FALSE | FALSE | FALSE | FALSE
UNKNOWN | UNKNOWN | FALSE | UNKNOWN

请参见

表达式

函数

运算符（逻辑运算符）

SELECT

WHERE


ANY

用标量值与单列集中的值进行比较。有关更多信息，请参见 SOME | ANY。


APP_NAME

返回当前会话的应用程序名称（如果应用程序进行了设置）。

语法

APP_NAME ( )

返回类型

nvarchar(128)

示例

下例检查启动此进程的客户端应用程序是否为 SQL 查询分析器会话。

DECLARE @CurrentApp varchar(35)
SET @CurrentApp = APP_NAME()
IF @CurrentApp <> 'MS SQL Query Analyzer'
PRINT 'This process was not started by a SQL Query Analyzer query session.'

请参见

系统函数


ASCII

返回字符表达式最左端字符的 ASCII 代码值。

语法

ASCII ( character_expression )

参数

character_expression

是类型为 char 或 varchar的表达式。

返回类型

int

示例

下例假定在 ASCII 字符集环境下运行，它将返回字符串"Du Monde entier"中每一个字符的 ASCII 值和 char 字符。

SET TEXTSIZE 0
SET NOCOUNT ON
-- Create the variables for the current character string position
-- and for the character string.
DECLARE @position int, @string char(15)
-- Initialize the variables.
SET @position = 1
SET @string = 'Du monde entier'
WHILE @position <= DATALENGTH(@string)
   BEGIN
   SELECT ASCII(SUBSTRING(@string, @position, 1)),
      CHAR(ASCII(SUBSTRING(@string, @position, 1)))
    SET @position = @position + 1
   END
SET NOCOUNT OFF
GO

下面是结果集：

----------- -
68          D

----------- -
117         u

----------- -
32

----------- -
109         m

----------- -
111         o

----------- -
110         n

----------- -
100         d

----------- -
101         e

----------- -
32

----------- -
101         e

----------- -
110         n

----------- -
116         t

----------- -
105         i

----------- -
101         e

----------- -
114         r

请参见

字符串函数


ASIN

返回以弧度表示的角度值，该角度值的正弦为给定的 float 表达式；亦称反正弦。

语法

ASIN ( float_expression )

参数

float_expression

是 float 类型的表达式，其取值范围从 -1 到 1。对超过此范围的参数值，函数将返回 NULL 并且报告域错误。

返回类型

float

示例

下例用 float 表达式返回给定角的 ASIN 值。

-- First value will be -1.01, which fails.
DECLARE @angle float
SET @angle = -1.01
SELECT 'The ASIN of the angle is: ' + CONVERT(varchar, ASIN(@angle))
GO

-- Next value is -1.00.
DECLARE @angle float
SET @angle = -1.00
SELECT 'The ASIN of the angle is: ' + CONVERT(varchar, ASIN(@angle))
GO

-- Next value is 0.1472738.
DECLARE @angle float
SET @angle = 0.1472738
SELECT 'The ASIN of the angle is: ' + CONVERT(varchar, ASIN(@angle))
GO

下面是结果集：

-------------------------
The ASIN of the angle is:

(1 row(s) affected)

Domain error occurred.

---------------------------------
The ASIN of the angle is: -1.5708

(1 row(s) affected)

----------------------------------
The ASIN of the angle is: 0.147811

(1 row(s) affected)

请参见

CEILING

数学函数

SET ARITHIGNORE

SET ARITHABORT


ATAN

返回以弧度表示的角度值，该角度值的正切为给定的 float 表达式；亦称反正切。

语法

ATAN ( float_expression )

参数

float_expression

是 float 类型的表达式。

返回类型

float

示例

下例用 float 表达式返回给定角的 ATAN 值。

SELECT 'The ATAN of -45.01 is: ' + CONVERT(varchar, ATAN(-45.01))
SELECT 'The ATAN of -181.01 is: ' + CONVERT(varchar, ATAN(-181.01))
SELECT 'The ATAN of 0 is: ' + CONVERT(varchar, ATAN(0))
SELECT 'The ATAN of 0.1472738 is: ' + CONVERT(varchar, ATAN(0.1472738))
SELECT 'The ATAN of 197.1099392 is: ' + CONVERT(varchar, ATAN(197.1099392))
GO

下面是结果集：

-------------------------------
The ATAN of -45.01 is: -1.54858

(1 row(s) affected)

--------------------------------
The ATAN of -181.01 is: -1.56527

(1 row(s) affected)

--------------------------------
The ATAN of 0 is: 0

(1 row(s) affected)

----------------------------------
The ATAN of 0.1472738 is: 0.146223

(1 row(s) affected)

-----------------------------------
The ATAN of 197.1099392 is: 1.56572

(1 row(s) affected)

请参见

CEILING

数学函数


ATN2

返回以弧度表示的角度值，该角度值的正切介于两个给定的 float 表达式之间；亦称反正切。

语法

ATN2 ( float_expression , float_expression )

参数

float_expression

float 数据类型的表达式。

返回类型

float

示例

下例计算给定角的 ATN2。

DECLARE @angle1 float
DECLARE @angle2 float
SET @angle1 = 35.175643
SET @angle2 = 129.44
SELECT 'The ATN2 of the angle is: ' + CONVERT(varchar,ATN2(@angle1,@angle2 ))
GO

下面是结果集：

The ATN2 of the angle is: 0.265345

(1 row(s) affected)

请参见

CAST 和 CONVERT

float 和 real

数学函数


AVG

返回组中值的平均值。空值将被忽略。

语法

AVG ( [ ALL | DISTINCT ] expression )

参数

ALL

对所有的值进行聚合函数运算。ALL 是默认设置。

DISTINCT

指定 AVG 操作只使用每个值的唯一实例，而不管该值出现了多少次。

expression

精确数字或近似数字数据类型类别的表达式（bit 数据类型除外）。不允许使用聚合函数和子查询。

返回类型

返回类型由表达式的运算结果类型决定。

表达式结果 | 返回类型
整数分类 | int
decimal 分类 (p, s) | decimal(38, s) 除以 decimal(10, 0)
money 和 smallmoney 分类 | money
float 和 real 分类 | float

重要 当使用 CUBE 或 ROLLUP 时，不支持非重复聚合，例如 AVG(DISTINCT column_name)、COUNT(DISTINCT column_name)、MAX(DISTINCT column_name)、MIN(DISTINCT column_name) 和 SUM(DISTINCT column_name)。如果使用了 CUBE 或 ROLLUP，Microsoft® SQL Server™ 将返回错误信息并取消查询。

示例
A. 使用 SUM 和 AVG 函数进行计算

下例计算所有商业类书籍的平均预付款和本年度迄今为止的销售额。对检索到的所有行，每个聚合函数都生成一个单独的汇总值。

USE pubs

SELECT AVG(advance), SUM(ytd_sales)
FROM titles
WHERE type = 'business'

下面是结果集：

-------------------------- -----------
6,281.25                   30788

(1 row(s) affected)
B. 与 GROUP BY 子句一起使用 SUM 和 AVG 函数

当与 GROUP BY 子句一起使用时，每个聚合函数都为每一组生成一个值，而不是对整个表生成一个值。下例对每一类书生成汇总值，这些值包括每一类书的平均预付款以及每一类书本年度迄今为止的销售总额。

USE pubs

SELECT type, AVG(advance), SUM(ytd_sales)
FROM titles
GROUP BY type
ORDER BY type

下面是结果集：

type
------------ -------------------------- -----------
business     6,281.25                   30788
mod_cook     7,500.00                   24278
popular_comp 7,500.00                   12875
psychology   4,255.00                   9939
trad_cook    6,333.33                   19566
UNDECIDED    NULL                       NULL

(6 row(s) affected)
C. 使用带 DISTINCT 的 AVG

下列语句返回商业类书籍的平均价格。

USE pubs

SELECT AVG(DISTINCT price)
FROM titles
WHERE type = 'business'

下面是结果集：

--------------------------
11.64

(1 row(s) affected)
D. 使用不带 DISTINCT 的 AVG

如果不使用 DISTINCT，AVG 函数将计算出 titles 表中所有商业类书籍的平均价格。

USE pubs

SELECT AVG(price)
FROM titles
WHERE type = 'business'

下面是结果集：

--------------------------
13.73

(1 row(s) affected)

请参见

聚合函数


BACKUP

备份整个数据库、事务日志，或者备份一个或多个文件或文件组。有关数据库备份和恢复操作的更多信息，请参见备份和还原数据库。

语法

备份整个数据库：

BACKUP DATABASE { database_name | @database_name_var }
TO < backup_device > [ ,...n ]
[ WITH
[ BLOCKSIZE = { blocksize | @blocksize_variable } ]
[ [ , ] DESCRIPTION = { 'text' | @text_variable } ]
[ [ , ] DIFFERENTIAL ]
[ [ , ] EXPIREDATE = { date | @date_var }
| RETAINDAYS = { days | @days_var } ]
[ [ , ] PASSWORD = { password | @password_variable } ]
[ [ , ] FORMAT | NOFORMAT ]
[ [ , ] { INIT | NOINIT } ]
[ [ , ] MEDIADESCRIPTION = { 'text' | @text_variable } ]
[ [ , ] MEDIANAME = { media_name | @media_name_variable } ]
[ [ , ] MEDIAPASSWORD = { mediapassword | @mediapassword_variable } ]
[ [ , ] NAME = { backup_set_name | @backup_set_name_var } ]
[ [ , ] { NOSKIP | SKIP } ]
[ [ , ] { NOREWIND | REWIND } ]
[ [ , ] { NOUNLOAD | UNLOAD } ]
[ [ , ] RESTART ]
[ [ , ] STATS [ = percentage ] ]
]

备份特定的文件或文件组：

BACKUP DATABASE { database_name | @database_name_var }
< file_or_filegroup > [ ,...n ]
TO < backup_device > [ ,...n ]
[ WITH
[ BLOCKSIZE = { blocksize | @blocksize_variable } ]
[ [ , ] DESCRIPTION = { 'text' | @text_variable } ]
[ [ , ] DIFFERENTIAL ]
[ [ , ] EXPIREDATE = { date | @date_var }
| RETAINDAYS = { days | @days_var } ]
[ [ , ] PASSWORD = { password | @password_variable } ]
[ [ , ] FORMAT | NOFORMAT ]
[ [ , ] { INIT | NOINIT } ]
[ [ , ] MEDIADESCRIPTION = { 'text' | @text_variable } ]
[ [ , ] MEDIANAME = { media_name | @media_name_variable } ]
[ [ , ] MEDIAPASSWORD = { mediapassword | @mediapassword_variable } ]
[ [ , ] NAME = { backup_set_name | @backup_set_name_var } ]
[ [ , ] { NOSKIP | SKIP } ]
[ [ , ] { NOREWIND | REWIND } ]
[ [ , ] { NOUNLOAD | UNLOAD } ]
[ [ , ] RESTART ]
[ [ , ] STATS [ = percentage ] ]
]

备份一个事务日志：

BACKUP LOG { database_name | @database_name_var }
{
TO < backup_device > [ ,...n ]
[ WITH
[ BLOCKSIZE = { blocksize | @blocksize_variable } ]
[ [ , ] DESCRIPTION = { 'text' | @text_variable } ]
[ [ ,] EXPIREDATE = { date | @date_var }
| RETAINDAYS = { days | @days_var } ]
[ [ , ] PASSWORD = { password | @password_variable } ]
[ [ , ] FORMAT | NOFORMAT ]
[ [ , ] { INIT | NOINIT } ]
[ [ , ] MEDIADESCRIPTION = { 'text' | @text_variable } ]
[ [ , ] MEDIANAME = { media_name | @media_name_variable } ]
[ [ , ] MEDIAPASSWORD = { mediapassword | @mediapassword_variable } ]
[ [ , ] NAME = { backup_set_name | @backup_set_name_var } ]
[ [ , ] NO_TRUNCATE ]
[ [ , ] { NORECOVERY | STANDBY = undo_file_name } ]
[ [ , ] { NOREWIND | REWIND } ]
[ [ , ] { NOSKIP | SKIP } ]
[ [ , ] { NOUNLOAD | UNLOAD } ]
[ [ , ] RESTART ]
[ [ , ] STATS [ = percentage ] ]
]
}

< backup_device > ::=
{
{ logical_backup_device_name | @logical_backup_device_name_var }
|
{ DISK | TAPE } =
{ 'physical_backup_device_name' | @physical_backup_device_name_var }
}

< file_or_filegroup > ::=
{
FILE = { logical_file_name | @logical_file_name_var }
|
FILEGROUP = { logical_filegroup_name | @logical_filegroup_name_var }
}

截断事务日志：

BACKUP LOG { database_name | @database_name_var }
{
[ WITH
{ NO_LOG | TRUNCATE_ONLY } ]
}

参数

DATABASE

指定一个完整的数据库备份。假如指定了一个文件和文件组的列表，那么仅有这些被指定的文件和文件组被备份。

说明 在进行完整数据库备份或差异数据库备份时，Microsoft® SQL Server™ 备份足够的事务日志，以生成一个将在还原数据库时使用的一致的数据库。在 master 数据库上只能采用完整数据库备份。

{ database_name | @database_name_var }

指定了一个数据库，从该数据库中对事务日志、部分数据库或完整的数据库进行备份。如果作为变量 (@database_name_var) 提供，则可将该名称指定为字符串常量 (@database_name_var = database name) 或字符串数据类型（ntext 或 text 数据类型除外）的变量。

< backup_device >

指定备份操作时要使用的逻辑或物理备份设备。可以是下列一种或多种形式：

{ logical_backup_device_name } | { @logical_backup_device_name_var }
是由 sp_addumpdevice 创建的备份设备的逻辑名称，数据库将备份到该设备中，其名称必须遵守标识符规则。如果将其作为变量 (@logical_backup_device_name_var) 提供，则可将该备份设备名称指定为字符串常量 (@logical_backup_device_name_var = logical backup device name) 或字符串数据类型（ntext 或 text 数据类型除外）的变量。
{ DISK | TAPE } =
'physical_backup_device_name' | @physical_backup_device_name_var
允许在指定的磁盘或磁带设备上创建备份。在执行 BACKUP 语句之前不必存在指定的物理设备。如果存在物理设备且 BACKUP 语句中没有指定 INIT 选项，则备份将追加到该设备。

当指定 TO DISK 或 TO TAPE 时，请输入完整路径和文件名。例如，DISK = 'C:\Program Files\Microsoft SQL Server\MSSQL\BACKUP\Mybackup.dat' 或 TAPE = '\\.\TAPE0'。

说明 对于备份到磁盘的情况，如果输入一个相对路径名，备份文件将存储到默认的备份目录中。该目录在安装时被设置并且存储在 KEY_LOCAL_MACHINE\Software\Microsoft\MSSQLServer\MSSQLServer 目录下的 BackupDirectory 注册表键值中。

如果使用的是具有统一命名规则 (UNC) 名称的网络服务器或已重新定向的驱动器号，则请指定磁盘的设备类型。

当指定多个文件时，可以混合逻辑文件名（或变量）和物理文件名（或变量）。但是，所有的设备都必须为同一类型（磁盘、磁带或管道）。

Windows 98 不支持备份到磁盘。

n

是表示可以指定多个备份设备的占位符。备份设备数目的上限为 64。

BLOCKSIZE = { blocksize | @blocksize_variable }

用字节数来指定物理块的大小。在 Windows NT 系统上，默认设置是设备的默认块大小。一般情况下，当 SQL Server 选择适合于设备的块大小时不需要此参数。在基于 Windows 2000 的计算机上，默认设置是 65,536（64 KB，是 SQL Server 支持的最大大小）。

对于磁盘，BACKUP 自动决定磁盘设备合适的块大小。

说明 如果要将结果备份集存储到 CD-ROM 中然后从 CD-ROM 中恢复，请将 BLOCKSIZE 设为 2048。

磁带的默认 BLOCKSIZE 为 65,536 (64 KB)。显式声明块大小将替代 SQL Server 选择的块大小。

DESCRIPTION = { 'text' | @text_variable }

指定描述备份集的自由格式文本。该字符串最长可以有 255 个字符。

DIFFERENTIAL

指定数据库备份或文件备份应该与上一次完整备份后改变的数据库或文件部分保持一致。差异备份一般会比完整备份占用更少的空间。对于上一次完整备份时备份的全部单个日志，使用该选项可以不必再进行备份。有关更多信息，请参见差异数据库备份和文件差异备份。

说明 在进行完整数据库备份或差异备份时，SQL Server 备份足够的事务日志，从而在恢复数据库时生成一个一致的数据库。

EXPIREDATE = { date | @date_var }

指定备份集到期和允许被重写的日期。如果将该日期作为变量 (@date_var) 提供，则可以将该日期指定为字符串常量 (@date_var = date)、字符串数据类型变量（ntext 或 text 数据类型除外）、smalldatetime 或者 datetime 变量，并且该日期必须符合已配置的系统 datetime 格式。

RETAINDAYS = { days | @days_var }

指定必须经过多少天才可以重写该备份媒体集。假如用变量 (@days_var) 指定，该变量必须为整型。

重要 假如 EXPIREDATE 或 RETAINDAYS 没有指定，有效期将取决于 sp_configure 的 media retention 配置设置。这些选项仅仅阻止 SQL Server 重写文件。用其它方法可擦除磁带，而通过操作系统可以删除磁盘文件。有关过期验证的更多信息，请参见本主题的 SKIP 和 FORMAT。

PASSWORD = { password | @password_variable }

为备份集设置密码。 PASSWORD 是一个字符串。如果为备份集定义了密码，必须提供这个密码才能对该备份集执行任何还原操作。

重要 备份集密码防止未经授权即通过 SQL Server 2000 工具访问备份集的内容，但是不能防止重写备份集。

有关使用密码的更多信息，请参见"权限"部分。

FORMAT

指定应将媒体头写入用于此备份操作的所有卷。任何现有的媒体头都被重写。FORMAT 选项使整个媒体内容无效，并且忽略任何现有的内容。

重要 使用 FORMAT 要谨慎。格式化一个备份设备或媒体将使整个媒体集不可用。例如，如果初始化现有条带备份集中的单个磁带，则整个备份集都将变得不可用。

通过指定 FORMAT，备份操作也就暗示了 SKIP 和 INIT；这些都不必显式说明。

NOFORMAT

指定媒体头不应写入所有用于该备份操作的卷中，并且不要重写该备份设备除非指定了 INIT。

INIT

指定应重写所有备份集，但是保留媒体头。如果指定了 INIT，将重写那个设备上的所有现有的备份集数据。

当遇到以下几种情况之一时不重写备份媒体：

  • 媒体上的备份设置没有全部过期。有关更多信息，请参见 EXPIREDATE 和 RETAINDAYS 选项。

  • 如果 BACKUP 语句给出了备份集名，该备份集名与备份媒体上的名称不匹配。有关更多信息，请参见 NAME 子句。

使用 SKIP 选项替代这些检查。有关使用 SKIP、NOSKIP、INIT 和 NOINIT 时的相互作用关系的更多信息，请参见注释部分。

说明 如果备份媒体有密码保护，SQL Server 将不写入媒体，除非提供媒体密码。SKIP 选项不替代此检查。只有通过格式化才能重写受密码保护的媒体。有关更多信息，请参见 FORMAT 选项。

NOINIT

表示备份集将追加到指定的磁盘或磁带设备上，以保留现有的备份集。NOINIT 是默认设置。

RESTORE 命令的 FILE 选项用于在还原时选择适当的备份集。有关更多信息，请参见 RESTORE。

如果为媒体集定义了媒体密码，则必须提供密码。

MEDIADESCRIPTION = { text | @text_variable }

指明媒体集的自由格式文本描述，最多为 255 个字符。

MEDIADESCRIPTION = { text | @text_variable }

为整个备份媒体集指明媒体名，最多为 128 个字符。假如指定了 MEDIANAME，则它必须与以前指定的媒体名相匹配，该媒体名已存在于备份卷中。假如没有指定 MEDIANAME，或指定了 SKIP 选项，将不会对媒体名进行验证检查。

MEDIAPASSWORD = { mediapassword | @mediapassword_variable }

为媒体集设置密码。MEDIAPASSWORD 是一个字符串。

如果为媒体集定义了密码，则在该媒体集上创建备份集时必须提供此密码。另外，从该媒体集执行任何还原操作时也必须提供媒体密码。只有通过格式化才能重写受密码保护的媒体。有关更多信息，请参见 FORMAT 选项。

有关使用密码的更多信息，请参见"权限"部分。

NAME = { backup_set_name | @backup_set_var }

指定备份集的名称。名称最长可达 128 个字符。假如没有指定 NAME，它将为空。

NORECOVERY

只与 BACKUP LOG 一起使用。备份日志尾部并使数据库处于正在还原的状态。当将故障转移到辅助数据库或在 RESTORE 操作前保存日志尾部时，NORECOVERY 很有用。

STANDBY = undo_file_name

只与 BACKUP LOG 一起使用。备份日志尾部并使数据库处于只读或备用模式。撤消文件名指定了容纳回滚更改的存储，如果随后应用 RESTORE LOG 操作，则必须撤消这些回滚更改。

如果指定的撤消文件名不存在，SQL Server 将创建该文件。如果该文件已存在，则 SQL Server 将重写它。有关更多信息，请参见使用备用服务器。

NOREWIND

指定 SQL Server 在备份操作完成后使磁带保持打开。NOREWIND 意即 NOUNLOAD。SQL Server 将保留磁带驱动器的所有权，直到 BACKUP或 RESTORE 命令使用 REWIND 为止。

如果无意中使磁带处于打开状态，则释放磁带的最快方法是使用下面的 RESTORE 命令：

RESTORE LABELONLY FROM TAPE = <name> WITH REWIND

通过查询 master 数据库中的 sysopentapes 表可以查找正在打开的磁带列表。

REWIND

指定 SQL Server 将释放磁带和倒带。如果 NOREWIND 和 REWIND 均未指定，则默认设置为 REWIND。

NOSKIP

指示 BACKUP 语句在可以重写媒体上的所有备份集之前先检查它们的过期日期。

SKIP

禁用备份集过期和名称检查，这些检查一般由 BACKUP 语句执行以防重写备份集。有关更多信息，请参见注释部分。

NOUNLOAD

指定不在备份后从磁带驱动器中自动卸载磁带。设置始终为 NOUNLOAD，直到指定 UNLOAD 为止。该选项只用于磁带设备。

UNLOAD

指定在备份完成后自动倒带并卸载磁带。启动新用户会话时其默认设置为 UNLOAD。该设置一直保持到用户指定了 NOUNLOAD 时为止。该选项只用于磁带设备。

RESTART

指定 SQL Server 重新启动一个被中断的备份操作。因为 RESTART 选项在备份操作被中断处重新启动该操作，所以它节省了时间。若要重新启动一个特定的备份操作，请重复整个 BACKUP 语句并且加入 RESTART 选项。不一定非要使用 RESTART 选项，但是它可以节省时间。

重要 该选项只用于导向磁带媒体的备份和跨越了多个磁带卷的备份。在备份的第一卷上永远不会有重新启动操作。

STATS [= percentage]

每当另一个 percentage 结束时显示一条消息，它被用于测量进度。如果省略 percentage，SQL Server 将每完成 10 个百分点显示一条消息。

<file_or_filegroup>

指定包含在数据库备份中的文件或文件组的逻辑名。可以指定多个文件或文件组。

FILE = { logical_file_name | @logical_file_name_var }

给一个或多个包含在数据库备份中的文件命名。

FILEGROUP = { logical_filegroup_name | @logical_filegroup_name_var }

给一个或多个包含在数据库备份中的文件组命名。

说明 当数据库的大小和性能要求使得进行完整数据库备份不切实际时，备份一个文件。若要单独备份事务日志，请使用 BACKUP LOG。

重要 必须通过使用 BACKUP LOG 提供事务日志的单独备份，才能使用文件和文件组备份来恢复数据库。有关文件备份的更多信息，请参见备份使用文件备份。

如果恢复模型为 SIMPLE，则不允许文件和文件组备份。

n

是一个占位符，表示可以指定多个文件和文件组。对文件或文件组的最大个数没有限制。

LOG

指定只备份事务日志。该日志是从上一次成功执行了的 LOG 备份到当前日志的末尾。一旦备份日志，可能会截断复制或活动事务不再需要的空间。

说明 假如备份日志看来并没有截断大部分的日志，则有可能在日志中存在一个旧的开放事务。可以使用 DBCC SQLPERF (LOGSPACE) 观察日志空间。有关更多信息，请参见事务日志备份。

NO_LOG | TRUNCATE_ONLY

无须备份复制日志即删除不活动的日志部分，并且截断日志。该选项会释放空间。因为并不保存日志备份，所以没有必要指定备份设备。NO_LOG 和 TRUNCATE_ONLY 是同义的。

使用 NO_LOG 或 TRUNCATE_ONLY 备份日志后，记录在日志中的更改不可恢复。为了恢复，请立即执行 BACKUP DATABASE。

NO_TRUNCATE

允许在数据库损坏时备份日志。

注释

可以将数据库或日志备份追加到任何磁盘或磁带设备上，从而使得数据库和它的事务日志能存储在一个物理位置中。

当数据库正在使用时，SQL Server 使用一个联机备份过程来对数据库进行备份。下面的列表包括在数据库或事务日志备份时无法进行的操作：

  • 在备份操作时允许进行文件管理操作，如带有 ADD FILE 或 REMOVE FILE 选项的 ALTER DATABASE 语句，以及 INSERT、UPDATE 或 DELETE 语句。

  • 收缩数据库或文件。这包括自动收缩操作。

假如在这些操作正在进行时启动备份，备份将终止。假如正在进行备份时，试图进行这些操作，则操作会失败。

只要操作系统支持数据库的排序规则，就可以在不同的平台之间执行备份操作，即使这些平台使用不同的处理器类型。有关更多信息，请参见 SQL Server 排序规则基础知识。

备份文件格式

因为 SQL Server 2000 的备份格式遵从 Microsoft 磁带格式 (MTF)，该格式与 Windows NT 磁带备份所使用的格式相同，所以 SQL Server 备份可与 Windows NT 备份共存于磁带媒体上。若要确保相互操作性，磁带应由 NTBackup 格式化。

备份类型

SQL Server 支持的备份类型包括：

  • 完整数据库备份，它备份包括事务日志的整个数据库。

  • 在完整数据库备份之间执行差异数据库备份。

  • 事务日志备份。

    日志备份序列提供了连续的事务信息链，可支持从数据库、差异或文件备份中快速恢复。

  • 文件和文件组备份。

    当时间限制使得完整数据库备份不切实际时，请使用 BACKUP 备份数据库文件和文件组，而不是备份完整数据库。若要备份一个文件而不是整个数据库时，请合理安排步骤以确保数据库中所有的文件按规则备份。同时必须进行单独的事务日志备份。在恢复一个文件备份后，使用事务日志将文件内容前滚，使其与数据库其余部分一致。

在条带集中使用的备份设备必须一直在条带集中使用（除非在某处用 FORMAT 重新初始化），而且设备数目不变。在备份设备已定义为条带集的组成部分后，就不能用于单个设备备份，除非指定了 FORMAT。同样，一个含有非条带集备份的备份设备不能用于条带集，除非指定了 FORMAT。使用 FORMAT 来分开条带备份集。

如果写入媒体头时未指定 MEDIANAME 或 MEDIADESCRIPTION，则与空项对应的媒体头字段将为空。

如果恢复模型为 SIMPLE，则无法使用 BACKUP LOG。应该使用 BACKUP DATABASE 来替代。

SKIP、NOSKIP、INIT 和 NOINIT 间的相互作用

下表说明 { INIT | NOINIT }和{ NOSKIP | SKIP } 子句间是如何相互作用的。

说明 在所有这些交互操作中，如果磁带媒体为空或磁带备份文件不存在，则写入媒体头并继续。如果媒体头不为空或不含有效的媒体头，则指出这是无效的 MTF 媒体并取消备份。

INIT NOINIT
SKIP 如果卷中包含有效的1 媒体头，则验证媒体密码并重写媒体上的全部备份集，仅保留媒体头。

如果卷不含有效的媒体头，则使用给定的 MEDIANAME、MEDIAPASSWORD 和 MEDIADESCRIPTION（若有）生成媒体头。

 如果卷中包含有效的媒体头，则验证媒体密码并添加备份集，并保留所有现有备份集。

如果卷不含有效的媒体头，则会出错。
NOSKIP 如果该卷包含一个有效的媒体头，将执行以下检查：
  • 验证媒体密码。2

  • 如果指定了 MEDIANAME，将验证所给的媒体名是否匹配媒体头的媒体名。

  • 验证媒体上没有未过期的备份集。
    如果有，将终止备份。

如果这些检查都通过了，将重写该媒体上一切备份集，只保留媒体头。

如果卷不含有效的媒体头，则使用给定的 MEDIANAME、MEDIAPASSWORD 和 MEDIADESCRIPTION（若有）生成媒体头。

 如果该卷包含一个有效的媒体头，将验证媒体密码*并且验证媒体是否名匹配所给的 MEDIANAME（假如有的话）。如果匹配，追加备份集，同时保留所有现有的备份集。

如果卷不含有效的媒体头，则会出错。

1. 有效性包括 MTF 版本号和其它标题信息。如果不支持指定的版本或指定的版本不是期望值，将会发生错误。
2. 用户必须属于适当的固定数据库或服务器角色，并提供执行备份操作所需的正确媒体密码。

说明 为保持向后兼容性，在 BACKUP 语句的语法中可使用 DUMP 关键字替代 BACKUP 关键字。另外，可使用 TRANSACTION 关键字替代 LOG 关键字。

备份历史表

SQL Server 使用以下的备份历史表来跟踪备份活动：

  • backupfile

  • backupmediafamily

  • backupmediaset

  • backupset

执行 RESTORE 时，将修改备份历史记录表。

兼容性注意事项

注意 无法在早期 SQL Server 版本中还原使用 Microsoft® SQL Server™ 2000 创建的备份。

权限

BACKUP DATABASE 和 BACKUP LOG 权限默认情况下授予 sysadmin 固定服务器角色和 db_owner 及 db_backupoperator 固定数据库角色的成员。

此外，用户可以为媒体集、备份集或两者指定密码。如果为媒体集指定了密码，则用户若只是适当的固定服务器和数据库角色成员还不足以执行备份。用户还必须提供媒体密码才能执行这些操作。同样，除非在还原命令中指定正确的媒体集密码和备份集密码，否则不能执行还原操作。

在 BACKUP 语句中，定义备份集密码和媒体集密码为可选功能。使用密码可防止利用 SQL Server 2000 工具未经授权地执行还原操作和在媒体中添加备份集，但是，密码不能防止通过 FORMAT 选项重写媒体。

因此，尽管使用密码对防止利用 SQL Server 工具未经授权地访问媒体内容有帮助，但密码不能防止媒体内容被破坏。密码不能完全防止未经授权地访问媒体内容，原因在于备份集中的数据没有加密，理论上可以被专为此目的创建的程序所检查。对于安全性至关重要的场合，防止未经授权的个人访问媒体非常重要。

为不是用相关密码创建的对象指定密码是错误的做法。

BACKUP 使用由 PASSWORD 选项提供的备份集密码创建备份集。另外，BACKUP 正常情况下在写入媒体之前验证由 MEDIAPASSWORD 选项提供的媒体密码。BACKUP 不验证媒体密码的唯一情况是当格式化媒体时，这将重写媒体头。BACKUP 只在下列情况下格式化媒体：

  • 如果指定了 FORMAT 选项。

  • 如果媒体头无效且指定了 INIT。

  • 如果正在写入延续卷。

如果 BACKUP 写入媒体头，BACKUP 将给 MEDIAPASSWORD 选项中指定的值指派媒体集密码。

有关密码对 SKIP、NOSKIP、INIT 和 NOINIT 选项的影响的更多信息，请参见注释部分。

备份设备物理文件的所有权和权限问题可能会妨碍备份操作。SQL Server 必须能够读取并写入设备；运行 SQL Server 服务的帐户必须有写入权限。但是，为设备在系统表中添加项目的 sp_addumpdevice 不检查文件访问权。备份设备物理文件的这些问题可能直到为备份或还原而访问物理资源时才会出现。

示例
A. 备份整个 MyNwind 数据库

说明 MyNwind 数据库仅用于演示。

下例创建用于存放 MyNwind 数据库完整备份的逻辑备份设备。

-- Create a logical backup device for the full MyNwind backup.
USE master
EXEC sp_addumpdevice 'disk', 'MyNwind_1',
   DISK ='c:\Program Files\Microsoft SQL Server\MSSQL\BACKUP\MyNwind_1.dat'

-- Back up the full MyNwind database.
BACKUP DATABASE MyNwind TO MyNwind_1
B. 备份数据库和日志

本例创建了一个数据库和日志的完整备份。将数据库备份到称为 MyNwind_2 的逻辑备份设备上，然后将日志备份到称为 MyNwindLog1 的逻辑备份设备上。

说明 创建逻辑备份设备需要一次完成。

-- Create the backup device for the full MyNwind backup.
USE master
EXEC sp_addumpdevice 'disk', 'MyNwind_2',
   'c:\Program Files\Microsoft SQL Server\MSSQL\BACKUP\MyNwind_2.dat'

--Create the log backup device.
USE master
EXEC sp_addumpdevice 'disk', 'MyNwindLog1',
   'c:\Program Files\Microsoft SQL Server\MSSQL\BACKUP\MyNwindLog1.dat'

-- Back up the full MyNwind database.
BACKUP DATABASE MyNwind TO MyNwind_2

-- Update activity has occurred since the full database backup.

-- Back up the log of the MyNwind database.
BACKUP LOG MyNwind
   TO MyNwindLog1

请参见

备份格式

DBCC SQLPERF

RESTORE

RESTORE FILELISTONLY

RESTORE HEADERONLY

RESTORE LABELONLY

RESTORE VERIFYONLY

sp_addumpdevice

sp_configure

sp_dboption

sp_helpfile

sp_helpfilegroup

使用标识符

使用媒体集及媒体家族


BEGIN DISTRIBUTED TRANSACTION

指定一个由 Microsoft 分布式事务处理协调器 (MS DTC) 管理的 Transact-SQL 分布式事务的起始。

语法

BEGIN DISTRIBUTED TRAN [ SACTION ]
[ transaction_name | @tran_name_variable ]

参数

transaction_name

是用户定义的事务名，用于跟踪 MS DTC 实用工具中的分布式事务。transaction_name 必须符合标识符规则，但是仅使用头 32 个字符。

@tran_name_variable

是用户定义的一个变量名，它含有一个事务名，该事务名用于跟踪 MS DTC 实用工具中的分布式事务。必须用 char、varchar、nchar 或 nvarchar 数据类型声明该变量。

注释

执行 BEGIN DISTRIBUTED TRANSACTION 语句的服务器是事务创建人，并且控制事务的完成。当连接发出后续 COMMIT TRANSACTION 或 ROLLBACK TRANSACTION 语句时，主控服务器请求 MS DTC 在所涉及的服务器间管理分布式事务的完成。

有两个方法可将远程 SQL 服务器登记在一个分布式事务中：

  • 分布式事务中已登记的连接执行一个远程存储过程调用，该调用引用一个远程服务器。

  • 分布式事务中已登记的连接执行一个分布式查询，该查询引用一个远程服务器。

例如，如果在 ServerA 上发出 BEGIN DISTRIBUTED TRANSACTION，该连接调用 ServerB 上的存储过程和 ServerC 上的另一个存储过程，并且 ServerC 上的存储过程对 ServerD 执行一个分布式查询，那么四个 SQL 服务器都进入分布式事务中了。ServerA 是该事务的创建者和控制服务器。

分布式事务 Transact-SQL 涉及的连接并不获取可以传给另一个连接的事务对象，从而也不能用该方法显式登记在分布式事务中。远程服务器登记到事务中的唯一方法是成为远程存储过程调用或分布式查询的目标。

sp_configure remote proc trans 选项控制对本地事务中的远程存储过程调用是否自动使本地事务被提升为由 MS DTC 管理的分布式事务。连接层 SET 选项 REMOTE_PROC_TRANSACTIONS 可用于替代由 sp_configure remote proc trans 建立的服务器默认值。启用本选项后，远程存储过程调用会使一个本地事务提升为分布式事务。创建 MS DTC 事务的连接成为该事务的创建人。COMMIT TRANSACTION 初始化一个 MS DTC 协调的提交。如果启用了 sp_configure remote proc trans 选项，本地事务中的远程存储过程调用将被自动保护，成为分布式事务的一部分，而不需要重写应用程序以便专门使用 BEGIN DISTRIBUTED TRANSACTION 以替代 BEGIN TRANSACTION。

在本地事务中执行一个分布式查询时，如果目标 OLE DB 数据源支持 ItransactionLocal，则该事务被自动提升为分布式事务。如果目标 OLE DB 数据源不支持 ItransactionLocal，则在分布式查询中只允许只读操作。

关于分布式事务环境和处理的更多信息，请参见 Microsoft 分布式事务处理协调器文档。

权限

默认情况下，任何有效用户都拥有 BEGIN DISTRIBUTED TRANSACTION 权限。

示例

本例在本地和远程数据库上更新作者的姓。本地和远程数据库将同时提交或同时回滚本事务。

说明 除非正在运行 Microsoft® SQL Server™ 的计算机上当前装有 MS DTC，否则本例会产生错误信息。关于安装 MS DTC 的更多信息，请参见 Microsoft 分布式事务处理协调器文档。

USE pubs
GO
BEGIN DISTRIBUTED TRANSACTION
UPDATE authors
   SET au_lname = 'McDonald' WHERE au_id = '409-56-7008'
EXECUTE remote.pubs.dbo.changeauth_lname '409-56-7008','McDonald'
COMMIT TRAN
GO

请参见

BEGIN TRANSACTION

COMMIT TRANSACTION

COMMIT WORK

分布式事务

ROLLBACK WORK

SAVE TRANSACTION


BEGIN TRANSACTION

标记一个显式本地事务的起始点。BEGIN TRANSACTION将 @@TRANCOUNT 加 1。

语法

BEGIN TRAN [ SACTION ] [ transaction_name | @tran_name_variable
[ WITH MARK [ 'description' ] ] ]

参数

transaction_name

是给事务分配的名称。transaction_name 必须遵循标识符规则，但是不允许标识符多于 32 个字符。仅在嵌套的 BEGIN...COMMIT 或 BEGIN...ROLLBACK 语句的最外语句对上使用事务名。

@tran_name_variable

是用户定义的、含有有效事务名称的变量的名称。必须用 char、varchar、nchar 或 nvarchar 数据类型声明该变量。

WITH MARK ['description']

指定在日志中标记事务。Description 是描述该标记的字符串。

如果使用了 WITH MARK，则必须指定事务名。WITH MARK 允许将事务日志还原到命名标记。

注释

BEGIN TRANSACTION 代表一点，由连接引用的数据在该点是逻辑和物理上都一致的。如果遇上错误，在 BEGIN TRANSACTION 之后的所有数据改动都能进行回滚，以将数据返回到已知的一致状态。每个事务继续执行直到它无误地完成并且用 COMMIT TRANSACTION 对数据库作永久的改动，或者遇上错误并且用 ROLLBACK TRANSACTION 语句擦除所有改动。

BEGIN TRANSACTION 为使用本语句的连接启动一个本地事务。根据当前事务隔离级别的设置情况，为支持该连接所发出的 Transact-SQL 语句而获取的许多资源被该事务锁定，直到此事务以 COMMIT TRANSACTION 或 ROLLBACK TRANSACTION 语句完成。长时间处于等待处理状态的事务会阻止其他用户访问锁定的资源。

虽然 BEGIN TRANSACTION 启动一个本地事务，但是在应用程序接下来执行了一个必须记录的操作（如执行 INSERT、UPDATE 或 DELETE 语句）之前，它并不被记录在事务日志中。应用程序能执行一些操作，例如为了保护 SELECT 语句的事务隔离级别而获取锁，但是直到应用程序执行一个修改操作日志中才有记录。

在一系列嵌套的事务中用一个事务名给多个事务命名对该事务没有什么影响。系统仅登记第一个（最外部的）事务名。回滚到其它任何名字（有效的保存点名除外）都会产生错误。事实上，任何在回滚之前执行的语句都没有在错误发生时回滚。这些语句仅当外层的事务回滚时才会进行回滚。

BEGIN TRANSACTION 启动一个本地事务。如果在事务提交或回滚之前执行了如下操作，本地事务将升级到分布式事务：

  • 执行了一个 INSERT、DELETE 或 UPDATE 语句，该语句引用了连接的服务器上的一个远程表。如果用于访问连接服务器的 OLE DB 提供程序不支持 ItransactionJoin 接口，该 INSERT、UPDATE 或 DELETE 语句则会失败。

  • 当启用了 REMOTE_PROC_TRANSACTIONS 选项时，将调用远程存储过程。

SQL Server 的本地复本成为事务控制器并且使用 MS DTC 来管理该分布式事务。

标记事务

WITH MARK 选项使事务名置于事务日志中。将数据库还原到早期状态时，可使用标记事务替代日期和时间。有关更多信息，请参见将数据库还原到前一个状态、恢复到命名事务和 RESTORE。

另外，若要将一组相关数据库恢复到逻辑上一致的状态，必须使用事务日志标记。标记可由分布式事务置于相关数据库的事务日志中。将这组相关数据库恢复到这些标记将产生一组在事务上一致的数据库。在相关数据库中放置标记需要特殊的过程。有关更多信息，请参见"相关数据库的备份和恢复"。

只有当数据库由标记事务更新时，才在事务日志中放置标记。不修改数据的事务不被标记。

在已存在的未标记事务中可以嵌套 BEGIN TRAN new_name WITH MARK。嵌套后，new_name 便成为事务的标记名，不论是否已为事务提供了该名称。在下例中，M2 是标记名。

BEGIN TRAN T1
UPDATE table1 ...
BEGIN TRAN M2 WITH MARK
UPDATE table2 ...
SELECT * from table1
COMMIT TRAN M2
UPDATE table3 ...
COMMIT TRAN T1

尝试标记已标记的事务将产生警告（非错误）消息：

BEGIN TRAN T1 WITH MARK
UPDATE table1 ...
BEGIN TRAN M2 WITH MARK

Server: Msg 3920, Level 16, State 1, Line 3
WITH MARK option only applies to the first BEGIN TRAN WITH MARK.
The option is ignored.
权限

任何有效的用户都具有默认的 BEGIN TRANSACTION 权限。

示例
A. 命名事务

下例说明如何命名事务。提交命名事务后，为所有畅销计算机书籍支付的版税增加 10%。

DECLARE @TranName VARCHAR(20)
SELECT @TranName = 'MyTransaction'

BEGIN TRANSACTION @TranName
GO
USE pubs
GO
UPDATE roysched
SET royalty = royalty * 1.10
WHERE title_id LIKE 'Pc%'
GO

COMMIT TRANSACTION MyTransaction
GO
B. 标记事务

下例说明如何标记事务。标记名为"RoyaltyUpdate"的事务。

BEGIN TRANSACTION RoyaltyUpdate
   WITH MARK 'Update royalty values'
GO
USE pubs
GO
UPDATE roysched
   SET royalty = royalty * 1.10
   WHERE title_id LIKE 'Pc%'
GO
COMMIT TRANSACTION RoyaltyUpdate
GO

请参见

BEGIN DISTRIBUTED TRANSACTION

COMMIT TRANSACTION

COMMIT WORK

RESTORE

恢复到命名事务

ROLLBACK TRANSACTION

ROLLBACK WORK

SAVE TRANSACTION

事务


BEGIN...END

包括一系列的 Transact-SQL 语句，使得可以执行一组 Transact-SQL 语句。BEGIN 和 END 是控制流语言的关键字。

语法

BEGIN
{
sql_statement
| statement_block
 }
END

参数

{ sql_statement | statement_block }

是任何有效的 Transact-SQL 语句或以语句块定义的语句分组。

注释

BEGIN...END 语句块允许嵌套。

虽然所有的 Transact-SQL 语句在 BEGIN...END 块内都有效，但有些 Transact-SQL 语句不应组合在同一个批处理（语句块）中。有关更多信息，请参见批处理和所用的各个语句。

示例

在本例中，BEGIN 和 END 定义一系列一起执行的 Transact-SQL 语句。如果没有包括 BEGIN...END 块，IF 条件仅使 ROLLBACK TRANSACTION 执行并且不返回打印信息。

USE pubs
GO
CREATE TRIGGER deltitle
ON titles
FOR delete
AS
IF    (SELECT COUNT(*) FROM deleted, sales
      WHERE sales.title_id = deleted.title_id) > 0
   BEGIN
      ROLLBACK TRANSACTION
      PRINT 'You can't delete a title with sales.'
END

请参见

ALTER TRIGGER

控制流语言

CREATE TRIGGER

END (BEGIN...END)


BETWEEN

指定测试范围。

语法

test_expression [ NOT ] BETWEEN begin_expression AND end_expression

参数

test_expression

是用来在由 begin_expression 和 end_expression 定义的范围内进行测试的表达式。test_expression 必须与 begin_expression 和 end_expression 具有相同的数据类型。

NOT

指定谓词的结果被取反。

begin_expression

是任何有效的 Microsoft® SQL Server™ 表达式。begin_expression 必须与 test_expression 和 end_expression 具有相同的数据类型。

end_expression

是任何有效的 SQL Server 表达式。end_expression 必须与 test_expression 和 begin_expression 一样具有相同的数据类型。

AND

作为一个占位符，表示 test_expression 应该处于由 begin_expression 和 end_expression 指定的范围内。

结果类型

Boolean

结果值

如果 test_expression 的值大于或等于 begin_expression 的值并且小于或等于 end_expression 的值，则 BETWEEN 返回 TRUE。

如果 test_expression 的值小于 begin_expression 的值或者大于 end_expression 的值，则 NOT BETWEEN 返回 TRUE。

注释

若要指定排除范围，请使用大于 (>) 和小于 (<) 运算符。如果任何 BETWEEN 或 NOT BETWEEN 谓词的输入为 NULL，则结果是 UNKNOWN。

示例
A. 使用 BETWEEN

本例返回书的题头标识符，这些书的年度至今单位销售额是从 4,095 到 12,000。

USE pubs
GO
SELECT title_id, ytd_sales
FROM titles
WHERE ytd_sales BETWEEN 4095 AND 12000
GO

下面是结果集：

title_id ytd_sales
-------- -----------
BU1032   4095
BU7832   4095
PC1035   8780
PC8888   4095
TC7777   4095

(5 row(s) affected)
B. 使用 > 和 < 代替 BETWEEN

本例使用大于 (>) 和小于 (<) 运算符，由于这些运算符是非包含的，所以返回不同的结果。

USE pubs
GO
SELECT title_id, ytd_sales
FROM titles
WHERE ytd_sales > 4095 AND ytd_sales < 12000
GO

下面是结果集：

title_id ytd_sales
-------- -----------
PC1035   8780

(1 row(s) affected)
C. 使用 NOT BETWEEN

本例找出一个指定范围（从 4,095 到 12,000）外的所有行。

USE pubs
GO
SELECT title_id, ytd_sales
FROM titles
WHERE ytd_sales NOT BETWEEN 4095 AND 12000
GO

下面是结果集：

title_id ytd_sales
-------- -----------
BU1111   3876
BU2075   18722
MC2222   2032
MC3021   22246
PS1372   375
PS2091   2045
PS2106   111
PS3333   4072
PS7777   3336
TC3218   375
TC4203   15096

(11 row(s) affected)

请参见

>（大于）

<（小于）

表达式

函数

运算符（逻辑运算符）

SELECT（子查询）

WHERE


binary 和 varbinary

固定长度 (binary) 的或可变长度 (varbinary) 的 binary 数据类型。

binary [ ( n ) ]

固定长度的 n 个字节二进制数据。N 必须从 1 到 8,000。存储空间大小为 n+4 字节。

varbinary [ ( n ) ]

n 个字节变长二进制数据。n 必须从 1 到 8,000。存储空间大小为实际输入数据长度 +4 个字节，而不是 n 个字节。输入的数据长度可能为 0 字节。在 SQL-92 中 varbinary 的同义词为 binary varying。

注释

如果在数据定义或变量声明语句中没有指定 n，默认长度为 1。如果没有用 CAST 函数指定 n，默认长度为 30。

当列数据项大小一致时应使用 binary。

当列数据项大小不一致时应使用 varbinary。

请参见

ALTER TABLE

CAST 和 CONVERT

CREATE TABLE

数据类型转换

数据类型

DECLARE @local_variable

DELETE

INSERT

SET @local_variable

UPDATE


BINARY_CHECKSUM

返回对表中的行或表达式列表计算的二进制校验值。BINARY_CHECKSUM 可用于检测表中行的更改。

语法

BINARY_CHECKSUM ( * | expression [ ,...n ] )

参数

*

指定对表中的所有列进行计算。BINARY_CHECKSUM 在计算中忽略具有不可比数据类型的列。不可比数据类型是 text、ntext、image、cursor 以及基本类型为前 4 个数据类型之一的 sql_variant。

expression

任何类型的表达式。BINARY_CHECKSUM 在计算中忽略具有不可比数据类型的表达式。

注释

在表中任一行上计算的 BINARY_CHECKSUM(*) 返回相同的值，只要随后没有修改行。BINARY_CHECKSUM(*) 将为大多数（但不是全部）行更改返回不同的值，并可用于检测大多数行修改。

BINARY_CHECKSUM 可应用在表达式列表上，并为给定的列表返回相同的值。如果任意两个表达式列表的对应元素具有相同的类型和字节表示法，则在这两个列表上应用的 BINARY_CHECKSUM 将返回相同的值。对于此定义，特定类型的 NULL 值被认为具有相同的字节表示法。

BINARY_CHECKSUM 和 CHECKSUM 具有相似的功能：它们可用于计算表达式列表上的校验值，且表达式的顺序将影响结果值。BINARY_CHECKSUM(*) 使用的列顺序是表或视图定义中指定的列顺序，包括计算列。

CHECKSUM 和 BINARY_CHECKSUM 仅为字符串数据类型返回不同的值，这类字符串的区域设置可能导致具有不同表示法的字符串进行等值比较。字符串数据类型为 char、varchar、nchar、nvarchar 或 sql_variant（如果 sql_variant 的基本类型是字符串数据类型）。例如，字符串"McCavity"和"Mccavity"的 BINARY_CHECKSUM 值不同。反之，在不区分大小写的服务器中，上述字符串的 CHECKSUM 返回相同的校验值。CHECKSUM 值不应与 BINARY_CHECKSUM 值进行比较。

示例
A.使用 BINARY_CHECKSUM 检测表中一行的改变。

本例使用 BINARY_CHECKSUM 来检测 Northwind 数据库的 Products 表中一行的改变。

/*Get the checksum value before the values in the specific rows (#13-15) are changed.*/
USE   Northwind
GO
CREATE   TABLE TableBC (ProductID int, bchecksum int)
INSERT   INTO TableBC
         SELECT   ProductID, BINARY_CHECKSUM(*)
         FROM      Products
/*TableBC contains a column of 77 checksum values corresponding to each row in the Products table.*/

--A large company bought products 13-15.
--The new company modified the products names and unit prices.
--Change the values of ProductsName and UnitPrice for rows 13, 14, and 15 of the Products table.*/
UPDATE   Products
SET   ProductName='Oishi Konbu', UnitPrice=5
WHERE   ProductName='Konbu'

UPDATE   Products
SET   ProductName='Oishi Tofu', UnitPrice=20
WHERE   ProductName='Tofu'

UPDATE   Products
SET   ProductName='Oishi Genen Shouyu', UnitPrice=12
WHERE   ProductName='Genen Shouyu'

--Determine the rows that have changed.
SELECT   ProductID
FROM      TableBC
WHERE   EXISTS   (
      SELECT   ProductID
      FROM      Products
      WHERE      Products.ProductID = TableBC.ProductID
      AND   BINARY_CHECKSUM(*) <> TableBC.bchecksum)

下面是结果集：

ProductID
13
14
15

请参见

CHECKSUM

CHECKSUM_AGG


bit

整型数据 1、0 或 NULL。

注释

不能对 bit 类型的列使用索引。

Microsoft® SQL Server™ 优化用于 bit 列的存储。如果一个表中有不多于 8 个的 bit 列，这些列将作为一个字节存储。如果表中有 9 到 16 个 bit 列，这些列将作为两个字节存储。更多列的情况依此类推。

请参见

ALTER TABLE

CAST 和 CONVERT

CREATE TABLE

数据类型转换

数据类型

DECLARE @local_variable

DELETE

INSERT

SET @local_variable

syscolumns

UPDATE


BREAK

退出最内层的 WHILE 循环。END 关键字之后的所有子句都将被忽略。IF 测试通常会激活 BREAK，但并不总是如此。

请参见

控制流语言

WHILE


BULK INSERT

以用户指定的格式复制一个数据文件至数据库表或视图中。

语法

BULK INSERT [ [ 'database_name'.][ 'owner' ].]{ 'table_name' FROM 'data_file' }
[ WITH
(
[ BATCHSIZE [ = batch_size ] ]
[ [ , ] CHECK_CONSTRAINTS ]
[ [ , ] CODEPAGE [ = 'ACP' | 'OEM' | 'RAW' | 'code_page' ] ]
[ [ , ] DATAFILETYPE [ =
{ 'char' | 'native'| 'widechar' | 'widenative' } ] ]
[ [ , ] FIELDTERMINATOR [ = 'field_terminator' ] ]
[ [ , ] FIRSTROW [ = first_row ] ]
[ [ , ] FIRE_TRIGGERS ]
[ [ , ] FORMATFILE = 'format_file_path' ]
[ [ , ] KEEPIDENTITY ]
[ [ , ] KEEPNULLS ]
[ [ , ] KILOBYTES_PER_BATCH [ = kilobytes_per_batch ] ]
[ [ , ] LASTROW [ = last_row ] ]
[ [ , ] MAXERRORS [ = max_errors ] ]
[ [ , ] ORDER ( { column [ ASC | DESC ] } [ ,...n ] ) ]
[ [ , ] ROWS_PER_BATCH [ = rows_per_batch ] ]
 [ [ , ] ROWTERMINATOR [ = 'row_terminator' ] ]
[ , [ TABLOCK ] ]
)
]

参数

'database_name'

是包含指定表或视图的数据库的名称。如果未指定，则系统默认为当前数据库。

'owner'

是表或视图所有者的名称。当执行大容量复制操作的用户拥有指定的表或视图时，owner 是可选项。如果没有指定 owner 并且执行大容量复制操作的用户不拥有指定的表或视图，则 Microsoft® SQL Server™ 将返回错误信息并取消大容量复制操作。

'table_name'

是大容量复制数据于其中的表或视图的名称。只能使用那些所有的列引用相同基表所在的视图。有关向视图中复制数据的限制的更多信息，请参见 INSERT。

'data_file'

是数据文件的完整路径，该数据文件包含要复制到指定表或视图的数据。BULK INSERT 从磁盘复制数据（包括网络、软盘、硬盘等）。

data_file 必须从运行 SQL Server 的服务器指定有效路径。如果 data_file 是远程文件，则请指定通用命名规则 (UNC) 名称。

BATCHSIZE [ = batch_size ]

指定批处理中的行数。每个批处理作为一个事务复制至服务器。SQL Server提交或回滚（在失败时）每个批处理的事务。默认情况下，指定数据文件中的所有数据是一个批处理。

CHECK_CONSTRAINTS

指定在大容量复制操作中检查 table_name 的任何约束。默认情况下，将会忽略约束。

CODEPAGE [ = 'ACP' | 'OEM' | 'RAW' | 'code_page' ]

指定该数据文件中数据的代码页。仅当数据含有字符值大于 127 或小于 32 的 char、varchar 或 text 列时，CODEPAGE 才是适用的。

CODEPAGE 值 | 描述
ACP | char、varchar 或 text 数据类型的列从 ANSI/Microsoft Windows® 代码页 ISO 1252 转换为 SQL Server 代码页。
OEM（默认值） | char、varchar 或 text 数据类型的列被从系统 OEM 代码页转换为 SQL Server 代码页。
RAW | 并不进行从一个代码页到另一个代码页的转换；这是最快的选项。
code_page | 特定的代码页号码，例如 850。

DATAFILETYPE [ = {'char' | 'native' | 'widechar' | 'widenative' } ]

指定 BULK INSERT 使用指定的默认值执行复制操作。

DATAFILETYPE 值 | 描述
char（默认值） | 从含有字符数据的数据文件执行大容量复制操作。
native | 使用 native（数据库）数据类型执行大容量复制操作。要装载的数据文件由大容量复制数据创建，该复制是用 bcp 实用工具从 SQL Server 进行的。
widechar | 从含有 Unicode 字符的数据文件中执行大容量复制操作。
widenative | 执行与 native 相同的大容量复制操作，不同之处是 char、varchar 和 text 列在数据文件中存储为 Unicode。要装载的数据文件由大容量复制数据创建，该复制是用 bcp 实用工具从 SQL Server 进行的。该选项是对 widechar 选项的一个更高性能的替代，并且它用于使用数据文件从一个运行 SQL Server 的计算机向另一个计算机传送数据。当传送含有 ANSI 扩展字符的数据时，使用该选项以便利用 native 模式的性能。

FIELDTERMINATOR [ = 'field_terminator' ]

指定用于 char 和 widechar 数据文件的字段终止符。默认的字段终止符是 \t（制表符）。

FIRSTROW [ = first_row ]

指定要复制的第一行的行号。默认值是 1，表示在指定数据文件的第一行。

FIRE_TRIGGERS

指定目的表中定义的任何插入触发器将在大容量复制操作过程中执行。如果没有指定 FIRE_TRIGGERS，将不执行任何插入触发器。

FORMATFILE [ = 'format_file_path' ]

指定一个格式文件的完整路径。格式文件描述了含有存储响应的数据文件，这些存储响应是使用 bcp 实用工具在相同的表或视图中创建的。格式文件应该用于以下情况：

  • 数据文件含有比表或视图更多或更少的列。

  • 列使用不同的顺序。

  • 列分割符发生变化。

  • 数据格式有其它的改变。通常，格式文件通过 bcp 实用工具创建并且根据需要用文本编辑器修改。有关更多信息，请参见 bcp 实用工具。

KEEPIDENTITY

指定标识列的值存在于导入文件中。如果没有指定 KEEPIDENTITY，在导入的数据文件中此列的标识值将被忽略，并且 SQL Server 将根据表创建时指定的种子值和增量值自动赋给一个唯一的值。假如数据文件不含该表或视图中的标识列，使用一个格式文件来指定在导入数据时，表或视图中的标识列应被忽略；SQL Server 自动为此列赋予唯一的值。有关详细信息，请参见 DBCC CHECKIDENT。

KEEPNULLS

指定在大容量复制操作中空列应保留一个空值，而不是对插入的列赋予默认值。

KILOBYTES_PER_BATCH [ = kilobytes_per_batch ]

指定每个批处理中数据的近似千字节数（KB）。默认情况下，KILOBYTES_PER_BATCH 未知。

LASTROW [ = last_row ]

指定要复制的最后一行的行号。默认值是 0，表示指定数据文件中的最后一行。

MAXERRORS [ = max_errors ]

指定在大容量复制操作取消之前可能产生的错误的最大数目。不能被大容量复制操作导入的每一行将被忽略并且被计为一次错误。如果没有指定 max_errors，默认值为 0。

ORDER ( { column [ ASC | DESC ] } [ ,...n ] )

指定数据文件中的数据如何排序。如果装载的数据根据表中的聚集索引进行排序，则可以提高大容量复制操作的性能。如果数据文件基于不同的顺序排序，或表中没有聚集索引，ORDER 子句将被忽略。给出的列名必须是目的表中有效的列。默认情况下，大容量插入操作假设数据文件未排序。

n

是表示可以指定多列的占位符。

ROWS_PER_BATCH [ = rows_per_batch ]

指定每一批处理数据的行数（即 rows_per_bacth）。当没有指定 BATCHSIZE 时使用，导致整个数据文件作为单个事务发送给服务器。服务器根据 rows_per_batch 优化大容量装载。默认情况下，ROWS_PER_BATCH 未知。

ROWTERMINATOR [ = 'row_terminator' ]

指定对于 char 和 widechar 数据文件要使用的行终止符。默认值是 \n（换行符）。

TABLOCK

指定对于大容量复制操作期间获取一个表级锁。如果表没有索引并且指定了 TABLOCK，则该表可以同时由多个客户端装载。默认情况下，锁定行为是由表选项 table lock on bulk load 决定的。只在大容量复制操作期间控制锁会减少表上的锁争夺，极大地提高性能。

注释

BULK INSERT 语句能在用户定义事务中执行。对于一个用 BULK INSERT 语句和 BATCHSIZE 子句将数据装载到使用多个批处理的表或视图中的用户定义事务来说，回滚它将回滚所有发送给 SQL Server 的批处理。

权限

只有 sysadmin 和 bulkadmin 固定服务器角色成员才能执行 BULK INSERT。

示例

本例从指定的数据文件中导入订单详细信息，该文件使用竖杠 (|) 字符作为字段终止符，使用 |\n 作为行终止符。

BULK INSERT Northwind.dbo.[Order Details]
   FROM 'f:\orders\lineitem.tbl'
   WITH
      (
         FIELDTERMINATOR = '|',
         ROWTERMINATOR = '|\n'
      )

本例指定 FIRE_TRIGGERS 参数。

BULK INSERT Northwind.dbo.[Order Details]
   FROM 'f:\orders\lineitem.tbl'
   WITH
     (
        FIELDTERMINATOR = '|',
        ROWTERMINATOR = ':\n',
        FIRE_TRIGGERS
      )

请参见

bcp 实用工具

排序规则

在不同排序规则间复制数据

使用 bcp 和 BULK INSERT

并行数据装载

sp_tableoption

使用格式文件


CASE

计算条件列表并返回多个可能结果表达式之一。

CASE 具有两种格式：

  • 简单 CASE 函数将某个表达式与一组简单表达式进行比较以确定结果。

  • CASE 搜索函数计算一组布尔表达式以确定结果。

两种格式都支持可选的 ELSE 参数。

语法

简单 CASE 函数：

CASE input_expression
WHEN when_expression THEN result_expression
[ ...n ]
[
        ELSE else_result_expression
END

CASE 搜索函数：

CASE
WHEN Boolean_expression THEN result_expression
[ ...n ]
[
        ELSE else_result_expression
END

参数

input_expression

是使用简单 CASE 格式时所计算的表达式。Input_expression 是任何有效的 Microsoft® SQL Server™ 表达式。

WHEN when_expression

使用简单 CASE 格式时 input_expression 所比较的简单表达式。When_expression 是任意有效的 SQL Server 表达式。Input_expression 和每个 when_expression 的数据类型必须相同，或者是隐性转换。

n

占位符，表明可以使用多个 WHEN when_expression THEN result_expression 子句或 WHEN Boolean_expression THEN result_expression 子句。

THEN result_expression

当 input_expression = when_expression 取值为 TRUE，或者 Boolean_expression 取值为 TRUE 时返回的表达式。result expression 是任意有效的 SQL Server 表达式。

ELSE else_result_expression

当比较运算取值不为 TRUE 时返回的表达式。如果省略此参数并且比较运算取值不为 TRUE，CASE 将返回 NULL 值。Else_result_expression 是任意有效的 SQL Server 表达式。Else_result_expression 和所有 result_expression 的数据类型必须相同，或者必须是隐性转换。

WHEN Boolean_expression

使用 CASE 搜索格式时所计算的布尔表达式。Boolean_expression 是任意有效的布尔表达式。

结果类型

从 result_expressions 和可选 else_result_expression 的类型集合中返回最高的优先规则类型。有关更多信息，请参见数据类型的优先顺序。

结果值
简单 CASE 函数：
  • 计算 input_expression，然后按指定顺序对每个 WHEN 子句的 input_expression = when_expression 进行计算。

  • 返回第一个取值为 TRUE 的 (input_expression = when_expression) 的 result_expression。

  • 如果没有取值为 TRUE 的 input_expression = when_expression，则当指定 ELSE 子句时 SQL Server 将返回 else_result_expression；若没有指定 ELSE 子句，则返回 NULL 值。
CASE 搜索函数：
  • 按指定顺序为每个 WHEN 子句的 Boolean_expression 求值。

  • 返回第一个取值为 TRUE 的 Boolean_expression 的 result_expression。

  • 如果没有取值为 TRUE 的 Boolean_expression，则当指定 ELSE 子句时 SQL Server 将返回 else_result_expression；若没有指定 ELSE 子句，则返回 NULL 值。
示例
A. 使用带有简单 CASE 函数的 SELECT 语句

在 SELECT 语句中，简单 CASE 函数仅检查是否相等，而不进行其它比较。下面的示例使用 CASE 函数更改图书分类显示，以使其更易于理解。

USE pubs
GO
SELECT   Category =
      CASE type
         WHEN 'popular_comp' THEN 'Popular Computing'
         WHEN 'mod_cook' THEN 'Modern Cooking'
         WHEN 'business' THEN 'Business'
         WHEN 'psychology' THEN 'Psychology'
         WHEN 'trad_cook' THEN 'Traditional Cooking'
         ELSE 'Not yet categorized'
      END,
   CAST(title AS varchar(25)) AS 'Shortened Title',
   price AS Price
FROM titles
WHERE price IS NOT NULL
ORDER BY type, price
COMPUTE AVG(price) BY type
GO

下面是结果集：

Category            Shortened Title           Price
------------------- ------------------------- --------------------------
Business            You Can Combat Computer S 2.99
Business            Cooking with Computers: S 11.95
Business            The Busy Executive's Data 19.99
Business            Straight Talk About Compu 19.99

                                              avg
                                              ==========================
                                              13.73

Category            Shortened Title           Price
------------------- ------------------------- --------------------------
Modern Cooking      The Gourmet Microwave     2.99
Modern Cooking      Silicon Valley Gastronomi 19.99

                                              avg
                                              ==========================
                                              11.49

Category            Shortened Title           Price
------------------- ------------------------- --------------------------
Popular Computing   Secrets of Silicon Valley 20.00
Popular Computing   But Is It User Friendly?  22.95

                                              avg
                                              ==========================
                                              21.48

Category            Shortened Title           Price
------------------- ------------------------- --------------------------
Psychology          Life Without Fear         7.00
Psychology          Emotional Security: A New 7.99
Psychology          Is Anger the Enemy?       10.95
Psychology          Prolonged Data Deprivatio 19.99
Psychology          Computer Phobic AND Non-P 21.59

                                              avg
                                              ==========================
                                              13.50

Category            Shortened Title           Price
------------------- ------------------------- --------------------------
Traditional Cooking Fifty Years in Buckingham 11.95
Traditional Cooking Sushi, Anyone?            14.99
Traditional Cooking Onions, Leeks, and Garlic 20.95

                                              avg
                                              ==========================
                                              15.96

(21 row(s) affected)
B. 使用带有简单 CASE 函数和 CASE 搜索函数的 SELECT 语句

在 SELECT 语句中，CASE 搜索函数允许根据比较值在结果集内对值进行替换。下面的示例根据图书的价格范围将价格（money 列）显示为文本注释。

USE pubs
GO
SELECT    'Price Category' =
      CASE
         WHEN price IS NULL THEN 'Not yet priced'
         WHEN price < 10 THEN 'Very Reasonable Title'
         WHEN price >= 10 and price < 20 THEN 'Coffee Table Title'
         ELSE 'Expensive book!'
      END,
   CAST(title AS varchar(20)) AS 'Shortened Title'
FROM titles
ORDER BY price
GO

下面是结果集：

Price Category        Shortened Title
--------------------- --------------------
Not yet priced        Net Etiquette
Not yet priced        The Psychology of Co
Very Reasonable Title The Gourmet Microwav
Very Reasonable Title You Can Combat Compu
Very Reasonable Title Life Without Fear
Very Reasonable Title Emotional Security:
Coffee Table Title    Is Anger the Enemy?
Coffee Table Title    Cooking with Compute
Coffee Table Title    Fifty Years in Bucki
Coffee Table Title    Sushi, Anyone?
Coffee Table Title    Prolonged Data Depri
Coffee Table Title    Silicon Valley Gastr
Coffee Table Title    Straight Talk About
Coffee Table Title    The Busy Executive's
Expensive book!       Secrets of Silicon V
Expensive book!       Onions, Leeks, and G
Expensive book!       Computer Phobic And
Expensive book!       But Is It User Frien

(18 row(s) affected)
C. 使用带有 SUBSTRING 和 SELECT 的 CASE 函数

下面的示例使用 CASE 和 THEN 生成一个有关作者、图书标识号和每个作者所著图书类型的列表。

USE pubs
SELECT SUBSTRING((RTRIM(a.au_fname) + ' '+
   RTRIM(a.au_lname) + ' '), 1, 25) AS Name, a.au_id, ta.title_id,
   Type =
  CASE
    WHEN SUBSTRING(ta.title_id, 1, 2) = 'BU' THEN 'Business'
    WHEN SUBSTRING(ta.title_id, 1, 2) = 'MC' THEN 'Modern Cooking'
    WHEN SUBSTRING(ta.title_id, 1, 2) = 'PC' THEN 'Popular Computing'
    WHEN SUBSTRING(ta.title_id, 1, 2) = 'PS' THEN 'Psychology'
    WHEN SUBSTRING(ta.title_id, 1, 2) = 'TC' THEN 'Traditional Cooking'
  END
FROM titleauthor ta JOIN authors a ON ta.au_id = a.au_id

下面是结果集：

Name                      au_id       title_id Type
------------------------- ----------- -------- -------------------
Johnson White             172-32-1176 PS3333   Psychology
Marjorie Green            213-46-8915 BU1032   Business
Marjorie Green            213-46-8915 BU2075   Business
Cheryl Carson             238-95-7766 PC1035   Popular Computing
Michael O'Leary           267-41-2394 BU1111   Business
Michael O'Leary           267-41-2394 TC7777   Traditional Cooking
Dean Straight             274-80-9391 BU7832   Business
Abraham Bennet            409-56-7008 BU1032   Business
Ann Dull                  427-17-2319 PC8888   Popular Computing
Burt Gringlesby           472-27-2349 TC7777   Traditional Cooking
Charlene Locksley         486-29-1786 PC9999   Popular Computing
Charlene Locksley         486-29-1786 PS7777   Psychology
Reginald Blotchet-Halls   648-92-1872 TC4203   Traditional Cooking
Akiko Yokomoto            672-71-3249 TC7777   Traditional Cooking
Innes del Castillo        712-45-1867 MC2222   Modern Cooking
Michel DeFrance           722-51-5454 MC3021   Modern Cooking
Stearns MacFeather        724-80-9391 BU1111   Business
Stearns MacFeather        724-80-9391 PS1372   Psychology
Livia Karsen              756-30-7391 PS1372   Psychology
Sylvia Panteley           807-91-6654 TC3218   Traditional Cooking
Sheryl Hunter             846-92-7186 PC8888   Popular Computing
Anne Ringer               899-46-2035 MC3021   Modern Cooking
Anne Ringer               899-46-2035 PS2091   Psychology
Albert Ringer             998-72-3567 PS2091   Psychology
Albert Ringer             998-72-3567 PS2106   Psychology

(25 row(s) affected)

请参见

数据类型转换

数据类型

表达式

SELECT

系统函数

UPDATE

WHERE


CAST 和 CONVERT

将某种数据类型的表达式显式转换为另一种数据类型。CAST 和 CONVERT 提供相似的功能。

语法

使用 CAST：

CAST ( expression AS data_type )

使用 CONVERT：

CONVERT (data_type[(length)], expression [, style])

参数

expression

是任何有效的 Microsoft® SQL Server™ 表达式。有关更多信息，请参见表达式。

data_type

目标系统所提供的数据类型，包括 bigint 和 sql_variant。不能使用用户定义的数据类型。有关可用的数据类型的更多信息，请参见数据类型。

length

nchar、nvarchar、char、varchar、binary 或 varbinary 数据类型的可选参数。

style

日期格式样式，借以将 datetime 或 smalldatetime 数据转换为字符数据（nchar、nvarchar、char、varchar、nchar 或 nvarchar 数据类型）；或者字符串格式样式，借以将 float、real、money 或 smallmoney 数据转换为字符数据（nchar、nvarchar、char、varchar、nchar 或 nvarchar 数据类型）。

SQL Server 支持使用科威特算法的阿拉伯样式中的数据格式。

在表中，左侧的两列表示将 datetime 或 smalldatetime 转换为字符数据的 style 值。给 style 值加 100，可获得包括世纪数位的四位年份 (yyyy)。

不带世纪数位 (yy) | 带世纪数位 (yyyy) | 标准 | 输入/输出**
- | 0 或 100 (*) | 默认值 | mon dd yyyy hh:miAM（或 PM）
1 | 101 | 美国 | mm/dd/yyyy
2 | 102 | ANSI | yy.mm.dd
3 | 103 | 英国/法国 | dd/mm/yy
4 | 104 | 德国 | dd.mm.yy
5 | 105 | 意大利 | dd-mm-yy
6 | 106 | - | dd mon yy
7 | 107 | - | mon dd, yy
8 | 108 | - | hh:mm:ss
- | 9 或 109 (*) | 默认值 + 毫秒 | mon dd yyyy hh:mi:ss:mmmAM（或 PM）
10 | 110 | 美国 | mm-dd-yy
11 | 111 | 日本 | yy/mm/dd
12 | 112 | ISO | yymmdd
- | 13 或 113 (*) | 欧洲默认值 + 毫秒 | dd mon yyyy hh:mm:ss:mmm(24h)
14 | 114 | - | hh:mi:ss:mmm(24h)
- | 20 或 120 (*) | ODBC 规范 | yyyy-mm-dd hh:mm:ss[.fff]
- | 21 或 121 (*) | ODBC 规范（带毫秒） | yyyy-mm-dd hh:mm:ss[.fff]
- | 126(***) | ISO8601 | yyyy-mm-dd Thh:mm:ss:mmm（不含空格）
- | 130* | 科威特 | dd mon yyyy hh:mi:ss:mmmAM
- | 131* | 科威特 | dd/mm/yy hh:mi:ss:mmmAM

* 默认值（style 0 或 100、9 或 109、13 或 113、20 或 120、21 或 121）始终返回世纪数位 (yyyy)。
** 当转换为 datetime 时输入；当转换为字符数据时输出。
*** 专门用于 XML。对于从 datetime 或 smalldatetime 到 character 数据的转换，输出格式如表中所示。对于从 float、money 或 smallmoney 到 character 数据的转换，输出等同于 style 2。对于从 real 到 character 数据的转换，输出等同于 style 1。

重要 默认情况下，SQL Server 根据截止年份 2049 解释两位数字的年份。即，两位数字的年份 49 被解释为 2049，而两位数字的年份 50 被解释为 1950。许多客户端应用程序（例如那些基于 OLE 自动化对象的客户端应用程序）都使用 2030 作为截止年份。SQL Server 提供一个配置选项（"两位数字的截止年份"），借以更改 SQL Server 所使用的截止年份并对日期进行一致性处理。然而最安全的办法是指定四位数字年份。

当从 smalldatetime 转换为字符数据时，包含秒或毫秒的样式将在这些位置上显示零。当从 datetime 或 smalldatetime 值进行转换时，可以通过使用适当的 char 或 varchar 数据类型长度来截断不需要的日期部分。

下表显示了从 float 或 real 转换为字符数据时的 style 值。

值 | 输出
0（默认值） | 最大为 6 位数。根据需要使用科学记数法。
1 | 始终为 8 位值。始终使用科学记数法。
2 | 始终为 16 位值。始终使用科学记数法。

在下表中，左列表示从 money 或 smallmoney 转换为字符数据时的 style 值。

值 | 输出
0（默认值） | 小数点左侧每三位数字之间不以逗号分隔，小数点右侧取两位数，例如 4235.98。
1 | 小数点左侧每三位数字之间以逗号分隔，小数点右侧取两位数，例如 3,510.92。
2 | 小数点左侧每三位数字之间不以逗号分隔，小数点右侧取四位数，例如 4235.9819。

返回类型

返回与 data type 0 相同的值。

注释

隐性转换指那些没有指定 CAST 或 CONVERT 函数的转换。而显式转换指那些已指定了所需 CAST (CONVERT) 函数的转换。下面的图表显示了所有可用于 SQL Server 系统提供的数据类型的显式和隐性转换，这些数据类型包括 bigint 和 sql_variant。

说明 因为 Unicode 数据始终使用偶数位字节，所以当在 binary 或 varbinary 数据类型与 Unicode 所支持的数据类型之间进行转换时会使用提示。例如，此转换不返回 41 的十六进制值，而是返回 4100 的十六进制值：SELECT CAST(CAST(0x41 AS nvarchar) AS varbinary)

不支持 text 和 image 数据类型的自动数据类型转换。可以将 text 数据显式转换为字符数据，将 image 数据显性转换为 binary 或 varbinary 数据，但是最大长度为 8000。如果尝试进行不正确的转换（例如，将包含字母的字符表达式转换为 int），则 SQL Server 会产生错误信息。

当 CAST 或 CONVERT 的输出是字符串并且输入也是字符串时，输出与输入具有相同的排序规则和排序规则标签。如果输入不是字符串，则输出采用数据库的默认排序规则及强制默认的排序规则标签。有关更多信息，请参见排序规则的优先顺序。

若要给输出指派不同的排序规则，请将 COLLATE 子句应用到 CAST 或 CONVERT 函数的结果表达式中。例如：

SELECT CAST('abc' AS varchar(5)) COLLATE French_CS_AS

不存在有关赋值的从 sql_variant 数据类型进行的隐性转换，但是存在转换为 sql_variant 的隐性转换。

将字符或二进制表达式（char、nchar、nvarchar、varchar、binary 或 varbinary）转换为不同数据类型的表达式时，数据可能会被截断，只显示一部分，或者因为结果太短无法显示而返回错误。除下表中所显示的转换外，转换为 char、varchar、nchar、nvarchar、binary 和 varbinary 时将被截断。

被转换的数据类型 | 转换为的数据类型 | 结果
int、smallint 或 tinyint | char | *
 | varchar | *
 | nchar | E
 | nvarchar | E
money、smallmoney、numeric、decimal、float 或 real | char | E
 | varchar | E
 | nchar | E
 | nvarchar | E

* 结果长度太短而无法显示。
E 因为结果长度太短无法显示而返回错误。

Microsoft SQL Server 仅保证往返转换（即，从原始数据类型进行转换后又返回原始数据类型）在各版本间产生相同值。下面的示例显示往返转换：

DECLARE @myval decimal (5, 2)
SET @myval = 193.57
SELECT CAST(CAST(@myval AS varbinary(20)) AS decimal(10,5))
-- Or, using CONVERT
SELECT CONVERT(decimal(10,5), CONVERT(varbinary(20), @myval))

例如，不要尝试构造 binary 值并将它们转换为数字数据类型分类的数据类型。SQL Server 并不保证 decimal 或 numeric 数据类型转换为 binary 的结果在 SQL Server 各版本间相同。

下面的示例显示了由于太短而无法显示的结果表达式。

USE pubs
SELECT SUBSTRING(title, 1, 25) AS Title, CAST(ytd_sales AS char(2))
FROM titles
WHERE type = 'trad_cook'

下面是结果集：

Title
------------------------- --
Onions, Leeks, and Garlic *
Fifty Years in Buckingham *
Sushi, Anyone?            *

(3 row(s) affected)

当具有不同小数位数的数据类型进行转换时，值将被截断为最精确的数位。例如，SELECT CAST(10.6496 AS int) 的结果为 10。

转换时，若目标数据类型的小数位数小于源数据类型的小数位数，则要转换的值将被四舍五入。例如，CAST(10.3496847 AS money) 的结果是 $10.3497。

当将非数字类型的 char、nchar、varchar 或 nvarchar 数据转换为 int、float、numeric 或 decimal 时，SQL Server 将返回错误信息。当将空字符串 (" ") 转换为 numeric 或 decimal 时，SQL Server 也将返回错误信息。

使用二进制字符串数据

当 binary 或 varbinary 数据转换为字符数据并且在 x 后面指定了奇数位的值时，SQL Server 在 x 后面添加 0（零）以成为偶数位值。

二进制数据包含从 0 到 9 和从 A 到 F（或从 a 到 f）的字符，每两个字符为一组。二进制字符串必须以 0x 开头。例如，若要输入 FF，请键入 0xFF。最大值是一个 8000 字节的二进制值，每个字节的最大值都是 FF。Binary 数据类型不能用于十六进制数据，而是用于位模式。对于存储为二进制数据的十六进制数字的转换和计算结果，无法保证其准确性。

当指定 binary 数据类型的长度时，每两个字符被算作是一个单位长度。长度 10 表示将输入 10 个双字符组。

由 0x 表示的空二进制字符串可以储存为二进制数据。

示例
A. 同时使用 CAST 和 CONVERT

每个示例都将检索书名（这些图书的截止当前销售额的第一位数字为 3），并将这些图书的 ytd_sales 转换为 char(20)。

-- Use CAST.
USE pubs
GO
SELECT SUBSTRING(title, 1, 30) AS Title, ytd_sales
FROM titles
WHERE CAST(ytd_sales AS char(20)) LIKE '3%'
GO

-- Use CONVERT.
USE pubs
GO
SELECT SUBSTRING(title, 1, 30) AS Title, ytd_sales
FROM titles
WHERE CONVERT(char(20), ytd_sales) LIKE '3%'
GO

下面是任一查询的结果集：

Title                          ytd_sales
------------------------------ -----------
Cooking with Computers: Surrep 3876
Computer Phobic AND Non-Phobic 375
Emotional Security: A New Algo 3336
Onions, Leeks, and Garlic: Coo 375

(4 row(s) affected)
B. 使用带有算术运算符的 CAST

下面的示例通过将总的截止当前销售额 (ytd_sales) 与每本图书的价格 (price) 相除，进行单独列计算 (Copies)。在四舍五入到最接近的整数后，此结果将转换为 int 数据类型。

USE pubs
GO
SELECT CAST(ROUND(ytd_sales/price, 0) AS int) AS 'Copies'
FROM titles
GO

下面是结果集：

Copies
------
205
324
6262
205
102
7440
NULL
383
205
NULL
17
187
16
204
418
18
1263
273

(18 row(s) affected)
C. 使用 CAST 进行串联

下面的示例使用 CAST 数据类型转换函数来串联非字符、非二进制表达式。

USE pubs
GO
SELECT 'The price is ' + CAST(price AS varchar(12))
FROM titles
WHERE price > 10.00
GO

下面是结果集：

------------------
The price is 19.99
The price is 11.95
The price is 19.99
The price is 19.99
The price is 22.95
The price is 20.00
The price is 21.59
The price is 10.95
The price is 19.99
The price is 20.95
The price is 11.95
The price is 14.99

(12 row(s) affected)
D. 使用 CAST 获得更多易读文本

下面的示例在选择列表中使用 CAST 将 title 列转换为 char(50) 列，这样结果将更加易读。

USE pubs
GO
SELECT CAST(title AS char(50)), ytd_sales
FROM titles
WHERE type = 'trad_cook'
GO

下面是结果集：

                                                       ytd_sales
--------------------------------------------------     ---------
Onions, Leeks, and Garlic: Cooking Secrets of the      375
Fifty Years in Buckingham Palace Kitchens              15096
Sushi, Anyone?                                         4095

(3 row(s) affected)
E. 使用带有 LIKE 子句的 CAST

下面的示例将 int 列（ytd_sales 列）转换为 char(20) 列，以便使用 LIKE 子句。

USE pubs
GO
SELECT title, ytd_sales
FROM titles
WHERE CAST(ytd_sales AS char(20)) LIKE '15%'
   AND type = 'trad_cook'
GO

下面是结果集：

title                                                        ytd_sales
------------------------------------------------------------ -----------
Fifty Years in Buckingham Palace Kitchens                    15096

(1 row(s) affected)

请参见

数据类型转换

SELECT

系统函数


CEILING

返回大于或等于所给数字表达式的最小整数。

语法

CEILING ( numeric_expression )

参数

numeric_expression

是精确数字或近似数字数据类型类别的表达式（bit 数据类型除外）。

返回类型

返回与 numeric_expression 相同的类型。

示例

下面的示例显示使用 CEILING 函数的正数、负数和零值。

SELECT CEILING($123.45), CEILING($-123.45), CEILING($0.0)
GO

下面是结果集：

--------- --------- -------------------------
124.00    -123.00    0.00

(1 row(s) affected)

请参见

系统函数


CHAR

将 int ASCII 代码转换为字符的字符串函数。

语法

CHAR ( integer_expression )

参数

integer_expression

介于 0 和 255 之间的整数。如果整数表达式不在此范围内，将返回 NULL 值。

返回类型

char(1)

注释

CHAR 可用于将控制字符插入字符串中。下表显示了一些常用的控制字符。

控制字符 | 值
制表符 | CHAR(9)
换行符 | CHAR(10)
回车 | CHAR(13)

示例
A. 使用 ASCII 和 CHAR 打印字符串的 ASCII 值

下面的示例将打印字符串"New Moon"中每个字符的 ASCII 值和字符。

SET TEXTSIZE 0
-- Create variables for the character string and for the current
-- position in the string.
DECLARE @position int, @string char(8)
-- Initialize the current position and the string variables.
SET @position = 1
SET @string = 'New Moon'
WHILE @position <= DATALENGTH(@string)
   BEGIN
   SELECT ASCII(SUBSTRING(@string, @position, 1)),
      CHAR(ASCII(SUBSTRING(@string, @position, 1)))
   SET @position = @position + 1
   END
GO

下面是结果集：

----------- -
78          N

----------- -
101         e

----------- -
119         w

----------- -
32

----------- -
77          M

----------- -
111         o

----------- -
111         o

----------- -
110         n

----------- -
B. 使用 CHAR 插入控制字符

下例使用 CHAR(13) 在不同的行上打印名称、地址与城市信息，并以文本方式返回结果。

USE Northwind
SELECT FirstName + ' ' + LastName, + CHAR(13) + Address,
   + CHAR(13) + City, + Region
FROM Employees
WHERE EmployeeID = 1

下面是结果集：

Nancy Davolio
507 - 20th Ave. E.
Apt. 2A
Seattle            WA

说明 在此记录中，Address 列中的数据也包含一个控制字符。

请参见

+（字符串串联）

字符串函数


char 和 varchar

固定长度 (char) 或可变长度 (varchar) 字符数据类型。

char[(n)]

长度为 n 个字节的固定长度且非 Unicode 的字符数据。n 必须是一个介于 1 和 8,000 之间的数值。存储大小为 n 个字节。char 在 SQL-92 中的同义词为 character。

varchar[(n)]

长度为 n 个字节的可变长度且非 Unicode 的字符数据。n 必须是一个介于 1 和 8,000 之间的数值。存储大小为输入数据的字节的实际长度，而不是 n 个字节。所输入的数据字符长度可以为零。varchar 在 SQL-92 中的同义词为 char varying 或 character varying。

注释

如果没有在数据定义或变量声明语句中指定 n，则默认长度为 1。如果没有使用 CAST 函数指定 n，则默认长度为 30。

将为使用 char 或 varchar 的对象被指派数据库的默认排序规则，除非用 COLLATE 子句另外指派了特定的排序规则。该排序规则控制用于存储字符数据的代码页。

支持多语言的站点应考虑使用 Unicode nchar 或 nvarchar 数据类型以尽量减少字符转换问题。如果使用 char 或 varchar：

  • 如果希望列中的数据值大小接近一致，请使用 char。

  • 如果希望列中的数据值大小显著不同，请使用 varchar。

如果执行 CREATE TABLE 或 ALTER TABLE 时 SET ANSI_PADDING 为 OFF，则一个定义为 NULL 的 char 列将被作为 varchar 处理。

当排序规则代码页使用双字节字符时，存储大小仍然为 n 个字节。根据字符串的不同，n 个字节的存储大小可能小于 n 个字符。

请参见

CAST 和 CONVERT

COLLATE

排序规则

数据类型转换

数据类型

sp_dbcmptlevel

指定排序规则

使用 char 和 varchar 数据

使用 Unicode 数据


CHARINDEX

返回字符串中指定表达式的起始位置。

语法

CHARINDEX ( expression1 , expression2 [ , start_location ] )

参数

expression1

一个表达式，其中包含要寻找的字符的次序。expression1 是一个短字符数据类型分类的表达式。

expression2

一个表达式，通常是一个用于搜索指定序列的列。expression2 属于字符串数据类型分类。

start_location

在 expression2 中搜索 expression1 时的起始字符位置。如果没有给定 start_location，而是一个负数或零，则将从 expression2 的起始位置开始搜索。

返回类型

int

注释

如果 expression1 或 expression2 之一属于 Unicode 数据类型（nvarchar 或 nchar）而另一个不属于，则将另一个转换为 Unicode 数据类型。

如果 expression1 或 expression2 之一为 NULL 值，则当数据库兼容级别为 70 或更大时，CHARINDEX 返回 NULL 值。当数据库兼容级别为 65 或更小时，CHARINDEX 仅在 expression1 和 expression2 都为 NULL 时返回 NULL 值。

如果在 expression2 内没有找到 expression1，则 CHARINDEX 返回 0。

示例

第一个代码示例返回序列"wonderful"在 titles 表的 notes 列中开始的位置。第二个示例使用可选的 start_location 参数从 notes 列的第五个字符开始寻找"wonderful"。第三个示例显示了当 expression2 内找不到 expression1 时的结果集。

USE pubs
GO
SELECT CHARINDEX('wonderful', notes)
FROM titles
WHERE title_id = 'TC3218'
GO

-- Use the optional start_location parameter to start searching
-- for wonderful starting with the fifth character in the notes
-- column.
USE pubs
GO
SELECT CHARINDEX('wonderful', notes, 5)
FROM titles
WHERE title_id = 'TC3218'
GO

下面是第一个查询和第二个查询的结果集：

-----------
46

(1 row(s) affected)

USE pubs
GO
SELECT CHARINDEX('wondrous', notes)
FROM titles
WHERE title_id='TC3218'
GO

下面是结果集。
-----------
0

(1 row(s) affected)

请参见

+（字符串串联）

字符串函数


CHECKPOINT

强制将当前数据库的所有脏页写到磁盘上。脏页是指在输入到高速缓冲存储器后被修改的数据或日志页，但这些修改还没有写到磁盘上。有关日志截断的更多信息，请参见截断事务日志。

语法

CHECKPOINT

注释

CHECKPOINT 语句可在后来的恢复中节省时间，方法是创建一个点以确保所有对数据和日志页的修改都写到磁盘上。

检查点也会在下列情况中出现：

  • 当用 ALTER DATABASE 更改了某数据库选项时。检查点在更改选项的数据库中执行。

  • 当服务器停止时，在服务器上的每个数据库中执行检查点。停止每个数据库 Microsoft® SQL Server™ 2000 检查点的方法是：
    • 使用 SQL Server 服务管理器。

    • 使用 SQL Server 企业管理器。

    • 使用 SHUTDOWN 语句。

    • 在命令提示行使用 Windows NT 命令 net stop mssqlserver。

    • 使用 Windows NT 控制面板中的 services 图标，选择 mssqlserver 服务，并单击"停止"按钮。

SHUTDOWN WITH NOWAIT 语句关闭 SQL Server 而不在每个数据库中执行检查点。这可能会导致后来重新启动以恢复服务器上的数据库的时间比通常时间长。

SQL Server 2000 还在任何至少发生下面两种情况的数据库上自动执行检查点：

  • 日志的活动部分超出了在 recovery interval 服务器配置选项中指定的时间总量中服务器可以恢复的大小。

  • 如果数据库处于日志截断模式并且日志的百分之七十已满。

当下列条件都属实时，数据库就处于日志截断模式：

  • 数据库使用的是简单恢复模式。

  • 当最后一个引用数据库的 BACKUP DATABASE 语句被执行后，下面事件中的某一个将会发生：
    • 引用数据库的 BACKUP LOG 语句将在带有 NO_LOG 或 TRUNCATE_ONLY 子句的情况下被执行。

    • 在数据库中执行一个无日志记录的操作，例如执行一个无日志记录的大容量复制操作或一个无日志记录的 WRITETEXT 语句。

    • 执行一个在数据库中添加或删除文件的 ALTER DATABASE 语句。
权限

CHECKPOINT 权限默认授予 sysadmin 固定服务器角色以及 db_owner 和 db_backupoperator 固定数据库角色的成员且不可转让。

请参见

ALTER DATABASE

检查点和日志的活动部分

recovery interval 选项

设置数据库选项

SHUTDOWN


CHECKSUM

返回在表的行上或在表达式列表上计算的校验值。CHECKSUM 用于生成哈希索引。

语法

CHECKSUM ( * | expression [ ,...n ] )

参数

*

指定在表的所有列上进行计算。如果有任一列是非可比数据类型，则 CHECKSUM 返回错误。不可比数据类型是 text、ntext、image、cursor 以及基本类型为前 4 个数据类型之一的 sql_variant。

expression

是除非可比数据类型之外的任何类型的表达式。

返回类型

int

注释

CHECKSUM 在其参数列表上计算一个称为校验值的哈希值。此哈希值用于生成哈希索引。如果 CHECKSUM 的参数是列，且在计算的 CHECKSUM 值上生成索引，则其结果是可用于在列上等价搜索的哈希索引。

CHECKSUM 满足哈希函数的下列属性：在使用等于 (=) 运算符比较时，如果两个列表的相应元素具有相同类型且"相等"，则在任何两个表达式列表上应用的 CHECKSUM 将返回同一值。这种定义的目的在于：给定类型的 NULL 值被作为"相等"进行比较。如果表达式列表中的某个值发生变化，那么列表的校验值通常也会变化。但只在极少数情况下，校验值会保持不变。

BINARY_CHECKSUM 和 CHECKSUM 具有相似的功能：它们可用于计算表达式列表上的校验值，且表达式的顺序将影响结果值。在 CHECKSUM(*) 中使用的列顺序是在表或视图定义中指定的列顺序，包括计算列。

CHECKSUM 和 BINARY_CHECKSUM 仅为字符串数据类型返回不同的值，这类字符串的区域设置可能导致具有不同表示法的字符串进行等值比较。字符串数据类型是 char、varchar、nchar、nvarchar 或 sql_variant（如果其基本类型是字符串数据类型）。例如，字符串"McCavity"和"Mccavity"的 BINARY_CHECKSUM 值不同。反之，在不区分大小写的服务器中，上述字符串的 CHECKSUM 返回相同的校验值。CHECKSUM 值不应与 BINARY_CHECKSUM 值进行比较。

示例
使用 CHECKSUM 生成哈希索引

CHECKSUM 函数可以用于生成哈希索引。通过将计算校验值列添加到索引的表中，然后在校验值列上生成索引来生成哈希索引。

-- Create a checksum index.
SET ARITHABORT ON
USE Northwind
GO
ALTER TABLE Products
ADD cs_Pname AS checksum(ProductName)
CREATE INDEX Pname_index ON Products (cs_Pname)

校验值索引可用作哈希索引，尤其是当要索引的列为较长的字符列时可以提高索引速度。校验值索引可用于等价搜索。

/*Use the index in a SELECT query. Add a second search
condition to catch stray cases where checksums match,
but the values are not identical.*/
SELECT *
FROM Products
WHERE checksum(N'Vegie-spread') = cs_Pname
AND ProductName = N'Vegie-spread'

在计算列上创建的索引将具体化为校验值列，对 ProductName 值所做的任何更改将传播到校验值列。索引也可以直接建立在索引的列上。然而，如果键值较长，则很可能不执行校验值索引甚至常规索引。

请参见

BINARY_CHECKSUM

CHECKSUM_AGG


CHECKSUM_AGG

返回组中值的校验值。空值将被忽略。

语法

CHECKSUM_AGG ( [ ALL | DISTINCT ] expression )

参数

ALL

对所有的值进行聚合函数运算。ALL 是默认设置。

DISTINCT

指定 CHECKSUM_AGG 返回唯一值的校验值。

expression

常量、列或函数以及数字、位运算和字符串运算符的任意组合。expression 是一个 int 数据类型的表达式。不允许进行聚合函数运算和子查询。

返回类型

将所有 expression 值的校验值作为 int 返回。

注释

CHECKSUM_AGG 可与 BINARY_CHECKSUM 一起使用以检测表中的更改。

表中行的顺序不影响 CHECKSUM_AGG 的结果。此外，CHECKSUM_AGG 函数还可与 DISTINCT 关键字和 GROUP BY 子句一起使用。

如果表达式列表中的某个值发生变化，那么列表的校验值通常也会变化。但只在极少数情况下，校验值会保持不变。

CHECKSUM_AGG 与其它聚合函数具有相似的功能。有关更多信息，请参见聚合函数。

示例
A. 使用带有 BINARY_CHECKSUM 的 CHECKSUM_AGG 检测表中的更改。

下面的示例使用带有 BINARY_CHECKSUM 函数的 CHECKSUM_AGG 检测 Products 表中的更改。

USE Northwind
GO
SELECT   CHECKSUM_AGG(BINARY_CHECKSUM(*))
FROM   Products
B. 使用带 BINARY_CHECKSUM 的 CHECKSUM_AGG 检测表中列的更改。

下面的示例检测 Northwind 数据库中 Products 表的 UnitsInStock 列中的更改。

--Get the checksum value before the column value is changed.
USE   Northwind
GO
SELECT   CHECKSUM_AGG(CAST(UnitsInStock AS int))
FROM   Products

下面是结果集：

57

--Change the value of a row in the column
UPDATE   Products   --
SET   UnitsInStock=135
WHERE   UnitsInStock=125

--Get the checksum of the modified column.
SELECT   CHECKSUM_AGG(CAST(UnitsInStock AS int))
FROM   Products

下面是结果集：

195

请参见

BINARY_CHECKSUM

CHECKSUM


CLOSE

通过释放当前结果集并且解除定位游标的行上的游标锁定，关闭一个开放的游标。CLOSE 使得数据结构可以重新打开，但不允许提取和定位更新，直到游标重新打开为止。CLOSE 必须在一个开放游标上颁发，不允许在一个仅仅声明的游标或一个已经关闭的游标上颁发。

语法

CLOSE { { [ GLOBAL ] cursor_name } | cursor_variable_name }

参数

GLOBAL

指定 cursor_name 指的是全局游标。

cursor_name

开放游标的名称。如果全局游标和局部游标都使用 cursor_name 作为它们的名称，那么当指定 GLOBAL 时 cursor_name 引用全局游标；否则，cursor_name 引用局部游标。

cursor_variable_name

与开放游标关联的游标变量的名称。

示例

下面的示例显示在一个基于游标的进程中 CLOSE 语句的正确位置。

USE pubs
GO

DECLARE authorcursor CURSOR FOR
SELECT au_fname, au_lname
FROM authors
ORDER BY au_fname, au_lname

OPEN authorcursor
FETCH NEXT FROM authorcursor
WHILE @@FETCH_STATUS = 0
BEGIN
   FETCH NEXT FROM authorcursor
END

CLOSE authorcursor
DEALLOCATE authorcursor
GO

请参见

游标

DEALLOCATE

FETCH

OPEN


COALESCE

返回其参数中第一个非空表达式。

语法

COALESCE ( expression [ ,...n ] )

参数

expression

任何类型的表达式。

n

表示可以指定多个表达式的占位符。所有表达式必须是相同类型，或者可以隐性转换为相同的类型。

返回类型

将相同的值作为 expression 返回。

注释

如果所有自变量均为 NULL，则 COALESCE 返回 NULL 值。

COALESCE(expression1,...n) 与此 CASE 函数等价：

CASE
   WHEN (expression1 IS NOT NULL) THEN expression1
   ...
   WHEN (expressionN IS NOT NULL) THEN expressionN
   ELSE NULL
示例

在下面的示例中，显示包含三列有关某个雇员每年工资收入信息的 wages 表：hourly_wage、salary 和 commission。但是，每个雇员只能接受一种付款方式。若要确定支付给所有雇员的工资总额，请使用 COALESCE 函数接受在 hourly_wage、salary 和 commission 中找到的非空值。

SET NOCOUNT ON
GO
USE master
IF EXISTS (SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES
      WHERE TABLE_NAME = 'wages')
   DROP TABLE wages
GO
CREATE TABLE wages
(
   emp_id      tinyint    identity,
   hourly_wage   decimal   NULL,
   salary      decimal    NULL,
   commission   decimal   NULL,
   num_sales   tinyint   NULL
)
GO
INSERT wages VALUES(10.00, NULL, NULL, NULL)
INSERT wages VALUES(20.00, NULL, NULL, NULL)
INSERT wages VALUES(30.00, NULL, NULL, NULL)
INSERT wages VALUES(40.00, NULL, NULL, NULL)
INSERT wages VALUES(NULL, 10000.00, NULL, NULL)
INSERT wages VALUES(NULL, 20000.00, NULL, NULL)
INSERT wages VALUES(NULL, 30000.00, NULL, NULL)
INSERT wages VALUES(NULL, 40000.00, NULL, NULL)
INSERT wages VALUES(NULL, NULL, 15000, 3)
INSERT wages VALUES(NULL, NULL, 25000, 2)
INSERT wages VALUES(NULL, NULL, 20000, 6)
INSERT wages VALUES(NULL, NULL, 14000, 4)
GO
SET NOCOUNT OFF
GO
SELECT CAST(COALESCE(hourly_wage * 40 * 52,
   salary,
   commission * num_sales) AS money) AS 'Total Salary'
FROM wages
GO

下面是结果集：

Total Salary
------------
20800.0000
41600.0000
62400.0000
83200.0000
10000.0000
20000.0000
30000.0000
40000.0000
45000.0000
50000.0000
120000.0000
56000.0000

(12 row(s) affected)

请参见

CASE

系统函数


COL_LENGTH

返回列的定义长度（以字节为单位）。

语法

COL_LENGTH ( 'table' , 'column' )

参数

'table'

为其确定列长度信息的表的名称。table 是一个 nvarchar 类型的表达式。

column

为其确定长度的列的名称。column 是一个 nvarchar 类型的表达式。

返回类型

int

示例

下例为 varchar(40) 类型的列和 nvarchar(40) 类型的列显示返回值。

USE pubs
GO
CREATE TABLE t1
   (c1 varchar(40),
    c2 nvarchar(40)
)
GO
SELECT COL_LENGTH('t1','c1')AS 'VarChar',
      COL_LENGTH('t1','c2')AS 'NVarChar'
GO
DROP TABLE t1

下面是结果集：

VarChar     NVarChar
40          80

请参见

表达式

元数据函数


COL_NAME

返回数据库列的名称，该列具有相应的表标识号和列标识号。

语法

COL_NAME ( table_id , column_id )

参数

table_id

包含数据库列的表的标识号。table_id 属于 int 类型。

column_id

列的标识号。column_id 参数属于 int 类型。

返回类型

sysname

注释

table_id 和 column_id 参数共同产生一个列名称字符串。

有关获得表和列标识号的更多信息，请参见 OBJECT_ID。

示例

下面的示例返回 Northwind 数据库的 Employees 表中的首列的名称。

USE Northwind
SET NOCOUNT OFF
SELECT COL_NAME(OBJECT_ID('Employees'), 1)

下面是结果集：

EmployeeID

(1 row(s) affected)

请参见

表达式

元数据函数

sysobjects


COLLATE

一个子句，可应用于数据库定义或列定义以定义排序规则，或应用于字符串表达式以应用排序规则投影。

语法

COLLATE < collation_name >

< collation_name > ::=
    { Windows_collation_name } | { SQL_collation_name }

参数

collation_name

是应用于表达式、列定义或数据库定义的排序规则的名称。collation_name 可以只是指定的 Windows_collation_name 或 SQL_collation_name。

Windows_collation_name
是 Windows 排序规则的排序规则名称。请参见 Windows 排序规则名称。
SQL_collation_name
是 SQL 排序规则的排序规则名称。请参见 SQL 排序规则名称。
注释

COLLATE 子句可以在几个级别上指定，包括以下级别：

  1. 创建或更改数据库。

    可以使用 CREATE DATABASE 或 ALTER DATABASE 语句的 COLLATE 子句指定数据库的默认排序规则。还可在创建数据库时使用 SQL Server 企业管理器指定排序规则。如果不指定排序规则，则将为数据库指派 SQL Server 实例的默认排序规则。

  2. 创建或更改表列。

    可以使用 CREATE TABLE 或 ALTER TABLE 语句的 COLLATE 子句指定每个字符串列的排序规则。还可在创建表时使用 SQL Server 企业管理器指定排序规则。如果不指定排序规则，将为列指派数据库的默认排序规则。

    还可使用 COLLATE 子句中的 database_default 选项，指定临时表中的列使用连接的当前用户数据库（而不是 tempdb）的默认排序规则。

  3. 投影表达式的排序规则。

    可以使用 COLLATE 子句将字符表达式投影到特定的排序规则。将为字符字面值和变量指派当前数据库的默认排序规则。将为列引用指派列的定义排序规则。有关表达式排序规则的信息，请参见排序规则的优先顺序。

标识符的排序规则取决于定义标识符时所在的级别。为实例级对象（如登录名和数据库名）的标识符指派实例的默认排序规则。为数据库对象（如表、视图和列名）的标识符指派数据库的默认排序规则。例如，对于名称差别仅在于大小写的两个表，可在使用区分大小写排序规则的数据库中创建，而不能在使用不区分大小写排序规则的数据库中创建。

当连接上下文与数据库相关时，可以创建变量、GOTO 标签、临时存储过程和临时表，且当已将上下文切换到其它数据库时引用它们。变量、GOTO 标签、临时存储过程和临时表的标识符在实例的默认排序规则中。

COLLATE 子句只能应用于 char、varchar、text、nchar、nvarchar 和 ntext 数据类型。

排序规则一般由排序规则名标识。例外情况是：在安装过程中没有为 Windows 排序规则指定排序规则名称，而是指定排序规则指示器，然后选择复选框以指定区分或不区分大小写和重音的二进制排序或字典排序。

可以执行系统函数 fn_helpcollations 以检索 Windows 排序规则和 SQL 排序规则的所有有效排序规则名称的列表：

SELECT *
FROM ::fn_helpcollations()

SQL Server 只支持由基础操作系统支持的代码页。当执行依赖排序规则的操作时，被引用对象所使用的 SQL Server 排序规则必须使用计算机上运行的操作系统所支持的代码页。这些操作可包括：

  • 当创建或更改数据库时，为数据库指定默认排序规则。

  • 当创建或更改表时，为列指定默认排序规则。

  • 当还原或附加数据库时，操作系统必须支持数据库的默认排序规则，并支持数据库中的任何 char、varchar 和 text 列或参数的排序规则。

    支持 char 和 varchar 数据类型的代码页转换，但是不支持 text 数据类型的代码页转换。不报告代码页转换过程中的数据丢失。

如果被引用的对象所使用或指定的排序规则使用 Windows® 不支持的代码页，则 SQL Server 将发出错误信息。有关更多信息，请参见 SQL Server 联机丛书的"SQL Server 构架"章中的"排序规则"节。

请参见

ALTER TABLE

用于国际支持的排序规则选项

排序规则的优先顺序

排序规则

常量

CREATE DATABASE

CREATE TABLE

DECLARE @local_variable

table

使用 Unicode 数据


SQL 排序规则名称

为 SQL 排序规则指定排序规则名称的单个字符串。

语法

< SQL_collation_name > :: =

SQL_SortRules[_Pref]_CPCodepage_<ComparisonStyle>

<ComparisonStyle> ::=
_CaseSensitivity_AccentSensitivity | _BIN

参数

SortRules

标识字母表或语言的字符串，当指定按字典排序时应用该字母表或语言的排序规则。例如 Latin1_General 或波兰语。

Pref

指定大写字母优先。

Codepage

指定标识排序规则所使用的代码页的 1 至 4 个数字的号码。CP1 指定代码页 1252，对于所有其它代码页指定完整代码页号码。例如，CP1251 指定代码页 1251，CP850 指定代码页 850。

CaseSensitivity

CI 指定不区分大小写，CS 指定区分大小写。

AccentSensitivity

AI 指定不区分重音，AS 指定区分重音。

BIN

指定使用二进制排序次序。

注释

下表列出了 SQL 排序规则名称。

排序次序 ID | SQL 排序规则名称
30 | SQL_Latin1_General_Cp437_BIN
31 | SQL_Latin1_General_Cp437_CS_AS
32 | SQL_Latin1_General_Cp437_CI_AS
33 | SQL_Latin1_General_Pref_CP437_CI_AS
34 | SQL_Latin1_General_Cp437_CI_AI
40 | SQL_Latin1_General_Cp850_BIN
41 | SQL_Latin1_General_Cp850_CS_AS
42 | SQL_Latin1_General_Cp850_CI_AS
43 | SQL_Latin1_General_Pref_CP850_CI_AS
44 | SQL_Latin1_General_Cp850_CI_AI
49 | SQL_1Xcompat_CP850_CI_AS
50 | Latin1_General_BIN
51 | SQL_Latin1_General_Cp1_CS_AS
52 | SQL_Latin1_General_Cp1_CI_AS
53 | SQL_Latin1_General_Pref_CP1_CI_AS
54 | SQL_Latin1_General_Cp1_CI_AI
55 | SQL_AltDiction_Cp850_CS_AS
56 | SQL_AltDiction_Pref_CP850_CI_AS
57 | SQL_AltDiction_Cp850_CI_AI
58 | SQL_Scandinavian_Pref_Cp850_CI_AS
59 | SQL_Scandinavian_Cp850_CS_AS
60 | SQL_Scandinavian_Cp850_CI_AS
61 | SQL_AltDiction_Cp850_CI_AS
71 | Latin1_General_CS_AS
72 | Latin1_General_CI_AS
73 | Danish_Norwegian_CS_AS
74 | Finnish_Swedish_CS_AS
75 | Icelandic_CS_AS
80 | Hungarian_BIN（或 Albanian_BIN、Czech_BIN 等等）1
81 | SQL_Latin1_General_Cp1250_CS_AS
82 | SQL_Latin1_General_Cp1250_CI_AS
83 | SQL_Czech_Cp1250_CS_AS
84 | SQL_Czech_Cp1250_CI_AS
85 | SQL_Hungarian_Cp1250_CS_AS
86 | SQL_Hungarian_Cp1250_CI_AS
87 | SQL_Polish_Cp1250_CS_AS
88 | SQL_Polish_Cp1250_CI_AS
89 | SQL_Romanian_Cp1250_CS_AS
90 | SQL_Romanian_Cp1250_CI_AS
91 | SQL_Croatian_Cp1250_CS_AS
92 | SQL_Croatian_Cp1250_CI_AS
93 | SQL_Slovak_Cp1250_CS_AS
94 | SQL_Slovak_Cp1250_CI_AS
95 | SQL_Slovenian_Cp1250_CS_AS
96 | SQL_Slovenian_Cp1250_CI_AS
104 | Cyrillic_General_BIN（或 Ukrainian_BIN、Macedonian_BIN）
105 | SQL_Latin1_General_Cp1251_CS_AS
106 | SQL_Latin1_General_Cp1251_CI_AS
107 | SQL_Ukrainian_Cp1251_CS_AS
108 | SQL_Ukrainian_Cp1251_CI_AS
112 | Greek_BIN
113 | SQL_Latin1_General_Cp1253_CS_AS
114 | SQL_Latin1_General_Cp1253_CI_AS
120 | SQL_MixDiction_Cp1253_CS_AS
121 | SQL_AltDiction_Cp1253_CS_AS
124 | SQL_Latin1_General_Cp1253_CI_AI
128 | Turkish_BIN
129 | SQL_Latin1_General_Cp1254_CS_AS
130 | SQL_Latin1_General_Cp1254_CI_AS
136 | Hebrew_BIN
137 | SQL_Latin1_General_Cp1255_CS_AS
138 | SQL_Latin1_General_Cp1255_CI_AS
144 | Arabic_BIN
145 | SQL_Latin1_General_Cp1256_CS_AS
146 | SQL_Latin1_General_Cp1256_CI_AS
153 | SQL_Latin1_General_Cp1257_CS_AS
154 | SQL_Latin1_General_Cp1257_CI_AS
155 | SQL_Estonian_Cp1257_CS_AS
156 | SQL_Estonian_Cp1257_CI_AS
157 | SQL_Latvian_Cp1257_CS_AS
158 | SQL_Latvian_Cp1257_CI_AS
159 | SQL_Lithuanian_Cp1257_CS_AS
160 | SQL_Lithuanian_Cp1257_CI_AS
183 | SQL_Danish_Pref_Cp1_CI_AS
184 | SQL_SwedishPhone_Pref_Cp1_CI_AS
185 | SQL_SwedishStd_Pref_Cp1_CI_AS
186 | SQL_Icelandic_Pref_Cp1_CI_AS
192 | Japanese_BIN
193 | Japanese_CI_AS
194 | Korean_Wansung_BIN
195 | Korean_Wansung_CI_AS
196 | Chinese_Taiwan_Stroke_BIN
197 | Chinese_Taiwan_Stroke_CI_AS
198 | Chinese_PRC_BIN
199 | Chinese_PRC_CI_AS
200 | Japanese_CS_AS
201 | Korean_Wansung_CS_AS
202 | Chinese_Taiwan_Stroke_CS_AS
203 | Chinese_PRC_CS_AS
204 | Thai_BIN
205 | Thai_CI_AS
206 | Thai_CS_AS
210 | SQL_EBCDIC037_CP1_CS_AS
211 | SQL_EBCDIC273_CP1_CS_AS
212 | SQL_EBCDIC277_CP1_CS_AS
213 | SQL_EBCDIC278_CP1_CS_AS
214 | SQL_EBCDIC280_CP1_CS_AS
215 | SQL_EBCDIC284_CP1_CS_AS
216 | SQL_EBCDIC285_CP1_CS_AS
217 | SQL_EBCDIC297_CP1_CS_AS

1只要代码页指定为 1250，而且按二进制排序，对排序次序 ID 80 可以使用任何 Window 排序规则。例如：Albanian_BIN、Croatian_BIN、Czech_BIN、Romanian_BIN、Slovak_BIN、Slovenian_BIN。

请参见

ALTER TABLE

选择 SQL 排序规则

常量

CREATE DATABASE

CREATE TABLE

DECLARE @local_variable

table


Windows 排序规则名称

在 COLLATE 子句中指定 Windows 排序规则名称。Windows 排序规则名称由排序规则指示器和比较风格构成。

语法

< Windows_collation_name > :: =

CollationDesignator_<ComparisonStyle>

< ComparisonStyle > ::=
CaseSensitivity_AccentSensitivity
[_KanatypeSensitive [_WidthSensitive ] ]
| _BIN

参数

CollationDesignator

指定 Windows 排序规则使用的基本排序规则。基本排序规则包括：

  • 当指定按字典排序时应用其排序规则的字母表或语言

  • 用于存储非 Unicode 字符数据的代码页。

    例如 Latin1_General 或法文，两者都使用代码页 1252，或土耳其文，它使用代码页 1254。

CaseSensitivity

CI 指定不区分大小写，CS 指定区分大小写。

AccentSensitivity

AI 指定不区分重音，AS 指定区分重音。

KanatypeSensitive

Omitted 指定不区分大小写，KS 指定区分假名类型。

WidthSensitivity

Omitted 指定不区分大小写，WS 指定区分大小写。

BIN

指定使用二进制排序次序。

注释

Microsoft® SQL Server™ 2000 Windows 排序规则的指示器为：

SQL Server 2000 排序规则指示器 | 用于非 Unicode 数据的代码页 | 支持的 Windows 区域设置
Albanian | 1250 | 阿尔巴尼亚语
Arabic | 1256 | 阿拉伯语（阿尔及利亚）、阿拉伯语（巴林）、阿拉伯语（埃及）、阿拉伯语（伊朗）、阿拉伯语（约旦）、阿拉伯语（科威特）、阿拉伯语（黎巴嫩）、阿拉伯语（利比亚）、阿拉伯语（摩洛哥）、阿拉伯语（阿曼）、阿拉伯语（卡塔尔）、阿拉伯语（沙特阿拉伯）、阿拉伯语（叙利亚）、阿拉伯语（突尼斯）、阿拉伯语（阿拉伯联合酋长国）、阿拉伯语（也门）、波斯语、乌尔都语
Chinese_PRC | 936 | 中文（香港特别行政区），中文（中华人民共和国），中文（新加坡）
Chinese_PRC_Stroke | 936 | 按汉字笔画排序（中华人民共和国）
Chinese_Taiwan_Bopomofo | 950 | 按汉语拼音排序（台湾）
Chinese_Taiwan_Stroke | 950 | 繁体中文（台湾）
Croatian | 1250 | 克罗地亚语
Cyrillic_General | 1251 | 保加利亚语、白俄罗斯语、俄罗斯语、塞尔维亚语
Czech | 1250 | 捷克语
Danish_Norwegian | 1252 | 丹麦语、挪威语 (Bokmål)、挪威语（Nyorsk）
Estonian | 1257 | 爱沙尼亚语
Finnish_Swedish | 1252 | 芬兰语、瑞典语
French | 1252 | 法语（比利时）、法语（加拿大）、法语（卢森堡）、法语（标准）、法语（瑞士）
Georgian_Modern_Sort | 1252 | 按现代格鲁吉亚语排序
German_PhoneBook | 1252 | 按德语电话号码簿排序
Greek | 1253 | 希腊语
Hebrew | 1255 | 希伯来语
Hindi | 只用于 Unicode 数据类型 | 北印度语
Hungarian | 1250 | 匈牙利语
Hungarian_Technical | 1250 |
Icelandic | 1252 | 冰岛语
Japanese | 932 | 日语
Japanese_Unicode | 932 |
Korean_Wansung | 949 | 朝鲜语
Korean_Wansung_Unicode | 949 |
Latin1_General | 1252 | 南非荷兰语、巴斯克语、加泰罗尼亚语、荷兰语（比利时）、荷兰语（标准）、英语（澳大利亚）、英语（不列颠）、英语（加拿大）、英语（加勒比）、英语（爱尔兰）、英语（牙买加）、英语（新西兰）、英语（南非）、英语（美国）、法罗语、德语（奥地利）、德语（列支敦士登）、德语（卢森堡）、德语（标准）、德语（瑞士）、印度尼西亚语、意大利语、意大利语（瑞士）、葡萄牙语（巴西）、葡萄牙语（标准）
Latvian | 1257 | 拉脱维亚语
Lithuanian | 1257 | 立陶宛语
Lithuanian_Classic | 1257 |
Macedonian | 1251 | 马其顿语
Mexican_Trad_Spanish | 1252 | 西班牙语（墨西哥）、西班牙语（传统排序）
Modern_Spanish | 1252 | 西班牙语（阿根廷）、西班牙语（玻利维亚）、西班牙语（智利）、西班牙语（哥伦比亚）、西班牙语（哥斯达黎加）、西班牙语（多米尼加共和国）、西班牙语（厄瓜多尔）、西班牙语（危地马拉）、西班牙语（现代排序）、西班牙语（巴拿马）、西班牙语（巴拉圭）、西班牙语（秘鲁）、西班牙语（乌拉圭）、西班牙语（委内瑞拉）
Polish | 1250 | 波兰语
Romanian | 1250 | 罗马尼亚语
Slovak | 1250 | 斯洛伐克语
Slovenian | 1250 | 斯洛文尼亚语
Thai | 874 | 泰国语
Turkish | 1254 | 土耳其语
Ukrainian | 1251 | 乌克兰语
Vietnamese | 1258 | 越南语

示例

下面是 Windows 排序规则名称的一些示例：

  • Latin1_General_CI_AS

    排序规则使用 Latin1 General 字典排序规则，代码页为 1252。不区分大小写但区分重音。

  • Estonian_CS_AS

    排序规则使用爱沙尼亚字典排序规则，代码页为 1257。区分大小写并区分重音。

  • Latin1_General_BIN

    排序规则使用代码页 1252 和二进制排序规则。忽略 Latin1 General 字典排序规则。

请参见

ALTER TABLE

选择 SQL 排序规则

常量

CREATE DATABASE

CREATE TABLE

DECLARE @local_variable

table

Windows 排序规则名称


COLLATIONPROPERTY

返回给定排序规则的属性。

语法

COLLATIONPROPERTY( collation_name, property )

参数

collation_name

是排序规则的名称。collation_name 的数据类型为 nvarchar(128)，且无默认值。

property

是排序规则的属性。property 的数据类型为 varchar(128)，并且可以为下表中的任何值：

属性名称 | 描述
CodePage | 排序规则的 nonUnicode 代码页。
LCID | 排序规则的 Windows LCID。 为 SQL 排序规则返回 NULL。
ComparisonStyle | 排序规则的 Windows 比较风格。 为二进制或 SQL 排序规则返回 NULL。

返回类型

sql_variant

示例
SELECT COLLATIONPROPERTY('Traditional_Spanish_CS_AS_KS_WS', 'CodePage')

结果集

1252

请参见

fn_helpcollations


COLUMNPROPERTY

返回有关列或过程参数的信息。

语法

COLUMNPROPERTY ( id , column , property )

参数

id

一个表达式，其中包含表或过程标识符 (ID)。

column

一个表达式，其中包含列或参数名称。

property

一个表达式，其中包含要为 id 返回的信息。该表达式可以取下列这些值中的任意一个。

值 | 描述 | 返回的值
AllowsNull | 允许空值。 | 1 = TRUE 0 = FALSE NULL = 无效的输入
IsComputed | 该列为计算列。 | 1 = TRUE 0 = FALSE NULL = 无效的输入
IsCursorType | 过程参数属于CURSOR 类型。 | 1 = TRUE 0 = FALSE NULL = 无效的输入
IsDeterministic | 该列具有确定性。该属性只适用于计算列和视图列。 | 1 = TRUE 0 = FALSE NULL = 无效的输入不是计算列或视图列。
IsFulltextIndexed | 该列已经注册为全文索引。 | 1 = TRUE 0 = FALSE NULL = 无效的输入
IsIdentity | 该列使用IDENTITY 属性。 | 1 = TRUE 0 = FALSE NULL = 无效的输入
IsIdNotForRepl | 该列检查IDENTITY_INSERT 设置。如果指定了IDENTITY NOT FOR REPLICATION，则不检查IDENTITY_INSERT 设置。 | 1 = TRUE 0 = FALSE NULL = 无效的输入
IsIndexable | 该列可进行索引。 | 1 = TRUE 0 = FALSE NULL = 无效的输入
IsOutParam | 该过程参数为输出参数。 | 1 = TRUE 0 = FALSE NULL = 无效的输入
IsPrecise | 该列是精确的。该属性只适用于具有确定性的列。 | 1 = TRUE 0 = FALSE NULL = 无效的输入不是具有确定性的列。
IsRowGuidCol | 该列具有 uniqueidentifier 数据类型并且使用ROWGUIDCOL 属性进行定义。 | 1 = TRUE 0 = FALSE NULL = 无效的输入
Precision | 列或参数的数据类型的精度。 | 指定的列数据类型的精度 NULL = 无效的输入
Scale | 列或参数的数据类型的小数位数。 | 小数位数 NULL = 无效的输入
UsesAnsiTrim | 当开始创建表时，ANSI 填充设置为 ON。 | 1 = TRUE 0 = FALSE NULL = 无效的输入

返回类型

int

注释

当检查列的确定性属性时，首先测试该列是否为计算列。IsDeterministic 对于非计算列返回 NULL。

可以将计算列指定为索引列。

示例

下面的示例返回 au_lname 列的长度。

SELECT COLUMNPROPERTY( OBJECT_ID('authors'),'au_lname','PRECISION')

请参见

元数据函数

OBJECTPROPERTY

TYPEPROPERTY


COMMIT TRANSACTION

标志一个成功的隐性事务或用户定义事务的结束。如果 @@TRANCOUNT 为 1，COMMIT TRANSACTION 使得自从事务开始以来所执行的所有数据修改成为数据库的永久部分，释放连接占用的资源，并将 @@TRANCOUNT 减少到 0。如果 @@TRANCOUNT 大于 1，则 COMMIT TRANSACTION 使 @@TRANCOUNT 按 1 递减。

语法

COMMIT [ TRAN [ SACTION ] [ transaction_name | @tran_name_variable ] ]

参数

transaction_name

Microsoft® SQL Server™ 忽略该参数。transaction_name 指定由前面的 BEGIN TRANSACTION 指派的事务名称。transaction_name 必须遵循标识符的规则，但只使用事务名称的前 32 个字符。通过向程序员指明 COMMIT TRANSACTION 与哪些嵌套的 BEGIN TRANSACTION 相关联，transaction_name 可作为帮助阅读的一种方法。

@tran_name_variable

是用户定义的、含有有效事务名称的变量的名称。必须用 char、varchar、nchar 或 nvarchar 数据类型声明该变量。

注释

只有当事务所引用的所有数据的逻辑都正确时，发出 COMMIT TRANSACTION 命令才是一个 Transact-SQL 程序员的职责。

如果所提交的事务是 Transact-SQL 分布式事务，COMMIT TRANSACTION 将触发 MS DTC 使用两阶段提交协议，以便提交所有涉及该事务的服务器。如果局部事务跨越同一服务器上的两个或多个数据库，那么 SQL Server 将使用内部的两阶段提交来提交所有涉及该事务的数据库。

当在嵌套事务中使用时，内部事务的提交并不释放资源或使其修改成为永久修改。只有在提交了外部事务时，数据修改才具有永久性，而且资源才会被释放。当 @@TRANCOUNT 大于 1 时，每发出一个 COMMIT TRANSACTION 命令就会使 @@TRANCOUNT 按 1 递减。当 @@TRANCOUNT 最终减少到 0 时，将提交整个外部事务。因为 transaction_name 被 SQL Server 忽略，所以当存在仅将 @@TRANCOUNT 按 1 递减的显著内部事务时，发出一个引用外部事务名称的 COMMIT TRANSACTION。

当 @@TRANCOUNT 为 0 时发出 COMMIT TRANSACTION 将会导致出现错误，因为没有相应的 BEGIN TRANSACTION。

不能在发出一个 COMMIT TRANSACTION 语句之后回滚事务，因为数据修改已经成为数据库的一个永久部分。

示例
A. 提交事务。

下面的示例在图书的截止当前销售额超过 $8,000 时，增加支付给作者的预付款。

BEGIN TRANSACTION
USE pubs
GO
UPDATE titles
SET advance = advance * 1.25
WHERE ytd_sales > 8000
GO
COMMIT
GO
B. 提交嵌套事务。

下面的示例创建一个表，生成三个级别的嵌套事务，然后提交该嵌套事务。尽管每个 COMMIT TRANSACTION 语句都有一个 transaction_name 参数，但是 COMMIT TRANSACTION 和 BEGIN TRANSACTION 语句之间没有任何关系。transaction_name 参数仅是帮助阅读的方法，可帮助程序员确保提交的正确号码被编码以便将 @@TRANCOUNT 减少到 0，然后提交外部事务。

CREATE TABLE TestTran (Cola INT PRIMARY KEY, Colb CHAR(3))
GO
BEGIN TRANSACTION OuterTran -- @@TRANCOUNT set to 1.
GO
INSERT INTO TestTran VALUES (1, 'aaa')
GO
BEGIN TRANSACTION Inner1 -- @@TRANCOUNT set to 2.
GO
INSERT INTO TestTran VALUES (2, 'bbb')
GO
BEGIN TRANSACTION Inner2 -- @@TRANCOUNT set to 3.
GO
INSERT INTO TestTran VALUES (3, 'ccc')
GO
COMMIT TRANSACTION Inner2 -- Decrements @@TRANCOUNT to 2.
-- Nothing committed.
GO
COMMIT TRANSACTION Inner1 -- Decrements @@TRANCOUNT to 1.
-- Nothing committed.
GO
COMMIT TRANSACTION OuterTran -- Decrements @@TRANCOUNT to 0.
-- Commits outer transaction OuterTran.
GO

请参见

BEGIN DISTRIBUTED TRANSACTION

BEGIN TRANSACTION

COMMIT WORK

ROLLBACK TRANSACTION

ROLLBACK WORK

SAVE TRANSACTION

@@TRANCOUNT

事务


COMMIT WORK

标志事务的结束。

语法

COMMIT [ WORK ]

注释

此语句的功能与 COMMIT TRANSACTION 相同，但 COMMIT TRANSACTION 接受用户定义的事务名称。这个指定或没有指定可选关键字 WORK 的 COMMIT 语法与 SQL-92 兼容。

请参见

BEGIN DISTRIBUTED TRANSACTION

BEGIN TRANSACTION

COMMIT TRANSACTION

ROLLBACK TRANSACTION

ROLLBACK WORK

SAVE TRANSACTION

@@TRANCOUNT


COMPUTE 子句

生成合计作为附加的汇总列出现在结果集的最后。当与 BY 一起使用时，COMPUTE 子句在结果集内生成控制中断和分类汇总。可在同一查询内指定 COMPUTE BY 和 COMPUTE。

语法

[ COMPUTE
{ { AVG | COUNT | MAX | MIN | STDEV | STDEVP
        | VAR | VARP | SUM }
( expression ) } [ ,...n ]
    [ BY expression [ ,...n ] ]

参数

AVG | COUNT | MAX | MIN | STDEV | STDEVP | VAR | VARP | SUM

指定要执行的聚合。下面是 COMPUTE 子句使用的行聚合函数：

行聚合函数 | 结果
AVG | 数字表达式中所有值的平均值
COUNT | 选定的行数
MAX | 表达式中的最高值
MIN | 表达式中的最低值
STDEV | 表达式中所有值的统计标准偏差
STDEVP | 表达式中所有值的填充统计标准偏差
SUM | 数字表达式中所有值的和
VAR | 表达式中所有值的统计方差
VARP | 表达式中所有值的填充统计方差

没有等同于 COUNT(*) 的函数。若要查找由 GROUP BY 和 COUNT(*) 生成的汇总信息，请使用不带 BY 的 COMPUTE 子句。

这些函数忽略空值。

如果是用 COPPUT 子句指定的行聚合函数，则不允许它们使用 DISTINCT 关键字。

当添加或平均整数数据时，即使列的数据类型为 smallint 或 tinyint，SQL Server 也将结果视为 int 值。有关返回添加数据或平均数据的类型的更多信息，请参见 SUM 和 AVG。

说明 为减少在 ODBC 和 DB-Library 程序中溢出错误的可能性，请将平均或汇总结果的所有变量声明均作为数据类型 int。

( expression )

表达式，如对其执行计算的列名。expression 必须出现在选择列表中，并且必须将其指定为与选择列表中的某个表达式完全一样。在 expression 内不能使用在选择列表中指定的列的别名。

说明 在 COMPUTE 或 COMPUTE BY 子句中，不能指定 ntext、text 和 image 数据类型。

BY expression

在结果集内生成控制中断和分类汇总。expression 是 order_by_expression 在相关 ORDER BY 子句中的精确复本。一般情况下，这是列名或列的别名。可指定多个表达式。在 BY 后列出多个表达式可将一个组分成子组并在每个分组级别上应用聚合函数。

如果使用 COMPUTE BY，则必须也使用 ORDER BY 子句。表达式必须与在 QRDER BY 后列出的子句相同或是其子集，并且必须按相同的序列。例如，如果 ORDER BY 子句是：

ORDER BY a, b, c

则 COMPUTE子句可以是下面的任意一个（或全部）：

COMPUTE BY a, b, c
COMPUTE BY a, b
COMPUTE BY a

说明 在带 COMPUTE 子句的 SELECT 语句中，选择列表中的列顺序替代 COMPUTE 子句中的聚合函数顺序。ODBC 和 DB-library 程序员必须知道这种顺序要求，以将聚合函数结果放在正确的位置。

由于包含 COMPUTE 的语句生成表并且这些表的汇总结果不存储在数据库中，因此在 SELECT INTO 语句中不能使用 COMPUTE。因而，任何由 COMPUTE 生成的计算结果不出现在用 SELECT INTO 语句创建的新表内。

当 SELECT 语句是 DECLARE CURSOR 语句的一部分时，不能使用 COMPUTE 子句。


CONTAINS

一个谓词，用于搜索包含基于字符的数据类型的列，该列与单个词和短语，以及与另一个词一定范围之内的近似词精确或模糊（不太精确的）匹配或者加权匹配。CONTAINS 可以搜索：

  • 词或短语。

  • 词或短语的前缀。

  • 另一个词附近的词。

  • 由另一个词的词尾变化生成的词（例如，词 drive 是 drives、drove、driving 和 driven 词尾变化的词干）。

  • 比另一个词具有更高加权的词。
语法

CONTAINS
( { column | * } , '< contains_search_condition >'
    )

< contains_search_condition > ::=
{ < simple_term >
| < prefix_term >
| < generation_term >
| < proximity_term >
| < weighted_term >
}
        | { ( < contains_search_condition > )
 { AND | AND NOT | OR } < contains_search_condition > [ ...n ]
        }

< simple_term > ::=
 word | " phrase "

< prefix term> ::=
{ "word * " | "phrase * " }

< generation_term > ::=
 FORMSOF ( INFLECTIONAL , < simple_term > [ ,...n ] )

< proximity_term > ::=
 { < simple_term > | < prefix_term > }
{ { NEAR | ~ } { < simple_term > | < prefix_term > } } [ ...n ]

< weighted_term > ::=
 ISABOUT
( { {
                <simple_term>
| < prefix_term >
| < generation_term >
| < proximity_term >
}
            [ WEIGHT ( weight_value ) ]
} [ ,...n ]
        )

参数

column

已经注册全文检索的特定列的名称。字符串数据类型的列是有效的全文检索列。

*

指定应该使用表中所有已注册为全文检索的列，对给定的包含搜索条件进行搜索。如果 FROM 子句中有多个表，那么 * 必须由表名限定。

<contains_search_condition>

指定要在 column 中搜索的文本。变量不能用作搜索条件。

word

没有空格或标点符号的字符串。

phrase

在每个词之间带有空格的一个或多个词。

说明 对于某些语言（例如亚洲的一些语言），短语可以由彼此之间没有空格的一个或多个词组成。

<simple_term>

指定对每个精确词（单字节语言中没有空格或标点符号的一个或多个字符）或短语（单字节语言中由空格和可选的标点符号分隔的一个或多个连续的词）的匹配。有效的简单术语示例为 "blue berry"、blueberry 和 "Microsoft SQL Server"。应该使用双引号 ("") 将短语括起来。短语中词出现的顺序（在 <contains_search_condition> 中指定）必须与它们出现在数据库列中的顺序相同。对词或短语中字符的搜索是区分大小写的。全文索引列中的干扰词（例如 a、and 或 the）不被存储在全文索引中。如果在单个词搜索中使用干扰词，那么 SQL Server 将返回一个错误信息指明查询中只有干扰词出现。SQL Server 在目录 \Mssql\Ftdata\Sqlserver\Config 下包括干扰词的标准列表。

标点符号被忽略。因此，CONTAINS(testing, "computer failure") 将匹配具有 "Where is my computer?Failure to find it would be expensive." 值的行。

<prefix_term>

指定以指定文本开始的匹配词或短语。将前缀术语用双引号 ("") 引起来并在后一个引号前添加一个星号 (*)，这样将匹配在星号前指定的所有以简单术语打头的文本。应这样指定该子句：CONTAINS (column, 'text*') 星号匹配零、一个或多个字符（属于词或短语中的词根或词）。 如果未用双引号分隔文本与星号，如 CONTAINS (column, 'text*') 中所示，那么全文检索将把星号作为字符处理并搜索 text* 的精确匹配项。

当 <prefix_term> 是一个短语时，短语中包含的每个词都被认为是一个单独的前缀。因此，指定一个 "local wine *" 前缀术语的查询将匹配任何具有 "local winery"、"locally wined and dined" 等文本的行。

< generation_term >

当所包含的简单术语包括要搜索的原始词的不同变化时，指定匹配的词。

INFLECTIONAL
指定应匹配单数与复数以及名词、动词和形容词的性别与中性形式。也应匹配各种动词时态。

在 <generation_term> 中给定的 <simple_term> 将不与名词和动词匹配。

<proximity_term>

指定匹配的词或短语，这些词或短语必须彼此接近。<proximity_term> 的运算与 AND 运算符相似：两者都要求在被搜索的列中有多个词或短语存在。如果 <proximity_term> 中的词彼此越接近，那么匹配就越好。

NEAR | ~
指明 NEAR 或 ~ 运算符左边的词或短语应该与 NEAR 或 ~ 运算符右边的词或短语近似接近。可以链接多个近似术语，例如：
a NEAR b NEAR c

这表示词或短语 a 应接近词或短语 b，而词或短语 b 应接近词或短语 c。

Microsoft® SQL Server™ 对左右两边的词或短语之间的距离分等级。低等级值（例如 0）指明两者之间距离较大。如果指定的词或短语之间相互分开，则认为满足了查询条件；但是，查询有一个很低的 (0) 等级值。然而，如果 <contains_search_condition> 仅由一个或多个 NEAR 近似术语组成，那么 SQL Server 不返回等级值为 0 的行。有关分等级的更多信息，请参见 CONTAINSTABLE。

<weighted_term>

指定匹配词和短语列表的匹配行（由查询返回），可以对每行随意给定一个加权值。

ISABOUT
指定 <weighted_term> 关键字。
WEIGHT (weight_value)
指定数值介于 0.0 和 1.0 之间的加权值。<weighted_term> 中的每个组件可能包含一个 weight_value。通过 weight_value，可以改变查询的各个部分怎样来影响指派给与查询匹配的每行的等级值。加权对值的等级进行不同的度量强制，因为使用了 <weighted_term> 的所有组件来共同确定匹配。如果存在与任意一个 ISABOUT 参数的匹配，则返回一行，而不论是否指派了加权值。若要确定每个返回行的等级值（该值指明返回行之间的匹配程度），请参见 CONTAINSTABLE。

AND | AND NOT | OR

指定两个包含搜索条件之间的逻辑运算。当 <contains_search_condition> 包含有括号中的组时，首先计算这些组。在计算括号中的组之后，当与包含搜索条件一起使用这些逻辑运算符时，应用下面的规则：

  • NOT 在 AND 之前应用。

  • NOT 只能出现在 AND 之后，例如 AND NOT。不允许使用 OR NOT 运算符。不能将 NOT 运算符指定在第一术语之前（例如，CONTAINS (mycolumn, 'NOT "phrase_to_search_for" ')）。

  • AND 在 OR 之前应用。

  • 相同类型的布尔运算符 (AND、OR) 可以结合使用，并因此可以按任何顺序进行应用。

n

一个占位符，指明可在其中指定多个包含搜索条件和术语。

注释

如果兼容级别小于 70，则 CONTAINS 不被看作是关键字。有关更多信息，请参见 sp_dbcmptlevel。

示例
A. 使用带有 <simple_term> 的 CONTAINS

下面的示例查找包含词"bottles"且价格为 $15.00 的所有产品。

USE Northwind
GO
SELECT ProductName
FROM Products
WHERE UnitPrice = 15.00
   AND CONTAINS(QuantityPerUnit, 'bottles')
GO
B. 在 <simple_term> 中使用 CONTAINS 和短语

下面的示例返回包含短语 "sasquatch ale" 或 "steeleye stout" 的所有产品。

USE Northwind
GO
SELECT ProductName
FROM Products
WHERE CONTAINS(ProductName, ' "sasquatch ale" OR "steeleye stout" ')
GO
C. 使用带有 <prefix_term> 的 CONTAINS

下面的示例返回所有满足该条件的产品名称：这些产品名称至少含有一个以 ProductName 列中前辍 Choc 起始的词。

USE Northwind
GO
SELECT ProductName
FROM Products
WHERE CONTAINS(ProductName, ' "choc*" ')
GO
D. 使用带有 <prefix_term> 的 CONTAINS 和 OR

下面的示例返回包含字符串 "sea" 或 "bread" 的所有分类描述。

USE Northwind
SELECT CategoryName
FROM Categories
WHERE CONTAINS(Description, '"sea*" OR "bread*"')
GO
E. 使用带有 <proximity_term> 的 CONTAINS

下面的示例返回在词 "spread" 附近有词 "Boysenberry" 的所有产品名称。

USE Northwind
GO
SELECT ProductName
FROM Products
WHERE CONTAINS(ProductName, 'spread NEAR Boysenberry')
GO
F. 使用带有 <generation_term> 的 CONTAINS

下面的示例搜索具有 dry 形式的词的所有产品：dried 和 drying 等等。

USE Northwind
GO
SELECT ProductName
FROM Products
WHERE CONTAINS(ProductName, ' FORMSOF (INFLECTIONAL, dry) ')
GO
G. 使用带有 <weighted_term> 的 CONTAINS

下面的示例搜索包含词 spread、sauces 或 relishes 以及给予每个词不同加权的所有产品名称。

USE Northwind
GO
SELECT CategoryName, Description
FROM Categories
WHERE CONTAINS(Description, 'ISABOUT (spread weight (.8),
   sauces weight (.4), relishes weight (.2) )' )
GO
H. 使用带变量的 CONTAINS

下例使用变量而非特定的搜索术语。

USE pubs
GO
DECLARE @SearchWord varchar(30)
SET @SearchWord ='Moon'
SELECT pr_info FROM pub_info WHERE CONTAINS(pr_info, @SearchWord)

请参见

FREETEXT

FREETEXTTABLE

使用 CONTAINS 谓词

WHERE


CONTAINSTABLE

对于包含基于字符的数据类型的列（该列与单个词和短语，以及与另一个词一定范围之内的近似词精确或模糊（不太精确的）匹配或者加权匹配），返回具有零行、一行或多行的表。CONTAINSTABLE 可以在 SELECT 语句的 FROM 子句中引用，就好象它是一个常规的表名称。

使用 CONTAINSTABLE 的查询将指定对每一行返回一个适当等级值 (RANK) 的包含类型的全文查询。CONTAINSTABLE 函数使用与 CONTAINS 谓词相同的搜索条件。

语法

CONTAINSTABLE ( table , { column | * } , ' < contains_search_condition > '
[ , top_n_by_rank ] )

< contains_search_condition > ::=
{ < simple_term >
| < prefix_term >
| < generation_term >
| < proximity_term >
| < weighted_term >
}
        | { ( < contains_search_condition > )
 { AND | AND NOT | OR } < contains_search_condition > [ ...n ]
        }

< simple_term > ::=
 word | " phrase "

< prefix term> ::=

< generation_term > ::=
 FORMSOF ( INFLECTIONAL , < simple_term > [ ,...n ] )

< proximity_term > ::=
 { < simple_term > | < prefix_term > }
{ { NEAR | ~ } { < simple_term > | < prefix_term > } } [ ...n ]

< weighted_term > ::=
 ISABOUT
( { {
                <simple_term>
| < prefix_term >
| < generation_term >
| < proximity_term >
}
            [ WEIGHT ( weight_value ) ]
} [ ,...n ]
        )

参数

table

是标记为用于全文查询的表的名称。table 可以是由一部分、两部分或三部分组成的数据库对象名称。 有关更多信息，请参见 Transact-SQL 语法规则。table 不能指定服务器名称，也不能用于对链接服务器的查询。

column

驻留在 table 中的要搜索的列名。字符串数据类型的列是有效的全文检索列。

*

指定表中所有已注册全文检索的列都必须用于搜索给定的包含搜索条件。

top_n_by_rank

指定只返回以降序排列的前 n 个最高等级的匹配项。仅当指定了整数值 n 时应用。

<contains_search_condition>

指定要在 column 中搜索的文本。变量不能用作搜索条件。有关更多信息，请参见 CONTAINS。

注释

返回的表中有一列名为 KEY，其中包含全文键值。每个全文索引表都有这样一列，它的值保证是唯一的，而且 KEY 列中的返回值都是与包含搜索条件中指定的选择标准相匹配的行的全文键值。从 OBJECTPROPERTY 函数获得的 TableFulltextKeyColumn 属性为这个唯一的 key 列提供标识。若要从原始表中获得所需要的行，请在 CONTAINSTABLE 行指定一个联接。使用 CONTAINSTABLE 的 SELECT 语句的 FROM 子句的典型形式为：

SELECT select_list
FROM table AS FT_TBL INNER JOIN
   CONTAINSTABLE(table, column, contains_search_condition) AS KEY_TBL
   ON FT_TBL.unique_key_column = KEY_TBL.[KEY]

CONTAINSTABLE 生成的表包含一个名称为 RANK 的列。RANK 列是一个数值（介于 0 和 1000 之间），它为每一行指明行匹配选择标准的状况。在 SELECT 语句中，此等级值通常按照下列方法之一进行使用：

  • 在 ORDER BY 子句中返回等级最高的行作为表中的第一行。

  • 在选择列表中查看指派给每一行的等级值。

  • 在 WHERE 子句中过滤等级值较低的行。

如果兼容级别小于 70，CONTAINSTABLE 不被看作是关键字。有关更多信息，请参见 sp_dbcmptlevel。

权限

只有在表或被引用表的列上具有适当 SELECT 特权的用户才有执行权限。

示例
A. 使用 CONTAINSTABLE 返回等级值

下面的示例搜索包含词 breads、fish 或 beers 以及给定每个词的不同加权的所有产品名称。对于与此搜索标准相匹配的每个返回行，显示匹配的相关程度（等级值）。此外，等级最高的行将首先返回。

USE Northwind
GO
SELECT FT_TBL.CategoryName, FT_TBL.Description, KEY_TBL.RANK
FROM Categories AS FT_TBL INNER JOIN
   CONTAINSTABLE(Categories, Description,
   'ISABOUT (breads weight (.8),
   fish weight (.4), beers weight (.2) )' ) AS KEY_TBL
   ON FT_TBL.CategoryID = KEY_TBL.[KEY]
ORDER BY KEY_TBL.RANK DESC
GO
B. 使用 CONTAINSTABLE 返回大于指定值的等级值

对于包含位于词"sauces"或"candies"附近的"sweet and savory"的 Description 列，下面的示例返回其所有食品分类的描述和分类名称。所有具有"Seafood"分类名称的行都将被忽视。仅返回等级值为 2 或等级值更高的行。

USE Northwind
GO
SELECT FT_TBL.Description,
   FT_TBL.CategoryName,
   KEY_TBL.RANK
FROM Categories AS FT_TBL INNER JOIN
   CONTAINSTABLE (Categories, Description,
      '("sweet and savory" NEAR sauces) OR
      ("sweet and savory" NEAR candies)'
   ) AS KEY_TBL
   ON FT_TBL.CategoryID = KEY_TBL.[KEY]
WHERE KEY_TBL.RANK > 2
   AND FT_TBL.CategoryName <> 'Seafood'
ORDER BY KEY_TBL.RANK DESC
C. 使用 CONTAINSTABLE 和 Top_n_by_rank 返回按等级排列的前 10 个结果

对于包含位于词"sauces"或"candies"附近的"sweet and savory"的 Description 列，下面的示例返回其前 10 种食品的描述和分类名称。

SELECT FT_TBL.Description,
   FT_TBL.CategoryName,
   KEY_TBL.RANK
FROM Categories AS FT_TBL INNER JOIN
   CONTAINSTABLE (Categories, Description,
      '("sweet and savory" NEAR sauces) OR
      ("sweet and savory" NEAR candies)'
      , 10
   ) AS KEY_TBL
   ON FT_TBL.CategoryID = KEY_TBL.[KEY]

请参见

CONTAINS

对 SQL Server 数据进行全文查询

行集函数

SELECT

WHERE


CONTINUE

重新开始 WHILE 循环。在 CONTINUE 关键字之后的任何语句都将被忽略。CONTINUE 通常由一个 IF 测试激活，但并不始终这样。有关更多信息，请参见 WHILE 和控制流语言。


COS

一个数学函数，返回给定表达式中给定角度（以弧度为单位）的三角余弦值。

语法

COS ( float_expression )

参数

float_expression

是 float 类型的 expression。

返回类型

float

示例

下面的示例返回给定角度的 COS 值。

DECLARE @angle float
SET @angle = 14.78
SELECT 'The COS of the angle is: ' + CONVERT(varchar,COS(@angle))
GO

下面是结果集：

The COS of the angle is: -0.599465

(1 row(s) affected)

请参见

数学函数


COT

一个数学函数，返回给定 float 表达式中指定角度（以弧度为单位）的三角余切值。

语法

COT ( float_expression )

参数

float_expression

是 float 类型的 expression。

返回类型

float

示例

下面的示例返回给定角度的 COT 值。

DECLARE @angle float
SET @angle = 124.1332
SELECT 'The COT of the angle is: ' + CONVERT(varchar,COT(@angle))
GO

下面是结果集：

The COT of the angle is: -0.040312

(1 row(s) affected)

请参见

数学函数


COUNT

返回组中项目的数量。

语法

COUNT ( { [ ALL | DISTINCT ] expression ] | * } )

参数

ALL

对所有的值进行聚合函数运算。ALL 是默认设置。

DISTINCT

指定 COUNT 返回唯一非空值的数量。

expression

一个表达式，其类型是除 uniqueidentifier、text、image 或 ntext 之外的任何类型。不允许使用聚合函数和子查询。

*

指定应该计算所有行以返回表中行的总数。COUNT(*) 不需要任何参数，而且不能与 DISTINCT 一起使用。COUNT(*) 不需要 expression 参数，因为根据定义，该函数不使用有关任何特定列的信息。COUNT(*) 返回指定表中行的数量而不消除副本。它对每行分别进行计数，包括含有空值的行。

重要 当使用 CUBE 或 ROLLUP 时，不支持区分聚合，例如 AVG(DISTINCT column_name)、COUNT(DISTINCT column_name)、MAX(DISTINCT column_name)、MIN(DISTINCT column_name) 和 SUM(DISTINCT column_name)。如果使用了，Microsoft® SQL Server™ 将返回错误信息并取消查询。

返回类型

int

注释

COUNT(*) 返回组中项目的数量，这些项目包括 NULL 值和副本。

COUNT(ALL expression) 对组中的每一行都计算 expression 并返回非空值的数量。

COUNT(DISTINCT expression) 对组中的每一行都计算 expression 并返回唯一非空值的数量。

示例
A. 使用 COUNT 和 DISTINCT

下面的示例查找作者所居住的不同城市的数量。

USE pubs
GO
SELECT COUNT(DISTINCT city)
FROM authors
GO

下面是结果集：

-----------
16

(1 row(s) affected)
B. 使用 COUNT(*)

下面的查询查找图书和书名的总数：

USE pubs
GO
SELECT COUNT(*)
FROM titles
GO

下面是结果集：

-----------
18

(1 row(s) affected)
C. 与其它聚合函数一起使用 COUNT(*)

下面的示例显示可以与选择列表中的其它聚合函数结合使用的 COUNT(*)。

USE pubs
GO
SELECT COUNT(*), AVG(price)
FROM titles
WHERE advance > $1000
GO

下面是结果集：

----------- --------------------------
15          14.42

(1 row(s) affected)

请参见

聚合函数


COUNT_BIG

返回组中项目的数量。COUNT_BIG 的使用与 COUNT 函数相似。它们之间的唯一差别是它们的返回值：COUNT_BIG 总是返回 bigint 数据类型值，而 COUNT 则总是返回 int 数据类型值。

语法

COUNT_BIG ( { [ ALL | DISTINCT ] expression } | * )

参数

ALL

对所有的值进行聚合函数运算。ALL 是默认设置。

DISTINCT

指定 COUNT_BIG 返回唯一非空值的数量。

expression

一个表达式，其类型是除 uniqueidentifier、text、image 或 ntext 之外的任何类型。不允许使用聚合函数和子查询。

*

指定应该计算所有行以返回表中行的总数。COUNT_BIG(*) 不需要任何参数，而且不能与 DISTINCT 一起使用。COUNT(*) 函数不需要 expression 参数，因为根据定义，该函数不使用有关任何特定列的信息。COUNT_BIG(*) 返回指定表中行的数量而不消除副本。它对每行分别进行计数，包括含有空值的行。

返回类型

bigint

注释

COUNT_BIG(*) 返回组中项目的数量，这些项目包括 NULL 值和副本。

COUNT_BIG(ALL expression) 对组中的每一行都计算 expression 并返回非空值的数量。

COUNT_BIG(DISTINCT expression) 对组中的每一行都计算 expression 并返回唯一非空值的数量。

请参见

int、bigint、smallint 和 tinyint


CREATE DATABASE

创建一个新数据库及存储该数据库的文件，或从先前创建的数据库的文件中附加数据库。

说明 有关与 DISK INIT 向后兼容性的更多信息，请参见"Microsoft® SQL Server™ 向后兼容性详细信息"中的设备（级别 3）。

语法

CREATE DATABASE database_name
[ ON
[ < filespec > [ ,...n ] ]
[ , < filegroup > [ ,...n ] ]
]
[ LOG ON { < filespec > [ ,...n ] } ]
[ COLLATE collation_name ]
[ FOR LOAD | FOR ATTACH ]

< filespec > ::=

[ PRIMARY ]
( [ NAME = logical_file_name , ]
FILENAME = 'os_file_name'
[ , SIZE = size ]
[ , MAXSIZE = { max_size | UNLIMITED } ]
[ , FILEGROWTH = growth_increment ] ) [ ,...n ]

< filegroup > ::=

FILEGROUP filegroup_name < filespec > [ ,...n ]

参数

database_name

新数据库的名称。数据库名称在服务器中必须唯一，并且符合标识符的规则。database_name 最多可以包含 128 个字符，除非没有为日志指定逻辑名。如果没有指定日志文件的逻辑名，则 Microsoft® SQL Server™ 会通过向 database_name 追加后缀来生成逻辑名。该操作要求 database_name 在 123 个字符之内，以便生成的日志文件逻辑名少于 128 个字符。

ON

指定显式定义用来存储数据库数据部分的磁盘文件（数据文件）。该关键字后跟以逗号分隔的 <filespec> 项列表，<filespec> 项用以定义主文件组的数据文件。主文件组的文件列表后可跟以逗号分隔的 <filegroup> 项列表（可选），<filegroup> 项用以定义用户文件组及其文件。

n

占位符，表示可以为新数据库指定多个文件。

LOG ON

指定显式定义用来存储数据库日志的磁盘文件（日志文件）。该关键字后跟以逗号分隔的 <filespec> 项列表，<filespec> 项用以定义日志文件。如果没有指定 LOG ON，将自动创建一个日志文件，该文件使用系统生成的名称，大小为数据库中所有数据文件总大小的 25%。

FOR LOAD

支持该子句是为了与早期版本的 Microsoft SQL Server 兼容。数据库在打开 dbo use only 数据库选项的情况下创建，并且将其状态设置为正在装载。SQL Server 7.0 版中不需要该子句，因为 RESTORE 语句可以作为还原操作的一部分重新创建数据库。

FOR ATTACH

指定从现有的一组操作系统文件中附加数据库。必须有指定第一个主文件的 <filespec> 条目。至于其它 <filespec> 条目，只需要与第一次创建数据库或上一次附加数据库时路径不同的文件的那些条目。必须为这些文件指定 <filespec> 条目。附加的数据库必须使用与 SQL Server 相同的代码页和排序次序创建。应使用 sp_attach_db 系统存储过程，而不要直接使用 CREATE DATABASE FOR ATTACH。只有必须指定 16 个以上的 <filespec> 项目时，才需要使用 CREATE DATABASE FOR ATTACH。

如果将数据库附加到的服务器不是该数据库从中分离的服务器，并且启用了分离的数据库以进行复制，则应该运行 sp_removedbreplication 从数据库删除复制。

collation_name

指定数据库的默认排序规则。排序规则名称既可以是 Windows 排序规则名称，也可以是 SQL 排序规则名称。如果没有指定排序规则，则将 SQL Server 实例的默认排序规则指派为数据库的排序规则。

有关 Windows 和 SQL 排序规则名称的更多信息，请参见 COLLATE。

PRIMARY

指定关联的 <filespec> 列表定义主文件。主文件组包含所有数据库系统表。还包含所有未指派给用户文件组的对象。主文件组的第一个 <filespec> 条目成为主文件，该文件包含数据库的逻辑起点及其系统表。一个数据库只能有一个主文件。如果没有指定 PRIMARY，那么 CREATE DATABASE 语句中列出的第一个文件将成为主文件。

NAME

为由 <filespec> 定义的文件指定逻辑名称。如果指定了 FOR ATTACH，则不需要指定 NAME 参数。

logical_file_name

用来在创建数据库后执行的 Transact-SQL 语句中引用文件的名称。logical_file_name 在数据库中必须唯一，并且符合标识符的规则。该名称可以是字符或 Unicode 常量，也可以是常规标识符或定界标识符。

FILENAME

为 <filespec> 定义的文件指定操作系统文件名。

'os_file_name'

操作系统创建 <filespec> 定义的物理文件时使用的路径名和文件名。os_file_name 中的路径必须指定 SQL Server 实例上的目录。os_file_name 不能指定压缩文件系统中的目录。

如果文件在原始分区上创建，则 os_file_name 必须只指定现有原始分区的驱动器字母。每个原始分区上只能创建一个文件。原始分区上的文件不会自动增长；因此，os_file_name 指定原始分区时，不需要指定 MAXSIZE 和 FILEGROWTH 参数。

SIZE

指定 <filespec> 中定义的文件的大小。如果主文件的 <filespec> 中没有提供 SIZE 参数，那么 SQL Server 将使用 model 数据库中的主文件大小。如果次要文件或日志文件的 <filespec> 中没有指定 SIZE 参数，则 SQL Server 将使文件大小为 1 MB。

size

<filespec> 中定义的文件的初始大小。可以使用千字节 (KB)、兆字节 (MB)、千兆字节 (GB) 或兆兆字节 (TB) 后缀。默认值为 MB。指定一个整数，不要包含小数位。size 的最小值为 512 KB。如果没有指定 size，则默认值为 1 MB。为主文件指定的大小至少应与 model 数据库的主文件大小相同。

MAXSIZE

指定 <filespec> 中定义的文件可以增长到的最大大小。

max_size

<filespec> 中定义的文件可以增长到的最大大小。可以使用千字节 (KB)、兆字节 (MB)、千兆字节 (GB) 或兆兆字节 (TB) 后缀。默认值为 MB。指定一个整数，不要包含小数位。如果没有指定 max_size，那么文件将增长到磁盘变满为止。

说明 在磁盘即将变满时，Microsoft Windows NT® S/B 系统日志会警告 SQL Server 系统管理员。

UNLIMITED

指定 <filespec> 中定义的文件将增长到磁盘变满为止。

FILEGROWTH

指定 <filespec> 中定义的文件的增长增量。文件的 FILEGROWTH 设置不能超过 MAXSIZE 设置。

growth_increment

每次需要新的空间时为文件添加的空间大小。指定一个整数，不要包含小数位。0 值表示不增长。该值可以 MB、KB、GB、TB 或百分比 (%) 为单位指定。如果未在数量后面指定 MB、KB 或 %，则默认值为 MB。如果指定 %，则增量大小为发生增长时文件大小的指定百分比。如果没有指定 FILEGROWTH，则默认值为 10%，最小值为 64 KB。指定的大小舍入为最接近的 64 KB 的倍数。

注释

使用一条 CREATE DATABASE 语句即可创建数据库以及存储该数据库的文件。SQL Server 分两步实现 CREATE DATABASE 语句：

  1. SQL Server 使用 model 数据库的复本初始化数据库及其元数据。

  2. 然后，SQL Server 使用空页填充数据库的剩余部分，除了包含记录数据库中空间使用情况以外的内部数据页。

因此，model 数据库中任何用户定义对象均复制到所有新创建的数据库中。可以向 model 数据库中添加任何对象，例如表、视图、存储过程、数据类型等，以将这些对象添加到所有数据库中。

每个新数据库都从 model 数据库继承数据库选项设置（除非指定了 FOR ATTACH）。例如，在 model 和任何创建的新数据库中，数据库选项 select into/bulkcopy 都设置为 OFF。如果使用 ALTER DATABASE 更改 model 数据库的选项，则这些选项设置会在创建的新数据库中生效。如果在 CREATE DATABASE 语句中指定了 FOR ATTACH，则新数据库将继承原始数据库的数据库选项设置。

一台服务器上最多可以指定 32,767 个数据库。

有三种类型的文件用来存储数据库：

  1. 主文件包含数据库的启动信息。主文件还可以用来存储数据。每个数据库都包含一个主文件。

  2. 次要文件保存所有主要数据文件中容纳不下的数据。如果主文件大到足以容纳数据库中的所有数据，就不需要有次要数据文件。而另一些数据库可能非常大，需要多个次要数据文件，也可能使用多个独立磁盘驱动器上的次要文件，以将数据分布在多个磁盘上。

  3. 事务日志文件保存用来恢复数据库的日志信息。每个数据库必须至少有一个事务日志文件（尽管可以有多个）。事务日志文件最小为 512 KB。

每个数据库至少有两个文件，一个主文件和一个事务日志文件。

尽管 'os_file_name' 可以是任何有效的操作系统文件名，但如果使用以下建议的扩展名，则可以更加清楚地反映文件的用途。

文件类型 | 文件扩展名
主要数据文件 | .mdf
次要数据文件 | .ndf
事务日志文件 | .ldf

说明 创建用户数据库后，应备份 master 数据库。

SIZE、MAXSIZE 和 FILEGROWTH 参数中不能指定分数。若要在 SIZE 参数中指定以兆字节为单位的分数，请将该数字乘以 1,024 转换成千字节。例如，指定 1,536 KB 而不要指定 1.5 MB（1.5 乘以 1,024 等于 1,536）。

如果仅指定 CREATE DATABASE database_name 语句而不带其它参数，那么数据库的大小将与 model 数据库的大小相等。

所有数据库都至少包含一个主文件组。所有系统表都分配在主文件组中。数据库还可以包含用户定义的文件组。如果使用指定用户定义文件组的 ON filegroup 子句创建对象，则该对象的所有页均从指定的文件组中分配。所有没有使用 ON filegroup 子句（或者使用 ON DEFAULT 子句）创建的用户对象的页将从默认文件组分配。数据库首次创建时，主文件组就是默认文件组。可以使用 ALTER DATABASE 将用户定义的文件组指定为默认文件组：

ALTER DATABASE database_name MODIFY FILEGROUP filegroup_name DEFAULT

每个数据库都有一个所有者，可在该数据库中执行某些特殊的活动。所有者是创建数据库的用户。可以使用 sp_changedbowner 更改数据库所有者。

若要为 SQL Server 实例显示某个数据库或所有数据库的报表，请执行 sp_helpdb。若要显示有关数据库中所占用空间的报表，请使用 sp_spaceused。若要显示有关数据库中文件组的报表，请使用 sp_helpfilegroup，使用 sp_helpfile 可显示数据库中文件的报表。

早期版本的 SQL Server 使用 DISK INIT 语句在执行 CREATE DATABASE 语句之前为数据库创建文件。为了与早期版本的 SQL Server 向后兼容，CREATE DATABASE 语句也可以在用 DISK INIT 创建的文件或设备上创建新数据库。有关更多信息，请参见 SQL Server 向后兼容性详细信息。

权限

CREATE DATABASE 的权限默认地授予 sysadmin 和 dbcreator 固定服务器角色的成员。sysadmin 和 securityadmin 固定服务器角色的成员可以将 CREATE DATABASE 权限授予其它登录。sysadmin 和 dbcreator 固定服务器角色的成员可以为 dbcreator 角色添加其它登录。CREATE DATABASE 权限必须显式授予，而不能通过 GRANT ALL 语句授予。

CREATE DATABASE 权限通常限于少数登录，以便控制对运行 SQL Server 实例的计算机上磁盘的使用。

示例
A. 创建指定数据文件和事务日志文件的数据库

下面的示例创建名为 Sales 的数据库。因为没有使用关键字 PRIMARY，第一个文件 (Sales_dat) 成为主文件。因为 Sales_dat 文件的 SIZE 参数没有指定 MB 或 KB，因此默认为 MB，以兆字节为单位进行分配。Sales_log 文件以兆字节为单位进行分配，因为 SIZE 参数中显式声明了 MB 后缀。

USE master
GO
CREATE DATABASE Sales
ON
( NAME = Sales_dat,
   FILENAME = 'c:\program files\microsoft sql server\mssql\data\saledat.mdf',
   SIZE = 10,
   MAXSIZE = 50,
   FILEGROWTH = 5 )
LOG ON
( NAME = 'Sales_log',
   FILENAME = 'c:\program files\microsoft sql server\mssql\data\salelog.ldf',
   SIZE = 5MB,
   MAXSIZE = 25MB,
   FILEGROWTH = 5MB )
GO
B. 指定多个数据文件和事务日志文件创建数据库

下面的示例使用三个 100 MB 的数据文件和两个 100 MB 的事务日志文件创建了名为 Archive 的数据库。主文件是列表中的第一个文件，并使用 PRIMARY 关键字显式指定。事务日志文件在 LOG ON 关键字后指定。注意 FILENAME 选项中所用的文件扩展名：主要数据文件使用 .mdf，次要数据文件使用 .ndf，事务日志文件使用 .ldf。

USE master
GO
CREATE DATABASE Archive
ON
PRIMARY ( NAME = Arch1,
      FILENAME = 'c:\program files\microsoft sql server\mssql\data\archdat1.mdf',
      SIZE = 100MB,
      MAXSIZE = 200,
      FILEGROWTH = 20),
( NAME = Arch2,
   FILENAME = 'c:\program files\microsoft sql server\mssql\data\archdat2.ndf',
   SIZE = 100MB,
   MAXSIZE = 200,
   FILEGROWTH = 20),
( NAME = Arch3,
   FILENAME = 'c:\program files\microsoft sql server\mssql\data\archdat3.ndf',
   SIZE = 100MB,
   MAXSIZE = 200,
   FILEGROWTH = 20)
LOG ON
( NAME = Archlog1,
   FILENAME = 'c:\program files\microsoft sql server\mssql\data\archlog1.ldf',
   SIZE = 100MB,
   MAXSIZE = 200,
   FILEGROWTH = 20),
( NAME = Archlog2,
   FILENAME = 'c:\program files\microsoft sql server\mssql\data\archlog2.ldf',
   SIZE = 100MB,
   MAXSIZE = 200,
   FILEGROWTH = 20)
GO
C. 创建简单的数据库

本例创建名为 Products 的数据库，并指定单个文件。指定的文件成为主文件，并会自动创建一个 1 MB 的事务日志文件。因为主文件的 SIZE 参数中没有指定 MB 或 KB，所以主文件将以兆字节为单位进行分配。因为没有为事务日志文件指定 <filespec>，所以事务日志文件没有 MAXSIZE，可以增长到填满所有可用的磁盘空间为止。

USE master
GO
CREATE DATABASE Products
ON
( NAME = prods_dat,
   FILENAME = 'c:\program files\microsoft sql server\mssql\data\prods.mdf',
   SIZE = 4,
   MAXSIZE = 10,
   FILEGROWTH = 1 )
GO
D. 不指定文件创建数据库

下面的示例创建名为 mytest 的数据库，并创建相应的主文件和事务日志文件。因为该语句没有 <filespec> 项，所以主数据库文件的大小为 model 数据库主文件的大小。事务日志文件的大小为 model 数据库事务日志文件的大小。因为没有指定 MAXSIZE，文件可以增长到填满所有可用的磁盘空间为止。

CREATE DATABASE mytest
E. 不指定 SIZE 创建数据库

下面的示例创建名为 products2 的数据库。文件 prods2_dat 将成为主文件，大小等于 model 数据库中主文件的大小。事务日志文件会自动创建，其大小为主文件大小的 25% 或 512 KB 中的较大值。因为没有指定 MAXSIZE，文件可以增长到填满所有可用的磁盘空间为止。

USE master
GO
CREATE DATABASE Products2
ON
( NAME = prods2_dat,
   FILENAME = 'c:\program files\microsoft sql server\mssql\data\prods2.mdf' )
GO
F. 使用文件组创建数据库

下面的示例使用三个文件组创建名为 sales 的数据库：

  • 主文件组包含文件 Spri1_dat 和 Spri2_dat。指定这些文件的 FILEGROWTH 增量为 15%。

  • 名为 SalesGroup1 的文件组包含文件 SGrp1Fi1 和 SGrp1Fi2。

  • 名为 SalesGroup2 的文件组包含文件 SGrp2Fi1 和 SGrp2Fi2。
CREATE DATABASE Sales
ON PRIMARY
( NAME = SPri1_dat,
   FILENAME = 'c:\program files\microsoft sql server\mssql\data\SPri1dat.mdf',
   SIZE = 10,
   MAXSIZE = 50,
   FILEGROWTH = 15% ),
( NAME = SPri2_dat,
   FILENAME = 'c:\program files\microsoft sql server\mssql\data\SPri2dt.ndf',
   SIZE = 10,
   MAXSIZE = 50,
   FILEGROWTH = 15% ),
FILEGROUP SalesGroup1
( NAME = SGrp1Fi1_dat,
   FILENAME = 'c:\program files\microsoft sql server\mssql\data\SG1Fi1dt.ndf',
   SIZE = 10,
   MAXSIZE = 50,
   FILEGROWTH = 5 ),
( NAME = SGrp1Fi2_dat,
   FILENAME = 'c:\program files\microsoft sql server\mssql\data\SG1Fi2dt.ndf',
   SIZE = 10,
   MAXSIZE = 50,
   FILEGROWTH = 5 ),
FILEGROUP SalesGroup2
( NAME = SGrp2Fi1_dat,
   FILENAME = 'c:\program files\microsoft sql server\mssql\data\SG2Fi1dt.ndf',
   SIZE = 10,
   MAXSIZE = 50,
   FILEGROWTH = 5 ),
( NAME = SGrp2Fi2_dat,
   FILENAME = 'c:\program files\microsoft sql server\mssql\data\SG2Fi2dt.ndf',
   SIZE = 10,
   MAXSIZE = 50,
   FILEGROWTH = 5 )
LOG ON
( NAME = 'Sales_log',
   FILENAME = 'c:\program files\microsoft sql server\mssql\data\salelog.ldf',
   SIZE = 5MB,
   MAXSIZE = 25MB,
   FILEGROWTH = 5MB )
GO
G. 附加数据库

示例 B 创建一个包含下列物理文件的名为 Archive 的数据库：

c:\program files\microsoft sql server\mssql\data\archdat1.mdf
c:\program files\microsoft sql server\mssql\data\archdat2.ndf
c:\program files\microsoft sql server\mssql\data\archdat3.ndf
c:\program files\microsoft sql server\mssql\data\archlog1.ldf
c:\program files\microsoft sql server\mssql\data\archlog2.ldf

可以使用 sp_detach_db 存储过程分离该数据库，然后使用带有 FOR ATTACH 子句的 CREATE DATABASE 重新附加。

sp_detach_db Archive
GO
CREATE DATABASE Archive
ON PRIMARY (FILENAME = 'c:\program files\microsoft sql server\mssql\data\archdat1.mdf')
FOR ATTACH
GO
H. 使用原始分区

下面的示例使用原始分区创建名为 Employees 的数据库。执行语句时，原始分区必须存在，并且每个原始分区只能创建一个文件。

USE master
GO
CREATE DATABASE Employees
ON
( NAME = Empl_dat,
   FILENAME = 'f:',
   SIZE = 10,
   MAXSIZE = 50,
   FILEGROWTH = 5 )
LOG ON
( NAME = 'Sales_log',
   FILENAME = 'g:',
   SIZE = 5MB,
   MAXSIZE = 25MB,
   FILEGROWTH = 5MB )
GO
I. 使用已装入的驱动器

下面的示例使用指向原始分区的已装入驱动器创建名为 Employees 的数据库。此功能只在 Microsoft® Windows® 2000 Server 中才可用。.执行语句时必须已经存在已装入的驱动器和原始分区，并且每个原始分区上只能有一个文件。当在已装入的驱动器上创建数据库文件时，必须用尾随反斜线结束驱动器路径。

USE master
GO
CREATE DATABASE Employees
ON
( NAME = Empl_dat,
   FILENAME = 'd:\sample data dir\',
   SIZE = 10,
   MAXSIZE = 50,
   FILEGROWTH = 5 )
LOG ON
( NAME = 'Sales_log',
   FILENAME = 'd:\sample log dir\',
   SIZE = 5MB,
   MAXSIZE = 25MB,
   FILEGROWTH = 5MB )
GO

请参见

ALTER DATABASE

DROP DATABASE

sp_attach_db

sp_changedbowner

sp_detach_db

sp_helpdb

sp_helpfile

sp_helpfilegroup

sp_removedbreplication

sp_renamedb

sp_spaceused

使用原始分区


CREATE DEFAULT

创建称为默认值的对象。当绑定到列或用户定义数据类型时，如果插入时没有明确提供值，默认值便指定一个值，并将其插入到对象所绑定的列中（或者，在用户定义数据类型的情况下，插入到所有列中）。默认值是一个向后兼容的功能，它执行一些与使用 ALTER 或 CREATE TABLE 语句的 DEFAULT 关键字创建的默认值定义相同的功能。默认值定义是限制列数据的首选并且标准的方法，因为定义和表存储在一起，当除去表时，将自动除去默认值定义。然而，当在多个列中多次使用默认值时，默认值也有其优点。

语法

CREATE DEFAULT default
AS constant_expression

参数

default

默认值的名称。默认值名称必须符合标识符的规则。可以选择是否指定默认值所有者名称。

constant_expression

只包含常量值的表达式（不能包含任何列或其它数据库对象的名称）。可以使用任何常量、内置函数或数学表达式。字符和日期常量用单引号 (') 引起来；货币、整数和浮点常量不需要使用引号。二进制数据必须以 0x 开头，货币数据必须以美元符号 ($) 开头。默认值必须与列数据类型兼容。

注释

只能在当前数据库中创建默认值的名称。在数据库中，每个所有者的各默认值名称必须是唯一的。创建默认值后，使用 sp_bindefault 将其绑定到列或用户定义数据类型。

如果默认值和其绑定到的列不兼容，则在尝试插入默认值时，Microsoft® SQL Server™ 会生成错误信息。例如，N/A 不能用作 numeric 列的默认值。

如果默认值对于它所绑定的列而言太长，该值就会被截断。

在单个批处理中，CREATE DEFAULT 语句不能与其它 Transact-SQL 语句组合使用。

在以相同的名称创建新的默认值之前，必须除去原有的默认值，在除去前，必须通过执行 sp_unbindefault 来取消对该默认值的绑定。

如果列同时有默认值和规则与之关联，则默认值不能违反规则。与规则冲突的默认值将永远不能插入列，每次试图插入这样的默认值时，SQL Server 都会生成错误信息。

当绑定到列以后，在以下情况下将插入默认值：

  • 非显式地插入值。

  • 在 INSERT 中使用 DEFAULT VALUES 或 DEFAULT 关键字来插入默认值。

如果在创建列时指定 NOT NULL 并且没有为其创建默认值，则当用户未能为该列输入项时，就会生成错误信息。下表说明默认值的存在性与将列定义为 NULL 或 NOT NULL 之间的关系。表中的条目显示了结果。

列定义 | 没有输入项， 没有默认值 | 没有输入项，有默认值 | 输入 NULL， 没有默认值 | 输入 NULL，有默认值
NULL | NULL | default | NULL | NULL
NOT NULL | Error | default | error | error

说明 SQL Server 是将空字符串解释为单个空格还是解释为真正的空字符串，由 sp_dbcmptlevel 的设置控制。如果兼容级别小于或等于 65，SQL Server 就将空字符串解释为单个空格。如果兼容级别等于 70，则 SQL Server 将空字符串解释为空字符串。有关更多信息，请参见 sp_dbcmptlevel。

若要重命名默认值，请使用 sp_rename。若要获得默认值的报表，请使用 sp_help。

权限

CREATE DEFAULT 的权限默认授予 sysadmin 固定服务器角色成员和 db_owner 和 db_ddladmin 固定数据库角色成员。sysadmin、db_owner 和 db_securityadmin 角色的成员可以将权限转让给其他用户。

示例
A.创建简单的字符默认值

下面的示例创建字符默认值 unknown。

USE pubs
GO
CREATE DEFAULT phonedflt AS 'unknown'
B.绑定默认值

下面的示例绑定示例 A 中创建的默认值。只有当 authors 表的 phone 列没有输入项时，该默认值才起作用。请注意，没有输入项和显式指定空值不同。

因为名为 phonedflt 的默认值不存在，所以下列 Transact-SQL 语句将失败。本例只用于演示。

USE pubs
GO
sp_bindefault phonedflt, 'authors.phone'

请参见

ALTER TABLE

批处理

CREATE RULE

CREATE TABLE

DROP DEFAULT

DROP RULE

表达式

INSERT

sp_bindefault

sp_help

sp_helptext

sp_rename

sp_unbindefault

使用标识符


CREATE FUNCTION

创建用户定义函数，它是返回值的已保存的 Transact-SQL 例程。用户定义函数不能用于执行一组修改全局数据库状态的操作。与系统函数一样，用户定义函数可以从查询中唤醒调用。也可以像存储过程一样，通过 EXECUTE 语句执行。

用户定义函数用 ALTER FUNCTION 修改，用 DROP FUNCTION 除去。

语法

标量函数

CREATE FUNCTION [ owner_name.] function_name
( [ { @parameter_name [AS] scalar_parameter_data_type [ = default ] } [ ,...n ] ] )

RETURNS scalar_return_data_type

[ WITH < function_option> [ [,] ...n] ]

[ AS ]

BEGIN
function_body
RETURN scalar_expression
END

内嵌表值函数

CREATE FUNCTION [ owner_name.] function_name
( [ { @parameter_name [AS] scalar_parameter_data_type [ = default ] } [ ,...n ] ] )

RETURNS TABLE

[ WITH < function_option > [ [,] ...n ] ]

[ AS ]

RETURN [ ( ] select-stmt [ ) ]

多语句表值函数

CREATE FUNCTION [ owner_name.] function_name
( [ { @parameter_name [AS] scalar_parameter_data_type [ = default ] } [ ,...n ] ] )

RETURNS @return_variable TABLE < table_type_definition >

[ WITH < function_option > [ [,] ...n ] ]

[ AS ]

BEGIN
function_body
RETURN
END

< function_option > ::=
{ ENCRYPTION | SCHEMABINDING }

< table_type_definition > ::=
( { column_definition | table_constraint } [ ,...n ] )

参数

owner_name

拥有该用户定义函数的用户 ID 的名称。owner_name 必须是现有的用户 ID。

function_name

用户定义函数的名称。函数名称必须符合标识符的规则，对其所有者来说，该名称在数据库中必须是唯一的。

@parameter_name

用户定义函数的参数。CREATE FUNCTION 语句中可以声明一个或多个参数。函数最多可以有 1,024 个参数。函数执行时每个已声明参数的值必须由用户指定，除非该参数的默认值已经定义。 如果函数的参数有默认值，在调用该函数时必须指定"default"关键字才能获得默认值。这种行为不同于存储过程中有默认值的参数，在存储过程中省略参数也意味着使用默认值。

使用 @ 符号作为第一个字符来指定参数名称。参数名称必须符合标识符的规则。每个函数的参数仅用于该函数本身；相同的参数名称可以用在其它函数中。参数只能代替常量；而不能用于代替表名、列名或其它数据库对象的名称。

scalar_parameter_data_type

参数的数据类型。所有标量数据类型（包括 bigint 和 sql_variant）都可用作用户定义函数的参数。不支持 timestamp 数据类型和用户定义数据类型。不能指定非标量类型（例如 cursor 和 table）。

scalar_return_data_type

是标量用户定义函数的返回值。scalar_return_data_type 可以是 SQL Server 支持的任何标量数据类型（text、ntext、image 和 timestamp 除外）。

scalar_expression

指定标量函数返回的标量值。

TABLE

指定表值函数的返回值为表。

在内嵌表值函数中，通过单个 SELECT 语句定义 TABLE 返回值。内嵌函数没有相关联的返回变量。

在多语句表值函数中，@return_variable 是 TABLE 变量，用于存储和累积应作为函数值返回的行。

function_body

指定一系列 Transact-SQL 语句定义函数的值，这些语句合在一起不会产生副作用。function_body 只用于标量函数和多语句表值函数。

在标量函数中，function_body 是一系列合起来求得标量值的 Transact-SQL 语句。

在多语句表值函数中，function_body 是一系列填充表返回变量的 Transact-SQL 语句。

select-stmt

是定义内嵌表值函数返回值的单个 SELECT 语句。

ENCRYPTION

指出 SQL Server 加密包含 CREATE FUNCTION 语句文本的系统表列。使用 ENCRYPTION 可以避免将函数作为 SQL Server 复制的一部分发布。

SCHEMABINDING

指定将函数绑定到它所引用的数据库对象。如果函数是用 SCHEMABINDING 选项创建的，则不能更改（使用 ALTER 语句）或除去（使用 DROP 语句）该函数引用的数据库对象。

函数与其所引用对象的绑定关系只有在发生以下两种情况之一时才被解除：

  1. 除去了函数。

  2. 在未指定 SCHEMABINDING 选项的情况下更改了函数（使用 ALTER 语句）。

只有在满足以下条件时，函数才能绑定到架构：

  1. 该函数所引用的用户定义函数和视图也已绑定到架构。

  2. 该函数所引用的对象不是用两部分名称引用的。

  3. 该函数及其引用的对象属于同一数据库。

  4. 执行 CREATE FUNCTION 语句的用户对所有该函数所引用的数据库对象都具有 REFERENCES 权限。

如果不符合以上条件，则指定了 SCHEMABINDING 选项的 CREATE FUNCTION 语句将失败。

注释

用户定义函数为标量值函数或表值函数。如果 RETURNS 子句指定一种标量数据类型，则函数为标量值函数。可以使用多条 Transact-SQL 语句定义标量值函数。

如果 RETURNS 子句指定 TABLE，则函数为表值函数。根据函数主体的定义方式，表值函数可分为行内函数或多语句函数。

如果 RETURNS 子句指定的 TABLE 不附带列的列表，则该函数为行内函数。行内函数是使用单个 SELECT 语句定义的表值函数，该语句组成了函数的主体。该函数返回的表的列（包括数据类型）来自定义该函数的 SELECT 语句的 SELECT 列表。

如果 RETURNS 子句指定的 TABLE 类型带有列及其数据类型，则该函数是多语句表值函数。

多语句函数的主体中允许使用以下语句。未在下面的列表中列出的语句不能用在函数主体中。

  1. 赋值语句。

  2. 控制流语句。

  3. DECLARE 语句，该语句定义函数局部的数据变量和游标。

  4. SELECT 语句，该语句包含带有表达式的选择列表，其中的表达式将值赋予函数的局部变量。

  5. 游标操作，该操作引用在函数中声明、打开、关闭和释放的局部游标。只允许使用以 INTO 子句向局部变量赋值的 FETCH 语句；不允许使用将数据返回到客户端的 FETCH 语句。

  6. INSERT、UPDATE 和 DELETE 语句，这些语句修改函数的局部 table 变量。

  7. EXECUTE 语句调用扩展存储过程。
函数的确定性和副作用

函数可以是确定的或不确定的。如果任何时候用一组特定的输入值调用函数时返回的结果总是相同的，则这些函数为确定的。如果每次调用函数时即使用的是相同的一组特定输入值，返回的结果总是不同的，则这些函数为不确定的。

不确定的函数会产生副作用。副作用是更改数据库的某些全局状态，比如更新数据库表或某些外部资源，如文件或网络等（例如，修改文件或发送电子邮件消息）。

不允许在用户定义函数主体中内置不确定函数；这些不确定函数如下：

@@CONNECTIONS | @@TOTAL_ERRORS
@@CPU_BUSY | @@TOTAL_READ
@@IDLE | @@TOTAL_WRITE
@@IO_BUSY | GETDATE
@@MAX_CONNECTIONS | GETUTCDATE
@@PACK_RECEIVED | NEWID
@@PACK_SENT | RAND
@@PACKET_ERRORS | TEXTPTR
@@TIMETICKS |

尽管在用户定义函数主体中不允许有不确定函数，这些用户定义函数在调用扩展存储过程时仍会产生副作用。

由于扩展存储过程会对数据库产生副作用，因此调用扩展存储过程的函数是不确定的。当用户定义函数调用会对数据库产生副作用的扩展存储过程时，不要指望结果集保持一致或执行函数。

从函数中调用扩展存储过程

从函数内部调用时扩展存储过程无法向客户端返回结果集。任何向客户端返回结果集的 ODS API 都将返回 FAIL。扩展存储过程可以连接回 Microsoft® SQL Server™；但是，它不应尝试联接与唤醒调用扩展存储过程的函数相同的事务。

与从批处理或存储过程中唤醒调用相似，扩展存储过程在运行 SQL Server 的 Windows® 安全帐户的上下文中执行。存储过程的所有者在授予用户 EXECUTE 特权时应考虑这一点。

函数调用

在可使用标量表达式的位置可唤醒调用标量值函数，包括计算列和 CHECK 约束定义。当唤醒调用标量值函数时，至少应使用函数的两部分名称。

[database_name.]owner_name.function_name ([argument_expr][,...])

如果用户定义函数用于定义计算列，则该函数的确定性同样决定了是否可在该计算列上创建索引。只有当函数具有确定性时，才可以在使用该函数的计算列上创建索引。如果在输入相同的情况下函数始终返回相同的值，则该函数具有确定性。

可以使用由一部分组成的名称唤醒调用表值函数。

[database_name.][owner_name.]function_name ([argument_expr][,...])

对于 Microsoft® SQL Server™ 2000 中包含的系统表函数，唤醒调用时需在函数名的前面加上前缀"::"。

SELECT *
FROM ::fn_helpcollations()

对于导致语句停止执行然后从存储过程中的下一语句继续执行的 Transact-SQL 错误，在函数中的处理方式不同。在函数中，这类错误会导致函数停止执行。这反过来使唤醒调用该函数的语句停止执行。

权限

用户应具有执行 CREATE FUNCTION 语句的 CREATE FUNCTION 权限。

CREATE FUNCTION 的权限默认地授予 sysadmin 固定服务器角色和 db_owner 和 db_ddladmin 固定数据库角色的成员。sysadmin 和 db_owner 的成员可用 GRANT 语句将 CREATE FUNCTION 权限授予其它登录。

函数的所有者对其函数具有 EXECUTE 权限。其他用户不具有 EXECUTE 权限，除非给他们授予了特定函数上的 EXECUTE 权限。

若要创建或更改在 CONSTRAINT、DEFAULT 子句或计算列定义中引用了用户定义函数的表，用户还必须对这些函数有 REFERENCES 权限。

示例
A. 计算 ISO 周的标量值用户定义函数

下例中，用户定义函数 ISOweek 取日期参数并计算 ISO 周数。为了正确计算该函数，必须在调用该函数前唤醒调用 SET DATEFIRST 1。

CREATE FUNCTION ISOweek  (@DATE datetime)
RETURNS int
AS
BEGIN
   DECLARE @ISOweek int
   SET @ISOweek= DATEPART(wk,@DATE)+1
      -DATEPART(wk,CAST(DATEPART(yy,@DATE) as CHAR(4))+'0104')
--Special cases: Jan 1-3 may belong to the previous year
   IF (@ISOweek=0)
      SET @ISOweek=dbo.ISOweek(CAST(DATEPART(yy,@DATE)-1
         AS CHAR(4))+'12'+ CAST(24+DATEPART(DAY,@DATE) AS CHAR(2)))+1
--Special case: Dec 29-31 may belong to the next year
   IF ((DATEPART(mm,@DATE)=12) AND
      ((DATEPART(dd,@DATE)-DATEPART(dw,@DATE))>= 28))
      SET @ISOweek=1
   RETURN(@ISOweek)
END

下面是函数调用。注意 DATEFIRST 设置为 1。

SET DATEFIRST 1
SELECT master.dbo.ISOweek('12/26/1999') AS 'ISO Week'

下面是结果集。

ISO Week
----------------
52
B. 内嵌表值函数

下例返回内嵌表值函数。

USE pubs
GO
CREATE FUNCTION SalesByStore (@storeid varchar(30))
RETURNS TABLE
AS
RETURN (SELECT title, qty
      FROM sales s, titles t
      WHERE s.stor_id = @storeid and
      t.title_id = s.title_id)
C. 多语句表值函数

假设有一个表代表如下的层次关系：

CREATE TABLE employees (empid nchar(5) PRIMARY KEY,
      empname nvarchar(50),
      mgrid nchar(5) REFERENCES employees(empid),
      title nvarchar(30)
      )

表值函数 fn_FindReports(InEmpID) 有一个给定的职员ID，它返回与所有直接或间接向给定职员报告的职员相对应的表。该逻辑无法在单个查询中表现出来，不过可以实现为用户定义函数。

CREATE FUNCTION fn_FindReports (@InEmpId nchar(5))
RETURNS @retFindReports TABLE (empid nchar(5) primary key,
   empname nvarchar(50) NOT NULL,
   mgrid nchar(5),
   title nvarchar(30))
/*Returns a result set that lists all the employees who report to given
employee directly or indirectly.*/
AS
BEGIN
   DECLARE @RowsAdded int
   -- table variable to hold accumulated results
   DECLARE @reports TABLE (empid nchar(5) primary key,
      empname nvarchar(50) NOT NULL,
      mgrid nchar(5),
      title nvarchar(30),
      processed tinyint default 0)
-- initialize @Reports with direct reports of the given employee
   INSERT @reports
   SELECT empid, empname, mgrid, title, 0
   FROM employees
   WHERE empid = @InEmpId
   SET @RowsAdded = @@rowcount
   -- While new employees were added in the previous iteration
   WHILE @RowsAdded > 0
   BEGIN
      /*Mark all employee records whose direct reports are going to be
   found in this iteration with processed=1.*/
      UPDATE @reports
      SET processed = 1
      WHERE processed = 0
      -- Insert employees who report to employees marked 1.
      INSERT @reports
      SELECT e.empid, e.empname, e.mgrid, e.title, 0
      FROM employees e, @reports r
      WHERE e.mgrid=r.empid and e.mgrid <> e.empid and r.processed = 1
      SET @RowsAdded = @@rowcount
      /*Mark all employee records whose direct reports have been found
   in this iteration.*/
      UPDATE @reports
      SET processed = 2
      WHERE processed = 1
   END

   -- copy to the result of the function the required columns
   INSERT @retFindReports
   SELECT empid, empname, mgrid, title
   FROM @reports
   RETURN
END
GO

-- Example invocation
SELECT *
FROM fn_FindReports('11234')
GO

请参见

ALTER FUNCTION

DROP FUNCTION

唤醒调用用户定义函数

用户定义函数


CREATE INDEX

为给定表或视图创建索引。

只有表或视图的所有者才能为表创建索引。表或视图的所有者可以随时创建索引，无论表中是否有数据。可以通过指定限定的数据库名称，为另一个数据库中的表或视图创建索引。

语法

CREATE [ UNIQUE ] [ CLUSTERED | NONCLUSTERED ] INDEX index_name
ON { table | view } ( column [ ASC | DESC ] [ ,...n ] )
[ WITH < index_option > [ ,...n] ]
[ ON filegroup ]

< index_option > ::=
{ PAD_INDEX |
FILLFACTOR = fillfactor |
IGNORE_DUP_KEY |
DROP_EXISTING |
STATISTICS_NORECOMPUTE |
SORT_IN_TEMPDB
}

参数

UNIQUE

为表或视图创建唯一索引（不允许存在索引值相同的两行）。视图上的聚集索引必须是 UNIQUE 索引。

在创建索引时，如果数据已存在，Microsoft® SQL Server™ 会检查是否有重复值，并在每次使用 INSERT 或 UPDATE 语句添加数据时进行这种检查。如果存在重复的键值，将取消 CREATE INDEX 语句，并返回错误信息，给出第一个重复值。当创建 UNIQUE 索引时，有多个 NULL 值被看作副本。

如果存在唯一索引，那么会产生重复键值的 UPDATE 或 INSERT 语句将回滚，SQL Server 将显示错误信息。即使 UPDATE 或 INSERT 语句更改了许多行但只产生了一个重复值，也会出现这种情况。如果在有唯一索引并且指定了 IGNORE_DUP_KEY 子句情况下输入数据，则只有违反 UNIQUE 索引的行才会失败。在处理 UPDATE 语句时，IGNORE_DUP_KEY 不起作用。

SQL Server 不允许为已经包含重复值的列创建唯一索引，无论是否设置了 IGNORE_DUP_KEY。如果尝试这样做，SQL Server 会显示错误信息；重复值必须先删除，才能为这些列创建唯一索引。

CLUSTERED

创建一个对象，其中行的物理排序与索引排序相同，并且聚集索引的最低一级（叶级）包含实际的数据行。一个表或视图只允许同时有一个聚集索引。

具有聚集索引的视图称为索引视图。必须先为视图创建唯一聚集索引，然后才能为该视图定义其它索引。

在创建任何非聚集索引之前创建聚集索引。创建聚集索引时重建表上现有的非聚集索引。

如果没有指定 CLUSTERED，则创建非聚集索引。

说明 因为按照定义，聚集索引的叶级与其数据页相同，所以创建聚集索引时使用 ON filegroup 子句实际上会将表从创建该表时所用的文件移到新的文件组中。在特定的文件组上创建表或索引之前，应确认哪些文件组可用并且有足够的空间供索引使用。文件组的大小必须至少是整个表所需空间的 1.2 倍，这一点很重要。

NONCLUSTERED

创建一个指定表的逻辑排序的对象。对于非聚集索引，行的物理排序独立于索引排序。非聚集索引的叶级包含索引行。每个索引行均包含非聚集键值和一个或多个行定位器（指向包含该值的行）。如果表没有聚集索引，行定位器就是行的磁盘地址。如果表有聚集索引，行定位器就是该行的聚集索引键。

每个表最多可以有 249 个非聚集索引（无论这些非聚集索引的创建方式如何：是使用 PRIMARY KEY 和 UNIQUE 约束隐式创建，还是使用 CREATE INDEX 显式创建）。每个索引均可以提供对数据的不同排序次序的访问。

对于索引视图，只能为已经定义了聚集索引的视图创建非聚集索引。因此，索引视图中非聚集索引的行定位器一定是行的聚集键。

index_name

是索引名。索引名在表或视图中必须唯一，但在数据库中不必唯一。索引名必须遵循标识符规则。

table

包含要创建索引的列的表。可以选择指定数据库和表所有者。

view

要建立索引的视图的名称。必须使用 SCHEMABINDING 定义视图才能在视图上创建索引。视图定义也必须具有确定性。如果选择列表中的所有表达式、WHERE 和 GROUP BY 子句都具有确定性，则视图也具有确定性。而且，所有键列必须是精确的。只有视图的非键列可能包含浮点表达式（使用 float 数据类型的表达式），而且 float 表达式不能在视图定义的其它任何位置使用。

若要在确定性视图中查找列，请使用 COLUMNPROPERTY 函数（IsDeterministic 属性）。该函数的 IsPrecise 属性可用来确定键列是否精确。

必须先为视图创建唯一的聚集索引，才能为该视图创建非聚集索引。

在 SQL Server 企业版或开发版中，查询优化器可使用索引视图加快查询的执行速度。要使优化程序考虑将该视图作为替换，并不需要在查询中引用该视图。

在创建索引视图或对参与索引视图的表中的行进行操作时，有 7 个 SET 选项必须指派特定的值。SET 选项 ARITHABORT、CONCAT_NULL_YIELDS_NULL、QUOTED_IDENTIFIER、ANSI_NULLS、ANSI_PADDING 和 ANSI_WARNING 必须为 ON。SET 选项 NUMERIC_ROUNDABORT 必须为 OFF。

如果与上述设置有所不同，对索引视图所引用的任何表执行的数据修改语句 (INSERT、UPDATE、DELETE) 都将失败，SQL Server 会显示一条错误信息，列出所有违反设置要求的 SET 选项。此外，对于涉及索引视图的 SELECT 语句，如果任何 SET 选项的值不是所需的值，则 SQL Server 在处理该 SELECT 语句时不考虑索引视图替换。在受上述 SET 选项影响的情况中，这将确保查询结果的正确性。

如果应用程序使用 DB-Library 连接，则必须为服务器上的所有 7 个 SET 选项指派所需的值。（默认情况下，OLE DB 和 ODBC 连接已经正确设置了除 ARITHABORT 外所有需要的 SET 选项。）

如果并非所有上述 SET 选项均有所需的值，则某些操作（例如 BCP、复制或分布式查询）可能无法对参与索引视图的表执行更新。在大多数情况下，将 ARITHABORT 设置为 ON（通过服务器配置选项中的 user options）可以避免这一问题。

强烈建议在服务器的任一数据库中创建计算列上的第一个索引视图或索引后，尽早在服务器范围内将 ARITHABORT 用户选项设置为 ON。

有关索引视图注意事项和限制的更多信息，请参见注释部分。

column

应用索引的列。指定两个或多个列名，可为指定列的组合值创建组合索引。在 table 后的圆括号中列出组合索引中要包括的列（按排序优先级排列）。

说明 由 ntext、text 或 image 数据类型组成的列不能指定为索引列。另外，视图不能包括任何 text、ntext 或 image 列，即使在 CREATE INDEX 语句中没有引用这些列。

当两列或多列作为一个单位搜索最好，或者许多查询只引用索引中指定的列时，应使用组合索引。最多可以有 16 个列组合到一个组合索引中。组合索引中的所有列必须在同一个表中。组合索引值允许的最大大小为 900 字节。也就是说，组成组合索引的固定大小列的总长度不得超过 900 字节。有关组合索引中可变类型列的更多信息，请参见注释部分。

[ASC | DESC]

确定具体某个索引列的升序或降序排序方向。默认设置为 ASC。

n

表示可以为特定索引指定多个 columns 的占位符。

PAD_INDEX

指定索引中间级中每个页（节点）上保持开放的空间。PAD_INDEX 选项只有在指定了 FILLFACTOR 时才有用，因为 PAD_INDEX 使用由 FILLFACTOR 所指定的百分比。默认情况下，给定中间级页上的键集，SQL Server 将确保每个索引页上的可用空间至少可以容纳一个索引允许的最大行。如果为 FILLFACTOR 指定的百分比不够大，无法容纳一行，SQL Server 将在内部使用允许的最小值替代该百分比。

说明 中间级索引页上的行数永远都不会小于两行，无论 FILLFACTOR 的值有多小。

FILLFACTOR = fillfactor

指定在 SQL Server 创建索引的过程中，各索引页叶级的填满程度。如果某个索引页填满，SQL Server 就必须花时间拆分该索引页，以便为新行腾出空间，这需要很大的开销。对于更新频繁的表，选择合适的 FILLFACTOR 值将比选择不合适的 FILLFACTOR 值获得更好的更新性能。FILLFACTOR 的原始值将在 sysindexes 中与索引一起存储。

如果指定了 FILLFACTOR，SQL Server 会向上舍入每页要放置的行数。例如，发出 CREATE CLUSTERED INDEX ...FILLFACTOR = 33 将创建一个 FILLFACTOR 为 33% 的聚集索引。假设 SQL Server 计算出每页空间的 33% 为 5.2 行。SQL Server 将其向上舍入，这样，每页就放置 6 行。

说明 显式的 FILLFACTOR 设置只是在索引首次创建时应用。SQL Server 并不会动态保持页上可用空间的指定百分比。

用户指定的 FILLFACTOR 值可以从 1 到 100。如果没有指定值，默认值为 0。如果 FILLFACTOR 设置为 0，则只填满叶级页。可以通过执行 sp_configure 更改默认的 FILLFACTOR 设置。

只有不会出现 INSERT 或 UPDATE 语句时（例如对只读表），才可以使用 FILLFACTOR 100。如果 FILLFACTOR 为 100，SQL Server 将创建叶级页 100% 填满的索引。如果在创建 FILLFACTOR 为 100% 的索引之后执行 INSERT 或 UPDATE，会对每次 INSERT 操作以及有可能每次 UPDATE 操作进行页拆分。

如果 FILLFACTOR 值较小（0 除外），就会使 SQL Server 创建叶级页不完全填充的新索引。例如，如果已知某个表包含的数据只是该表最终要包含的数据的一小部分，那么为该表创建索引时，FILLFACTOR 为 10 会是合理的选择。FILLFACTOR 值较小还会使索引占用较多的存储空间。

下表说明如何在已指定 FILLFACTOR 的情况下填充索引页。

FILLFACTOR | 中间级页 | 叶级页
0 | 一个可用项 | 100% 填满
1% -99 | 一个可用项 | <= FILLFACTOR% 填满
100% | 一个可用项 | 100% 填满

一个可用项是指页上可以容纳另一个索引项的空间。

重要 用某个 FILLFACTOR 值创建聚集索引会影响数据占用存储空间的数量，因为 SQL Server 在创建聚集索引时会重新分布数据。

IGNORE_DUP_KEY

控制当尝试向属于唯一聚集索引的列插入重复的键值时所发生的情况。如果为索引指定了 IGNORE_DUP_KEY，并且执行了创建重复键的 INSERT 语句，SQL Server 将发出警告消息并忽略重复的行。

如果没有为索引指定 IGNORE_DUP_KEY，SQL Server 会发出一条警告消息，并回滚整个 INSERT 语句。

下表显示何时可使用 IGNORE_DUP_KEY。

索引类型 | 选项
聚集 | 不允许
唯一聚集 | 允许使用 IGNORE_DUP_KEY
非聚集 | 不允许
唯一非聚集 | 允许使用 IGNORE_DUP_KEY

DROP_EXISTING

指定应除去并重建已命名的先前存在的聚集索引或非聚集索引。指定的索引名必须与现有的索引名相同。因为非聚集索引包含聚集键，所以在除去聚集索引时，必须重建非聚集索引。如果重建聚集索引，则必须重建非聚集索引，以便使用新的键集。

为已经具有非聚集索引的表重建聚集索引时（使用相同或不同的键集），DROP_EXISTING 子句可以提高性能。DROP_EXISTING 子句代替了先对旧的聚集索引执行 DROP INDEX 语句，然后再对新的聚集索引执行 CREATE INDEX 语句的过程。非聚集索引只需重建一次，而且还只是在键不同的情况下才需要。

如果键没有改变（提供的索引名和列与原索引相同），则 DROP_EXISTING 子句不会重新对数据进行排序。在必须压缩索引时，这样做会很有用。

无法使用 DROP_EXISTING 子句将聚集索引转换成非聚集索引；不过，可以将唯一聚集索引更改为非唯一索引，反之亦然。

说明 当执行带 DROP_EXISTING 子句的 CREATE INDEX 语句时，SQL Server 假定索引是一致的（即索引没有损坏）。指定索引中的行应按 CREATE INDEX 语句中引用的指定键排序。

STATISTICS_NORECOMPUTE

指定过期的索引统计不会自动重新计算。若要恢复自动更新统计，可执行没有 NORECOMPUTE 子句的 UPDATE STATISTICS。

重要 如果禁用分布统计的自动重新计算，可能会妨碍 SQL Server 查询优化器为涉及该表的查询选取最佳执行计划。

SORT_IN_TEMPDB

指定用于生成索引的中间排序结果将存储在 tempdb 数据库中。如果 tempdb 与用户数据库不在同一磁盘集，则此选项可能减少创建索引所需的时间，但会增加创建索引时使用的磁盘空间。

有关更多信息，请参见 tempdb 和索引创建。

ON filegroup

在给定的 filegroup 上创建指定的索引。该文件组必须已经通过执行 CREATE DATABASE 或 ALTER DATABASE 创建。

注释

为表或索引分配空间时，每次递增一个扩展盘区（8 个 8 KB 的页）。每填满一个扩展盘区，就会再分配一个。如果表非常小或是空表，其索引将使用单页分配，直到向索引添加了 8 页后，再转而进行扩展盘区分配。若要获得有关索引已分配和占用的空间数量的报表，请使用 sp_spaceused。

创建聚集索引要求数据库中的可用空间大约为数据大小的 1.2 倍。该空间不包括现有表占用的空间；将对数据进行复制以创建聚集索引，旧的无索引数据将在索引创建完成后删除。使用 DROP_EXISTING 子句时，聚集索引所需的空间数量与现有索引的空间要求相同。所需的额外空间可能还受指定的 FILLFACTOR 的影响。

在 SQL Server 2000 中创建索引时，可以使用 SORT_IN_TEMPDB 选项指示数据库引擎在 tempdb 中存储中间索引排序结果。如果 tempdb 在不同于用户数据库所在的磁盘集上，则此选项可能减少创建索引所需的时间，但会增加用于创建索引的磁盘空间。除在用户数据库中创建索引所需的空间外，tempdb 还必须有大约相同的额外空间来存储中间排序结果。有关更多信息，请参见 tempdb 和索引创建。

CREATE INDEX 语句同其它查询一样优化。SQL Server 查询处理器可以选择扫描另一个索引，而不是执行表扫描，以节省 I/O 操作。在某些情况下，可以不必排序。

在运行 SQL Server 企业管理器和程序员版的多处理器计算机上，CREATE INDEX 自动使用多个处理器执行扫描和排序，与其它查询的操作方式相同。执行一条 CREATE INDEX 语句所使用的处理器数由配置选项 max degree of parallelism 和当前的工作负荷决定。如果 SQL Server 检测到系统正忙，则在开始执行语句之前，CREATE INDEX 操作的并发程度会自动降低。

自上一次文件组备份以来受 CREATE INDEX 语句影响的全部文件组必须作为一个单位备份。有关文件和文件组备份的更多信息，请参见 BACKUP。

备份和 CREATE INDEX 操作不相互防碍。如果正在进行备份，则在完整日志记录模式中创建索引，而这可能需要额外的日志空间。

若要显示有关对象索引的报表，请执行 sp_helpindex。

可以为临时表创建索引。在除去表或终止会话时，所有索引和触发器都将被除去。

索引中的可变类型列

索引键允许的最大大小为 900 字节，不过 SQL Server 2000 允许在可能包含大量可变类型列的列上创建索引，而这些列的最大大小超过 900 字节。

在创建索引时，SQL Server 检查下列条件：

  1. 所有参与索引定义的固定数据列的总长度必须小于或等于 900 字节。当所要创建的索引只由固定数据列构成时，固定数据列的总计大小必须小于或等于 900 字节。否则将不能创建索引，且 SQL Server 将返回错误。

  2. 如果索引定义由固定类型列和可变类型列组成，且固定数据列满足前面的条件（小于或等于 900 字节），则 SQL Server 仍要检查可变类型列的总大小。如果可变类型列的最大大小与固定数据列大小的和大于 900 字节，则 SQL Server 将创建索引，不过将给用户返回警告消息以提醒用户：如果随后在可变类型列上的插入或更新操作导致总大小超过 900 字节，则操作将失败且用户将收到运行时错误。同样，如果索引定义只由可变类型列组成，且这些列的最大总大小大于 900 字节，则 SQL Server 将创建索引，不过将返回警告消息。

有关更多信息，请参见索引键的最大值。

在计算列和视图上创建索引时的考虑

在 SQL Server 2000 中，还可以在计算列和视图上创建索引。在视图上创建唯一聚集索引可以提高查询性能，因为视图存储在数据库中的方式与具有聚集索引的表的存储方式相同。

UNIQUE 或 PRIMARY KEY 只要满足所有索引条件，就可以包含计算列。具体说来就是，计算列必须具有确定性、必须精确，且不能包含 text、ntext 或 image 列。有关确定性的更多信息，请参见确定性函数和非确定性函数。

在计算列或视图上创建索引可能导致前面产生的 INSERT 或 UPDATE 操作失败。当计算列导致算术错误时可能产生这样的失败。例如，虽然下表中的计算列 c 将导致算术错误，但是 INSERT 语句仍有效：

CREATE TABLE t1 (a int, b int, c AS a/b)
GO
INSERT INTO t1 VALUES ('1', '0')
GO

相反，如果创建表之后在计算列 c 上创建索引，则上述 INSERT 语句将失败。

CREATE TABLE t1 (a int, b int, c AS a/b)
GO
CREATE UNIQUE CLUSTERED INDEX Idx1 ON t1.c
GO
INSERT INTO t1 VALUES ('1', '0')
GO

在通过数字或 float 表达式定义的视图上使用索引所得到的查询结果，可能不同于不在视图上使用索引的类似查询所得到的结果。这种差异可能是由对基础表进行 INSERT、DELETE 或 UPDATE 操作时的舍入错误引起的。

若要防止 SQL Server 使用索引视图，请在查询中包含 OPTION (EXPAND VIEWS) 提示。此外，任何所列选项设置不正确均会阻止优化程序使用视图上的索引。有关 OPTION (EXPAND VIEWS) 提示的更多信息，请参见 SELECT。

对索引视图的限制

定义索引视图的 SELECT 语句不得包含 TOP、DISTINCT、COMPUTE、HAVING 和 UNION 关键字。也不能包含子查询。

SELECT 列表中不得包含星号 (*)、'table.*' 通配符列表、DISTINCT、COUNT(*)、COUNT(<expression>)、基表中的计算列和标量聚合。

非聚合 SELECT 列表中不能包含表达式。聚合 SELECT 列表（包含 GROUP BY 的查询）中可能包含 SUM 和 COUNT_BIG(<expression>)；它一定包含 COUNT_BIG(*)。不允许有其它聚合函数（MIN、MAX、STDEV，...）。

使用 AVG 的复杂聚合无法参与索引视图的 SELECT 列表。不过，如果查询使用这样的聚合，则优化程序将能使用该索引视图，用 SUM 和 COUNT_BIG 的简单聚合组合代替 AVG。

若某列是从取值为 float 数据类型或使用 float 表达式进行取值的表达式得到的，则不能作为索引视图或表中计算列的索引键。这样的列被视为是不精确的。使用 COLUMNPROPERTY 函数决定特定计算列或视图中的列是否精确。

索引视图受限于以下的附加限制：

  1. 索引的创建者必须拥有表。所有表、视图和索引必须在同一数据库中创建。

  2. 定义索引视图的 SELECT 语句不得包含视图、行集函数、行内函数或派生表。同一物理表在该语句中只能出现一次。

  3. 在任何联接表中，均不允许进行 OUTER JOIN 操作。

  4. 搜索条件中不允许使用子查询或者 CONTAINS 或 FREETEXT 谓词。

  5. 如果视图定义包含 GROUP BY 子句，则视图的 SELECT 列表中必须包含所有分组依据列及 COUNT_BIG(*) 表达式。此外，CREATE UNIQUE CLUSTERED INDEX 子句中必须只包含这些列。

可以创建索引的视图的定义主体必须具有确定性且必须精确，这类似于计算列上的索引要求。请参见在计算列上创建索引。

权限

CREATE INDEX 的权限默认授予 sysadmin 固定服务器角色、db_ddladmin 和 db_owner 固定数据库角色和表所有者且不能转让。

示例
A. 使用简单索引

下面的示例为 authors 表的 au_id 列创建索引。

SET NOCOUNT OFF
USE pubs
IF EXISTS (SELECT name FROM sysindexes
      WHERE name = 'au_id_ind')
   DROP INDEX authors.au_id_ind
GO
USE pubs
CREATE INDEX au_id_ind
   ON authors (au_id)
GO
B. 使用唯一聚集索引

下面的示例为 emp_pay 表的 employeeID 列创建索引，并且强制唯一性。因为指定了 CLUSTERED 子句，所以该索引将对磁盘上的数据进行物理排序。

SET NOCOUNT ON
USE pubs
IF EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES
      WHERE TABLE_NAME = 'emp_pay')
   DROP TABLE emp_pay
GO
USE pubs
IF EXISTS (SELECT name FROM sysindexes
      WHERE name = 'employeeID_ind')
   DROP INDEX emp_pay.employeeID_ind
GO
USE pubs
GO
CREATE TABLE emp_pay
(
 employeeID int NOT NULL,
 base_pay money NOT NULL,
 commission decimal(2, 2) NOT NULL
)
INSERT emp_pay
   VALUES (1, 500, .10)
INSERT emp_pay
   VALUES (2, 1000, .05)
INSERT emp_pay
   VALUES (3, 800, .07)
INSERT emp_pay
   VALUES (5, 1500, .03)
INSERT emp_pay
   VALUES (9, 750, .06)
GO
SET NOCOUNT OFF
CREATE UNIQUE CLUSTERED INDEX employeeID_ind
   ON emp_pay (employeeID)
GO
C. 使用简单组合索引

下面的示例为 order_emp 表的 orderID 列和 employeeID 列创建索引。

SET NOCOUNT ON
USE pubs
IF EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES
      WHERE TABLE_NAME = 'order_emp')
   DROP TABLE order_emp
GO
USE pubs
IF EXISTS (SELECT name FROM sysindexes
      WHERE name = 'emp_order_ind')
   DROP INDEX order_emp.emp_order_ind
GO
USE pubs
GO
CREATE TABLE order_emp
(
 orderID int IDENTITY(1000, 1),
 employeeID int NOT NULL,
 orderdate datetime NOT NULL DEFAULT GETDATE(),
 orderamount money NOT NULL
)

INSERT order_emp (employeeID, orderdate, orderamount)
   VALUES (5, '4/12/98', 315.19)
INSERT order_emp (employeeID, orderdate, orderamount)
   VALUES (5, '5/30/98', 1929.04)
INSERT order_emp (employeeID, orderdate, orderamount)
   VALUES (1, '1/03/98', 2039.82)
INSERT order_emp (employeeID, orderdate, orderamount)
   VALUES (1, '1/22/98', 445.29)
INSERT order_emp (employeeID, orderdate, orderamount)
   VALUES (4, '4/05/98', 689.39)
INSERT order_emp (employeeID, orderdate, orderamount)
   VALUES (7, '3/21/98', 1598.23)
INSERT order_emp (employeeID, orderdate, orderamount)
   VALUES (7, '3/21/98', 445.77)
INSERT order_emp (employeeID, orderdate, orderamount)
   VALUES (7, '3/22/98', 2178.98)
GO
SET NOCOUNT OFF
CREATE INDEX emp_order_ind
   ON order_emp (orderID, employeeID)
D. 使用 FILLFACTOR 选项

下面的示例使用 FILLFACTOR 子句，将其设置为 100。FILLFACTOR 为 100 将完全填满每一页，只有确定表中的索引值永远不会更改时，该选项才有用。

SET NOCOUNT OFF
USE pubs
IF EXISTS (SELECT name FROM sysindexes
      WHERE name = 'zip_ind')
   DROP INDEX authors.zip_ind
GO
USE pubs
GO
CREATE NONCLUSTERED INDEX zip_ind
   ON authors (zip)
   WITH FILLFACTOR = 100
E. 使用 IGNORE_DUP_KEY

下面的示例为 emp_pay 表创建唯一聚集索引。如果输入了重复的键，将忽略该 INSERT 或 UPDATE 语句。

SET NOCOUNT ON
USE pubs
IF EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES
      WHERE TABLE_NAME = 'emp_pay')
   DROP TABLE emp_pay
GO
USE pubs
IF EXISTS (SELECT name FROM sysindexes
      WHERE name = 'employeeID_ind')
   DROP INDEX emp_pay.employeeID_ind
GO
USE pubs
GO
CREATE TABLE emp_pay
(
 employeeID int NOT NULL,
 base_pay money NOT NULL,
 commission decimal(2, 2) NOT NULL
)
INSERT emp_pay
   VALUES (1, 500, .10)
INSERT emp_pay
   VALUES (2, 1000, .05)
INSERT emp_pay
   VALUES (3, 800, .07)
INSERT emp_pay
   VALUES (5, 1500, .03)
INSERT emp_pay
   VALUES (9, 750, .06)
GO
SET NOCOUNT OFF
GO
CREATE UNIQUE CLUSTERED INDEX employeeID_ind
   ON emp_pay(employeeID)
   WITH IGNORE_DUP_KEY
F. 使用 PAD_INDEX 创建索引

下面的示例为 authors 表中的作者标识号创建索引。没有 PAD_INDEX 子句，SQL Server 将创建填充 10% 的叶级页，但是叶级之上的页几乎被完全填满。使用 PAD_INDEX 时，中间级页也填满 10%。

说明 如果没有指定 PAD_INDEX，唯一聚集索引的索引页上至少会出现两项。

SET NOCOUNT OFF
USE pubs
IF EXISTS (SELECT name FROM sysindexes
      WHERE name = 'au_id_ind')
   DROP INDEX authors.au_id_ind
GO
USE pubs
CREATE INDEX au_id_ind
   ON authors (au_id)
   WITH PAD_INDEX, FILLFACTOR = 10
G. 为视图创建索引

下面的示例将创建一个视图，并为该视图创建索引。然后，引入两个使用该索引视图的查询。

USE Northwind
GO

--Set the options to support indexed views.
SET NUMERIC_ROUNDABORT OFF
GO
SET ANSI_PADDING,ANSI_WARNINGS,CONCAT_NULL_YIELDS_NULL,ARITHABORT,QUOTED_IDENTIFIER,ANSI_NULLS ON
GO

--Create view.
CREATE   VIEW V1
WITH   SCHEMABINDING
AS
   SELECT SUM(UnitPrice*Quantity*(1.00-Discount)) AS Revenue, OrderDate, ProductID, COUNT_BIG(*) AS COUNT
   FROM   dbo.[Order Details] od, dbo.Orders o
   WHERE   od.OrderID=o.OrderID
   GROUP BY   OrderDate, ProductID
GO

--Create index on the view.
CREATE UNIQUE CLUSTERED INDEX IV1 ON V1 (OrderDate, ProductID)
GO

--This query will use the above indexed view.
SELECT SUM(UnitPrice*Quantity*(1.00-Discount)) AS Rev, OrderDate, ProductID
FROM   dbo.[Order Details] od, dbo.Orders o
WHERE   od.OrderID=o.OrderID AND ProductID in (2, 4, 25, 13, 7, 89, 22, 34)
   AND OrderDate >= '05/01/1998'
GROUP BY OrderDate, ProductID
ORDER BY Rev DESC

--This query will use the above indexed view.
SELECT  OrderDate, SUM(UnitPrice*Quantity*(1.00-Discount)) AS Rev
FROM   dbo.[Order Details] od, dbo.Orders o
WHERE   od.OrderID=o.OrderID AND DATEPART(mm,OrderDate)= 3
   AND DATEPART(yy,OrderDate) = 1998
GROUP BY OrderDate
ORDER BY OrderDate ASC

请参见

ALTER DATABASE

CREATE DATABASE

CREATE STATISTICS

CREATE TABLE

数据类型

DBCC SHOW_STATISTICS

设计索引

DROP INDEX

DROP STATISTICS

索引

INSERT

RECONFIGURE

SET

sp_autostats

sp_createstats

sp_dbcmptlevel

sp_dboption

sp_helpindex

sp_spaceused

sysindexes

事务

UPDATE

UPDATE STATISTICS

使用标识符


CREATE PROCEDURE

创建存储过程，存储过程是保存起来的可以接受和返回用户提供的参数的 Transact-SQL 语句的集合。

可以创建一个过程供永久使用，或在一个会话中临时使用（局部临时过程），或在所有会话中临时使用（全局临时过程）。

也可以创建在 Microsoft® SQL Server™ 启动时自动运行的存储过程。

语法

CREATE PROC [ EDURE ] procedure_name [ ; number ]
[ { @parameter data_type }
[ VARYING ] [ = default ] [ OUTPUT ]
] [ ,...n ]

[ WITH
{ RECOMPILE | ENCRYPTION | RECOMPILE , ENCRYPTION } ]

[ FOR REPLICATION ]

AS sql_statement [ ...n ]

参数

procedure_name

新存储过程的名称。过程名必须符合标识符规则，且对于数据库及其所有者必须唯一。有关更多信息，请参见使用标识符。

要创建局部临时过程，可以在 procedure_name 前面加一个编号符 (#procedure_name)，要创建全局临时过程，可以在 procedure_name 前面加两个编号符 (##procedure_name)。完整的名称（包括 # 或 ##）不能超过 128 个字符。指定过程所有者的名称是可选的。

;number

是可选的整数，用来对同名的过程分组，以便用一条 DROP PROCEDURE 语句即可将同组的过程一起除去。例如，名为 orders 的应用程序使用的过程可以命名为 orderproc;1、orderproc;2 等。DROP PROCEDURE orderproc 语句将除去整个组。如果名称中包含定界标识符，则数字不应包含在标识符中，只应在 procedure_name 前后使用适当的定界符。

@parameter

过程中的参数。在 CREATE PROCEDURE 语句中可以声明一个或多个参数。用户必须在执行过程时提供每个所声明参数的值（除非定义了该参数的默认值）。存储过程最多可以有 2.100 个参数。

使用 @ 符号作为第一个字符来指定参数名称。参数名称必须符合标识符的规则。每个过程的参数仅用于该过程本身；相同的参数名称可以用在其它过程中。默认情况下，参数只能代替常量，而不能用于代替表名、列名或其它数据库对象的名称。有关更多信息，请参见 EXECUTE。

data_type

参数的数据类型。所有数据类型（包括 text、ntext 和 image）均可以用作存储过程的参数。不过，cursor 数据类型只能用于 OUTPUT 参数。如果指定的数据类型为 cursor，也必须同时指定 VARYING 和 OUTPUT 关键字。有关 SQL Server 提供的数据类型及其语法的更多信息，请参见数据类型。

说明 对于可以是 cursor 数据类型的输出参数，没有最大数目的限制。

VARYING

指定作为输出参数支持的结果集（由存储过程动态构造，内容可以变化）。仅适用于游标参数。

default

参数的默认值。如果定义了默认值，不必指定该参数的值即可执行过程。默认值必须是常量或 NULL。如果过程将对该参数使用 LIKE 关键字，那么默认值中可以包含通配符（%、_、[] 和 [^]）。

OUTPUT

表明参数是返回参数。该选项的值可以返回给 EXEC[UTE]。使用 OUTPUT 参数可将信息返回给调用过程。Text、ntext 和 image 参数可用作 OUTPUT 参数。使用 OUTPUT 关键字的输出参数可以是游标占位符。

n

表示最多可以指定 2.100 个参数的占位符。

{RECOMPILE | ENCRYPTION | RECOMPILE, ENCRYPTION}

RECOMPILE 表明 SQL Server 不会缓存该过程的计划，该过程将在运行时重新编译。在使用非典型值或临时值而不希望覆盖缓存在内存中的执行计划时，请使用 RECOMPILE 选项。

ENCRYPTION 表示 SQL Server 加密 syscomments 表中包含 CREATE PROCEDURE 语句文本的条目。使用 ENCRYPTION 可防止将过程作为 SQL Server 复制的一部分发布。

说明 在升级过程中，SQL Server 利用存储在 syscomments 中的加密注释来重新创建加密过程。

FOR REPLICATION

指定不能在订阅服务器上执行为复制创建的存储过程。.使用 FOR REPLICATION 选项创建的存储过程可用作存储过程筛选，且只能在复制过程中执行。本选项不能和 WITH RECOMPILE 选项一起使用。

AS

指定过程要执行的操作。

sql_statement

过程中要包含的任意数目和类型的 Transact-SQL 语句。但有一些限制。

n

是表示此过程可以包含多条 Transact-SQL 语句的占位符。

注释

存储过程的最大大小为 128 MB。

用户定义的存储过程只能在当前数据库中创建（临时过程除外，临时过程总是在 tempdb 中创建）。在单个批处理中，CREATE PROCEDURE 语句不能与其它 Transact-SQL 语句组合使用。

默认情况下，参数可为空。如果传递 NULL 参数值并且该参数在 CREATE 或 ALTER TABLE 语句中使用，而该语句中引用的列又不允许使用 NULL，则 SQL Server 会产生一条错误信息。为了防止向不允许使用 NULL 的列传递 NULL 参数值，应向过程中添加编程逻辑或为该列使用默认值（使用 CREATE 或 ALTER TABLE 的 DEFAULT 关键字)。

建议在存储过程的任何 CREATE TABLE 或 ALTER TABLE 语句中都为每列显式指定 NULL 或 NOT NULL，例如在创建临时表时。ANSI_DFLT_ON 和 ANSI_DFLT_OFF 选项控制 SQL Server 为列指派 NULL 或 NOT NULL 特性的方式（如果在 CREATE TABLE 或 ALTER TABLE 语句中没有指定的话）。如果某个连接执行的存储过程对这些选项的设置与创建该过程的连接的设置不同，则为第二个连接创建的表列可能会有不同的为空性，并且表现出不同的行为方式。如果为每个列显式声明了 NULL 或 NOT NULL，那么将对所有执行该存储过程的连接使用相同的为空性创建临时表。

在创建或更改存储过程时，SQL Server 将保存 SET QUOTED_IDENTIFIER 和 SET ANSI_NULLS 的设置。执行存储过程时，将使用这些原始设置。因此，所有客户端会话的 SET QUOTED_IDENTIFIER 和 SET ANSI_NULLS 设置在执行存储过程时都将被忽略。在存储过程中出现的 SET QUOTED_IDENTIFIER 和 SET ANSI_NULLS 语句不影响存储过程的功能。

其它 SET 选项（例如 SET ARITHABORT、SET ANSI_WARNINGS 或 SET ANSI_PADDINGS）在创建或更改存储过程时不保存。如果存储过程的逻辑取决于特定的设置，应在过程开头添加一条 SET 语句，以确保设置正确。从存储过程中执行 SET 语句时，该设置只在存储过程完成之前有效。之后，设置将恢复为调用存储过程时的值。这使个别的客户端可以设置所需的选项，而不会影响存储过程的逻辑。

说明 SQL Server 是将空字符串解释为单个空格还是解释为真正的空字符串，由兼容级别设置控制。如果兼容级别小于或等于 65，SQL Server 就将空字符串解释为单个空格。如果兼容级别等于 70，则 SQL Server 将空字符串解释为空字符串。有关更多信息，请参见 sp_dbcmptlevel。

获得有关存储过程的信息

若要显示用来创建过程的文本，请在过程所在的数据库中执行 sp_helptext，并使用过程名作为参数。

说明 使用 ENCRYPTION 选项创建的存储过程不能使用 sp_helptext 查看。

若要显示有关过程引用的对象的报表，请使用 sp_depends。

若要为过程重命名，请使用 sp_rename。

引用对象

SQL Server 允许创建的存储过程引用尚不存在的对象。在创建时，只进行语法检查。执行时，如果高速缓存中尚无有效的计划，则编译存储过程以生成执行计划。只有在编译过程中才解析存储过程中引用的所有对象。因此，如果语法正确的存储过程引用了不存在的对象，则仍可以成功创建，但在运行时将失败，因为所引用的对象不存在。有关更多信息，请参见延迟名称解析和编译。

延迟名称解析和兼容级别

SQL Server 允许 Transact-SQL 存储过程在创建时引用不存在的表。这种能力称为延迟名称解析。不过，如果 Transact-SQL 存储过程引用了该存储过程中定义的表，而兼容级别设置（通过执行 sp_dbcmptlevel 来设置）为 65，则在创建时会发出警告信息。而如果在运行时所引用的表不存在，将返回错误信息。有关更多信息，请参见 sp_dbcmptlevel 和延迟名称解析和编译。

执行存储过程

成功执行 CREATE PROCEDURE 语句后，过程名称将存储在 sysobjects 系统表中，而 CREATE PROCEDURE 语句的文本将存储在 syscomments 中。第一次执行时，将编译该过程以确定检索数据的最佳访问计划。

使用 cursor 数据类型的参数

存储过程只能将 cursor 数据类型用于 OUTPUT 参数。如果为某个参数指定了 cursor 数据类型，也必须指定 VARYING 和 OUTPUT 参数。如果为某个参数指定了 VARYING 关键字，则数据类型必须是 cursor，并且必须指定 OUTPUT 关键字。

说明 cursor 数据类型不能通过数据库 API（例如 OLE DB、ODBC、ADO 和 DB-Library）绑定到应用程序变量上。因为必须先绑定 OUTPUT 参数，应用程序才可以执行存储过程，所以带有 cursor OUTPUT 参数的存储过程不能通过数据库 API 调用。只有将 cursor OUTPUT 变量赋值给 Transact-SQL 局部 cursor 变量时，才可以通过 Transact-SQL 批处理、存储过程或触发器调用这些过程。

Cursor 输出参数

在执行过程时，以下规则适用于 cursor 输出参数：

  1. 对于只进游标，游标的结果集中返回的行只是那些存储过程执行结束时处于或超出游标位置的行，例如：
    1. 在过程中的名为 RS 的 100 行结果集上打开一个非滚动游标。

    2. 过程提取结果集 RS 的头 5 行。

    3. 过程返回到其调用者。

    4. 返回到调用者的结果集 RS 由 RS 的第 6 到 100 行组成，调用者中的游标处于 RS 的第一行之前。
  2. 对于只进游标，如果存储过程完成后，游标位于第一行的前面，则整个结果集将返回给调用批处理、存储过程或触发器。返回时，游标将位于第一行的前面。

  3. 对于只进游标，如果存储过程完成后，游标的位置超出最后一行的结尾，则为调用批处理、存储过程或触发器返回空结果集。

    说明 空结果集与空值不同。

  4. 对于可滚动游标，在存储过程执行结束时，结果集中的所有行均会返回给调用批处理、存储过程或触发器。返回时，游标保留在过程中最后一次执行提取时的位置。

  5. 对于任意类型的游标，如果游标关闭，则将空值传递回调用批处理、存储过程或触发器。如果将游标指派给一个参数，但该游标从未打开过，也会出现这种情况。

说明 关闭状态只有在返回时才有影响。例如，可以在过程中关闭游标，稍后再打开游标，然后将该游标的结果集返回给调用批处理、存储过程或触发器。

临时存储过程

SQL Server 支持两种临时过程：局部临时过程和全局临时过程。局部临时过程只能由创建该过程的连接使用。全局临时过程则可由所有连接使用。局部临时过程在当前会话结束时自动除去。全局临时过程在使用该过程的最后一个会话结束时除去。通常是在创建该过程的会话结束时。

临时过程用 # 和 ## 命名，可以由任何用户创建。创建过程后，局部过程的所有者是唯一可以使用该过程的用户。执行局部临时过程的权限不能授予其他用户。如果创建了全局临时过程，则所有用户均可以访问该过程，权限不能显式废除。只有在 tempdb 数据库中具有显式 CREATE PROCEDURE 权限的用户，才可以在该数据库中显式创建临时过程（不使用编号符命名）。可以授予或废除这些过程中的权限。

说明 频繁使用临时存储过程会在 tempdb 中的系统表上产生争用，从而对性能产生负面影响。建议使用 sp_executesql 代替。sp_executesql 不在系统表中存储数据，因此可以避免这一问题。

自动执行存储过程

SQL Server 启动时可以自动执行一个或多个存储过程。这些存储过程必须由系统管理员创建，并在 sysadmin 固定服务器角色下作为后台过程执行。这些过程不能有任何输入参数。

对启动过程的数目没有限制，但是要注意，每个启动过程在执行时都会占用一个连接。如果必须在启动时执行多个过程，但不需要并行执行，则可以指定一个过程作为启动过程，让该过程调用其它过程。这样就只占用一个连接。

在启动时恢复了最后一个数据库后，即开始执行存储过程。若要跳过这些存储过程的执行，请将启动参数指定为跟踪标记 4022。如果以最低配置启动 SQL Server（使用 -f 标记），则启动存储过程也不会执行。有关更多信息，请参见跟踪标记。

若要创建启动存储过程，必须作为 sysadmin 固定服务器角色的成员登录，并在 master 数据库中创建存储过程。

使用 sp_procoption 可以：

  1. 将现有存储过程指定为启动过程。

  2. 停止在 SQL Server 启动时执行过程。

  3. 查看 SQL Server 启动时执行的所有过程的列表。
存储过程嵌套

存储过程可以嵌套，即一个存储过程可以调用另一个存储过程。在被调用过程开始执行时，嵌套级将增加，在被调用过程执行结束后，嵌套级将减少。如果超出最大的嵌套级，会使整个调用过程链失败。可用 @@NESTLEVEL 函数返回当前的嵌套级。

若要估计编译后的存储过程大小，请使用下列性能监视计数器。

性能监视器对象名 | 性能监视计数器名称
SQLServer：缓冲区管理器 | 高速缓存大小（页面数）
SQLServer：高速缓存管理器 | 高速缓存命中率
 | 高速缓存页
 | 高速缓存对象计数*

* 各种分类的高速缓存对象均可以使用这些计数器，包括特殊 sql、准备 sql、过程、触发器等。

有关更多信息，请参见 SQL Server:Buffer Manager 对象和 SQL Server:Cache Manager 对象。

sql_statement 限制

除了 SET SHOWPLAN_TEXT 和 SET SHOWPLAN_ALL 之外（这两个语句必须是批处理中仅有的语句），任何 SET 语句均可以在存储过程内部指定。所选择的 SET 选项在存储过程执行过程中有效，之后恢复为原来的设置。

如果其他用户要使用某个存储过程，那么在该存储过程内部，一些语句使用的对象名必须使用对象所有者的名称限定。这些语句包括：

  1. ALTER TABLE

  2. CREATE INDEX

  3. CREATE TABLE

  4. 所有 DBCC 语句

  5. DROP TABLE

  6. DROP INDEX

  7. TRUNCATE TABLE

  8. UPDATE STATISTICS
权限

CREATE PROCEDURE 的权限默认授予 sysadmin 固定服务器角色成员和 db_owner 和 db_ddladmin 固定数据库角色成员。sysadmin 固定服务器角色成员和 db_owner 固定数据库角色成员可以将 CREATE PROCEDURE 权限转让给其他用户。执行存储过程的权限授予过程的所有者，该所有者可以为其它数据库用户设置执行权限。

示例
A. 使用带有复杂 SELECT 语句的简单过程

下面的存储过程从四个表的联接中返回所有作者（提供了姓名）、出版的书籍以及出版社。该存储过程不使用任何参数。

USE pubs
IF EXISTS (SELECT name FROM sysobjects
         WHERE name = 'au_info_all' AND type = 'P')
   DROP PROCEDURE au_info_all
GO
CREATE PROCEDURE au_info_all
AS
SELECT au_lname, au_fname, title, pub_name
   FROM authors a INNER JOIN titleauthor ta
      ON a.au_id = ta.au_id INNER JOIN titles t
      ON t.title_id = ta.title_id INNER JOIN publishers p
      ON t.pub_id = p.pub_id
GO

au_info_all 存储过程可以通过以下方法执行：

EXECUTE au_info_all
-- Or
EXEC au_info_all

如果该过程是批处理中的第一条语句，则可使用：

au_info_all
B. 使用带有参数的简单过程

下面的存储过程从四个表的联接中只返回指定的作者（提供了姓名）、出版的书籍以及出版社。该存储过程接受与传递的参数精确匹配的值。

USE pubs
IF EXISTS (SELECT name FROM sysobjects
         WHERE name = 'au_info' AND type = 'P')
   DROP PROCEDURE au_info
GO
USE pubs
GO
CREATE PROCEDURE au_info
   @lastname varchar(40),
   @firstname varchar(20)
AS
SELECT au_lname, au_fname, title, pub_name
   FROM authors a INNER JOIN titleauthor ta
      ON a.au_id = ta.au_id INNER JOIN titles t
      ON t.title_id = ta.title_id INNER JOIN publishers p
      ON t.pub_id = p.pub_id
   WHERE  au_fname = @firstname
      AND au_lname = @lastname
GO

au_info 存储过程可以通过以下方法执行：

EXECUTE au_info 'Dull', 'Ann'
-- Or
EXECUTE au_info @lastname = 'Dull', @firstname = 'Ann'
-- Or
EXECUTE au_info @firstname = 'Ann', @lastname = 'Dull'
-- Or
EXEC au_info 'Dull', 'Ann'
-- Or
EXEC au_info @lastname = 'Dull', @firstname = 'Ann'
-- Or
EXEC au_info @firstname = 'Ann', @lastname = 'Dull'

如果该过程是批处理中的第一条语句，则可使用：

au_info 'Dull', 'Ann'
-- Or
au_info @lastname = 'Dull', @firstname = 'Ann'
-- Or
au_info @firstname = 'Ann', @lastname = 'Dull'
C. 使用带有通配符参数的简单过程

下面的存储过程从四个表的联接中只返回指定的作者（提供了姓名）、出版的书籍以及出版社。该存储过程对传递的参数进行模式匹配，如果没有提供参数，则使用预设的默认值。

USE pubs
IF EXISTS (SELECT name FROM sysobjects
      WHERE name = 'au_info2' AND type = 'P')
   DROP PROCEDURE au_info2
GO
USE pubs
GO
CREATE PROCEDURE au_info2
   @lastname varchar(30) = 'D%',
   @firstname varchar(18) = '%'
AS
SELECT au_lname, au_fname, title, pub_name
FROM authors a INNER JOIN titleauthor ta
   ON a.au_id = ta.au_id INNER JOIN titles t
   ON t.title_id = ta.title_id INNER JOIN publishers p
   ON t.pub_id = p.pub_id
WHERE au_fname LIKE @firstname
   AND au_lname LIKE @lastname
GO

au_info2 存储过程可以用多种组合执行。下面只列出了部分组合：

EXECUTE au_info2
-- Or
EXECUTE au_info2 'Wh%'
-- Or
EXECUTE au_info2 @firstname = 'A%'
-- Or
EXECUTE au_info2 '[CK]ars[OE]n'
-- Or
EXECUTE au_info2 'Hunter', 'Sheryl'
-- Or
EXECUTE au_info2 'H%', 'S%'
D. 使用 OUTPUT 参数

OUTPUT 参数允许外部过程、批处理或多条 Transact-SQL 语句访问在过程执行期间设置的某个值。下面的示例创建一个存储过程 (titles_sum)，并使用一个可选的输入参数和一个输出参数。

首先，创建过程：

USE pubs
GO
IF EXISTS(SELECT name FROM sysobjects
      WHERE name = 'titles_sum' AND type = 'P')
   DROP PROCEDURE titles_sum
GO
USE pubs
GO
CREATE PROCEDURE titles_sum @@TITLE varchar(40) = '%', @@SUM money OUTPUT
AS
SELECT 'Title Name' = title
FROM titles
WHERE title LIKE @@TITLE
SELECT @@SUM = SUM(price)
FROM titles
WHERE title LIKE @@TITLE
GO

接下来，将该 OUTPUT 参数用于控制流语言。

说明 OUTPUT 变量必须在创建表和使用该变量时都进行定义。

参数名和变量名不一定要匹配，不过数据类型和参数位置必须匹配（除非使用 @@SUM = variable 形式）。

DECLARE @@TOTALCOST money
EXECUTE titles_sum 'The%', @@TOTALCOST OUTPUT
IF @@TOTALCOST < 200
BEGIN
   PRINT ' '
   PRINT 'All of these titles can be purchased for less than $200.'
END
ELSE
   SELECT 'The total cost of these titles is $'
         + RTRIM(CAST(@@TOTALCOST AS varchar(20)))

下面是结果集：

Title Name
------------------------------------------------------------------------
The Busy Executive's Database Guide
The Gourmet Microwave
The Psychology of Computer Cooking

(3 row(s) affected)

Warning, null value eliminated from aggregate.

All of these titles can be purchased for less than $200.
E. 使用 OUTPUT 游标参数

OUTPUT 游标参数用来将存储过程的局部游标传递回调用批处理、存储过程或触发器。

首先，创建以下过程，在 titles 表上声明并打开一个游标：

USE pubs
IF EXISTS (SELECT name FROM sysobjects
      WHERE name = 'titles_cursor' and type = 'P')
DROP PROCEDURE titles_cursor
GO
CREATE PROCEDURE titles_cursor @titles_cursor CURSOR VARYING OUTPUT
AS
SET @titles_cursor = CURSOR
FORWARD_ONLY STATIC FOR
SELECT *
FROM titles

OPEN @titles_cursor
GO

接下来，执行一个批处理，声明一个局部游标变量，执行上述过程以将游标赋值给局部变量，然后从该游标提取行。

USE pubs
GO
DECLARE @MyCursor CURSOR
EXEC titles_cursor @titles_cursor = @MyCursor OUTPUT
WHILE (@@FETCH_STATUS = 0)
BEGIN
   FETCH NEXT FROM @MyCursor
END
CLOSE @MyCursor
DEALLOCATE @MyCursor
GO
F. 使用 WITH RECOMPILE 选项

如果为过程提供的参数不是典型的参数，并且新的执行计划不应高速缓存或存储在内存中，WITH RECOMPILE 子句会很有帮助。

USE pubs
IF EXISTS (SELECT name FROM sysobjects
      WHERE name = 'titles_by_author' AND type = 'P')
   DROP PROCEDURE titles_by_author
GO
CREATE PROCEDURE titles_by_author @@LNAME_PATTERN varchar(30) = '%'
WITH RECOMPILE
AS
SELECT RTRIM(au_fname) + ' ' + RTRIM(au_lname) AS 'Authors full name',
   title AS Title
FROM authors a INNER JOIN titleauthor ta
   ON a.au_id = ta.au_id INNER JOIN titles t
   ON ta.title_id = t.title_id
WHERE au_lname LIKE @@LNAME_PATTERN
GO
G. 使用 WITH ENCRYPTION 选项

WITH ENCRYPTION 子句对用户隐藏存储过程的文本。下例创建加密过程，使用 sp_helptext 系统存储过程获取关于加密过程的信息，然后尝试直接从 syscomments 表中获取关于该过程的信息。

IF EXISTS (SELECT name FROM sysobjects
      WHERE name = 'encrypt_this' AND type = 'P')
   DROP PROCEDURE encrypt_this
GO
USE pubs
GO
CREATE PROCEDURE encrypt_this
WITH ENCRYPTION
AS
SELECT *
FROM authors
GO

EXEC sp_helptext encrypt_this

下面是结果集：

The object's comments have been encrypted.

接下来，选择加密存储过程内容的标识号和文本。

SELECT c.id, c.text
FROM syscomments c INNER JOIN sysobjects o
   ON c.id = o.id
WHERE o.name = 'encrypt_this'

下面是结果集：

说明 text 列的输出显示在单独一行中。执行时，该信息将与 id 列信息出现在同一行中。

id         text
---------- ------------------------------------------------------------
1413580074 ?????????????????????????????????e??????????????????????????????????????????????????????????????????????????

(1 row(s) affected)
H. 创建用户定义的系统存储过程

下面的示例创建一个过程，显示表名以 emp 开头的所有表及其对应的索引。如果没有指定参数，该过程将返回表名以 sys 开头的所有表（及索引）。

IF EXISTS (SELECT name FROM sysobjects
      WHERE name = 'sp_showindexes' AND type = 'P')
   DROP PROCEDURE sp_showindexes
GO
USE master
GO
CREATE PROCEDURE sp_showindexes
   @@TABLE varchar(30) = 'sys%'
AS
SELECT o.name AS TABLE_NAME,
   i.name AS INDEX_NAME,
   indid AS INDEX_ID
FROM sysindexes i INNER JOIN sysobjects o
   ON o.id = i.id
WHERE o.name LIKE @@TABLE
GO
USE pubs
EXEC sp_showindexes 'emp%'
GO

下面是结果集：

TABLE_NAME       INDEX_NAME       INDEX_ID
---------------- ---------------- ----------------
employee         employee_ind     1
employee         PK_emp_id        2

(2 row(s) affected)
I. 使用延迟名称解析

下面的示例显示四个过程以及延迟名称解析的各种可能使用方式。尽管引用的表或列在编译时不存在，但每个存储过程都可创建。

IF EXISTS (SELECT name FROM sysobjects
      WHERE name = 'proc1' AND type = 'P')
   DROP PROCEDURE proc1
GO
-- Creating a procedure on a nonexistent table.
USE pubs
GO
CREATE PROCEDURE proc1
AS
   SELECT *
   FROM does_not_exist
GO
-- Here is the statement to actually see the text of the procedure.
SELECT o.id, c.text
FROM sysobjects o INNER JOIN syscomments c
   ON o.id = c.id
WHERE o.type = 'P' AND o.name = 'proc1'
GO
USE master
GO
IF EXISTS (SELECT name FROM sysobjects
      WHERE name = 'proc2' AND type = 'P')
   DROP PROCEDURE proc2
GO
-- Creating a procedure that attempts to retrieve information from a
-- nonexistent column in an existing table.
USE pubs
GO
CREATE PROCEDURE proc2
AS
   DECLARE @middle_init char(1)
   SET @middle_init = NULL
   SELECT au_id, middle_initial = @middle_init
   FROM authors
GO
-- Here is the statement to actually see the text of the procedure.
SELECT o.id, c.text
FROM sysobjects o INNER JOIN syscomments c
   ON o.id = c.id
WHERE o.type = 'P' and o.name = 'proc2'

请参见

ALTER PROCEDURE

批处理

控制流语言

游标

DBCC

DECLARE @local_variable

DROP PROCEDURE

函数

GRANT

设计存储过程

SELECT

sp_addextendedproc

sp_depends

sp_helptext

sp_procoption

sp_recompile

sp_rename

系统表

使用注释

使用变量和参数


CREATE RULE

创建称为规则的对象。当绑定到列或用户定义数据类型时，规则将指定可以插入到列中的可接受的值。规则是一种向后兼容的功能，执行一些与检查约束相同的功能。CHECK 约束是使用 ALTER 或 CREATE TABLE 的 CHECK 关键字创建的，是对列中的值进行限制的首选标准方法（可以对一列或多列定义多个约束）。列或用户定义数据类型只能有一个绑定的规则。但是，列可以同时具有规则和一个或多个与其关联的检查约束。在这种情况下，将检查所有限制。

语法

CREATE RULE rule
AS condition_expression

参数

rule

是新规则的名称。规则名称必须符合标识符规则。可以选择是否指定规则所有者的名称。

condition_expression

是定义规则的条件。规则可以是 WHERE 子句中任何有效的表达式，并且可以包含诸如算术运算符、关系运算符和谓词（如 IN、LIKE、BETWEEN）之类的元素。规则不能引用列或其它数据库对象。可以包含不引用数据库对象的内置函数。

condition_expression 包含一个变量。每个局部变量的前面都有一个 @ 符号。该表达式引用通过 UPDATE 或 INSERT 语句输入的值。在创建规则时，可以使用任何名称或符号表示值，但第一个字符必须是 @ 符号。

注释

在单个批处理中，CREATE RULE 语句不能与其它 Transact-SQL 语句组合使用。规则不适用于在创建规则时已存在于数据库中的数据，而且规则不能绑定到系统数据类型。规则只能在当前的数据库中创建。创建规则后，执行 sp_bindrule 可将规则绑定到列或用户定义数据类型。

规则必须与列的数据类型兼容。规则不能绑定到 text、image 或 timestamp 列。一定要用单引号 (') 将字符和日期常量引起来，在二进制常量前加 0x。例如，不能将 "@value LIKE A%" 用作数字列的规则。如果规则与其所绑定的列不兼容，Microsoft® SQL Server™ 将在插入值时（而不是在绑定规则时）返回错误信息。

对于用户定义数据类型，只有尝试在该类型的数据库列中插入值，或更新该类型的数据库列时，绑定到该类型的规则才会激活。因为规则不检验变量，所以在向用户定义数据类型的变量赋值时，不要赋予绑定到该数据类型的列的规则所拒绝的值。

若要获得关于规则的报表，请使用 sp_help。若要显示某条规则的文本，请以该规则的名称作为参数来执行存储过程 sp_helptext。若要重命名规则，请使用 sp_rename。

要创建与原有规则同名的新规则，必须在创建新规则之前将原有规则除去（使用 DROP RULE），而在除去规则之前，必须首先解除绑定（使用 sp_unbindrule）。使用 sp_unbindrule 解除规则与列的绑定。

可以在不解除原有绑定的情况下将新规则绑定到列或数据类型；新规则将替代原有规则。绑定到列的规则总是优先于绑定到用户定义数据类型的规则。将规则绑定到列时，该规则将替换已经绑定到该列的用户定义数据类型的规则。但是，将规则绑定到用户定义数据类型时，该规则不会替换绑定到该数据类型的列的规则。下表显示了当将规则绑定到已经存在规则的列和用户定义数据类型时，规则生效的优先顺序。

 | 旧规则绑定到
新规则绑定到 | 用户定义数据类型 | 列
用户定义数据类型 | 旧规则被替换 | 没有变化
列 | 旧规则被替换 | 旧规则被替换

如果列同时有默认值和规则与之关联，则默认值必须满足规则的定义。与规则冲突的默认值永远不能插入列。每次试图插入这样的默认值时，SQL Server 都会生成错误信息。

说明 SQL Server 是将空字符串解释为单个空格还是真正的空字符串取决于 sp_dbcmptlevel 的设置。如果兼容级别小于或等于 65，SQL Server 就将空字符串解释为单个空格。如果兼容级别等于 70，则 SQL Server 将空字符串解释为空字符串。有关更多信息，请参见 sp_dbcmptlevel。

权限

CREATE RULE 权限默认授予 sysadmin 固定服务器角色成员和 db_ddladmin 和 db_owner 固定数据库角色成员。sysadmin、db_owner 和 db_securityadmin 角色的成员可以将权限转让给其他用户。

示例
A. 范围规则

下例创建一个规则，用以限制插入该规则所绑定的列中的整数范围。

CREATE RULE range_rule
AS
@range >= $1000 AND @range < $20000
B. 列表规则

下例创建一个规则，用以将输入到该规则所绑定的列中的实际值限制为只能是该规则中列出的值。

CREATE RULE list_rule
AS
@list IN ('1389', '0736', '0877')
C. 模式规则

下例创建一个遵循这种模式的规则：任意两个字符的后面跟一个连字符和任意多个字符（或没有字符），并以 0 到 9 之间的整数结尾。

CREATE RULE pattern_rule
AS
@value LIKE '_ _-%[0-9]'

请参见

ALTER TABLE

批处理

CREATE DEFAULT

CREATE TABLE

DROP DEFAULT

DROP RULE

表达式

sp_bindrule

sp_help

sp_helptext

sp_rename

sp_unbindrule

使用标识符

WHERE


CREATE SCHEMA

创建一个架构，并且可以在概念上将其看作是包含表、视图和权限定义的对象。

语法

CREATE SCHEMA AUTHORIZATION owner
[ < schema_element > [ ...n ] ]

< schema_element > ::=
{ table_definition | view_definition | grant_statement }

参数

AUTHORIZATION owner

指定架构对象所有者的 ID。此标识符必须是数据库中有效的安全帐户。

table_definition

指定在架构内创建表的 CREATE TABLE 语句。

view_definition

指定在架构内创建视图的 CREATE VIEW 语句。

grant_statement

指定授予用户或用户组权限的 GRANT 语句。

注释

CREATE SCHEMA 提供了在单个语句中创建表、视图以及授予对象权限的方法。如果在创建任何对象或授予任何权限（这些是在 CREATE SCHEMA 语句中指定的）时发生错误，则不会创建任何对象。

创建的对象不必按逻辑顺序出现，但引用其它视图的视图除外。例如，GRANT 语句可以在创建某个对象之前授予该对象的权限，CREATE VIEW 语句也可以出现在创建该视图所引用表的 CREATE TABLE 语句之前。同样，CREATE TABLE 语句中声明的外键可以指向后面指定的表。例外情况是，如果一个视图的选择语句引用另一个视图，则必须在指定引用视图之前指定被引用的视图。

权限

CREATE SCHEMA 权限默认授予所有用户，但是他们必须有权创建加入到架构中的对象。

示例
A. 在创建对象之前授权访问对象

下例显示在创建对象之前授予权限。

CREATE SCHEMA AUTHORIZATION ross
GRANT SELECT on v1 TO public
CREATE VIEW v1(c1) AS SELECT c1 from t1
CREATE TABLE t1(c1 int)
B. 创建相互依赖的 FOREIGN KEY 约束

下例创建相互依赖的 FOREIGN KEY 约束。用其它方法完成由此 CREATE SCHEMA 示例实现的任务时，需要执行多个步骤。

CREATE SCHEMA AUTHORIZATION ross
CREATE TABLE t1 (c1 INT PRIMARY KEY, c2 INT REFERENCES t2(c1))
CREATE TABLE t2 (c1 INT PRIMARY KEY, c2 INT REFERENCES t1(c1))


CREATE STATISTICS

基于给出的一列或一组列创建柱状图和关联的密度组（集合）。

语法

CREATE STATISTICS statistics_name
ON { table | view } ( column [ ,...n ] )
[ WITH
[ [ FULLSCAN
| SAMPLE number { PERCENT | ROWS } ] [ , ] ]
[ NORECOMPUTE ]
    ]

参数

statistics_name

是要创建的统计组的名称。统计名称必须符合标识符规则。

table

是要在其上创建命名统计的表名。表名必须符合标识符规则。table 是与 column 关联的表。可以选择是否指定表所有者的名称。通过指定合法的数据库名称，可以在其它数据库中的表上创建统计。

view

是要在其上创建命名统计的视图名。必须在具有聚集索引的视图上创建统计。视图名必须符合标识符规则。view 是与 column 关联的视图。可以选择是否指定视图所有者名称。通过指定合法的数据库名称，可以在其它数据库中的视图上创建统计。

column

是要在其上创建统计的一列或一组列的名称。不能将计算列和 ntext、text 或 image 数据类型的列指定为统计列。

n

是表示可以指定多列的占位符。

FULLSCAN

指定应读取 table 中的所有行以收集统计信息。指定 FULLSCAN 具有与 SAMPLE 100 PERCENT 相同的行为。此选项不能与 SAMPLE 选项一起使用。

SAMPLE number { PERCENT | ROWS }

指定应使用随机采样来读取一定百分比或指定行数的数据以收集统计信息。number 只能为整数：如果是 PERCENT，number 应介于 0 到 100 之间；如果是 ROWS，number 可以是从 0 到 n 的总行数。

此选项不能与 FULLSCAN 选项一起使用。如果没有给出 SAMPLE 或 FULLSCAN 选项，Microsoft® SQL Server™ 会计算出一个自动样本。

NORECOMPUTE

指定应禁用统计的自动重新计算功能。如果指定了该选项，那么即使数据更改，SQL Server 仍将继续使用以前创建的（旧）统计。SQL Server 不自动更新和维护统计，这将使生成的计划可能不是最佳的。

警告 建议不要轻易使用该选项，只有训练有素的系统管理员才应使用该选项。

注释

只有表的所有者才能在该表上创建统计。不管表中是否有数据，表的所有者都可以在任何时候创建统计组（集合）。

CREATE STATISTICS 可以在带聚集索引的视图或索引视图上执行。只有在查询直接引用视图并为该视图指定了 NOEXPAND 提示的情况下，优化程序才会使用索引视图的统计。否则，在查询计划代入索引视图之前，统计由基础表导出。这种代入仅在 Microsoft SQL Server 2000 企业版和开发版中受支持。

权限

CREATE STATISTICS 权限默认授予 sysadmin 固定服务器角色成员或 db_ddladmin 和 db_owner 固定数据库角色成员以及表的所有者且不可转让。

示例
A. 使用带 SAMPLE number PERCENT 的 CREATE STATISTICS

下例创建 names 统计组（集合），该组基于 Customers 表中 CompanyName 和 ContactName 列的百分之五的数据计算随机采样统计。

CREATE STATISTICS names
   ON Customers (CompanyName, ContactName)
   WITH SAMPLE 5 PERCENT
GO
B. 使用带 FULLSCAN 和 NORECOMPUTE 的 CREATE STATISTICS

下例创建 names 统计组（集合），该组基于 Customers 表中 CompanyName 和 ContactName 列的所有行计算统计，并禁用统计的自动重新计算功能。

CREATE STATISTICS names
   ON Northwind..Customers (CompanyName, ContactName)
   WITH FULLSCAN, NORECOMPUTE
GO

请参见

CREATE INDEX

DBCC SHOW_STATISTICS

DROP STATISTICS

sp_autostats

sp_createstats

sp_dboption

UPDATE STATISTICS


CREATE TABLE

创建新表。

语法

CREATE TABLE
[ database_name.[ owner ] .| owner.] table_name
( { < column_definition >
| column_name AS computed_column_expression
 | < table_constraint > ::= [ CONSTRAINT constraint_name ] }

            | [ { PRIMARY KEY | UNIQUE } [ ,...n ]
)

[ ON { filegroup | DEFAULT } ]
[ TEXTIMAGE_ON { filegroup | DEFAULT } ]

< column_definition > ::= { column_name data_type }
[ COLLATE < collation_name > ]
[ [ DEFAULT constant_expression ]
| [ IDENTITY [ ( seed , increment ) [ NOT FOR REPLICATION ] ] ]
]
    [ ROWGUIDCOL]
[ < column_constraint > ] [ ...n ]

< column_constraint > ::= [ CONSTRAINT constraint_name ]
{ [ NULL | NOT NULL ]
| [ { PRIMARY KEY | UNIQUE }
[ CLUSTERED | NONCLUSTERED ]
[ WITH FILLFACTOR = fillfactor ]
[ON {filegroup | DEFAULT} ] ]
]
        | [ [ FOREIGN KEY ]
REFERENCES ref_table [ ( ref_column ) ]
[ ON DELETE { CASCADE | NO ACTION } ]
[ ON UPDATE { CASCADE | NO ACTION } ]
[ NOT FOR REPLICATION ]
]
        | CHECK [ NOT FOR REPLICATION ]
( logical_expression )
}

< table_constraint > ::= [ CONSTRAINT constraint_name ]
{ [ { PRIMARY KEY | UNIQUE }
[ CLUSTERED | NONCLUSTERED ]
{ ( column [ ASC | DESC ] [ ,...n ] ) }
[ WITH FILLFACTOR = fillfactor ]
[ ON { filegroup | DEFAULT } ]
]
    | FOREIGN KEY
[ ( column [ ,...n ] ) ]
REFERENCES ref_table [ ( ref_column [ ,...n ] ) ]
[ ON DELETE { CASCADE | NO ACTION } ]
[ ON UPDATE { CASCADE | NO ACTION } ]
[ NOT FOR REPLICATION ]
| CHECK [ NOT FOR REPLICATION ]
( search_conditions )
}

参数

database_name

是要在其中创建表的数据库名称。database_name 必须是现有数据库的名称。如果不指定数据库，database_name 默认为当前数据库。当前连接的登录必须在 database_name 所指定的数据库中有关联的现有用户 ID，而该用户 ID 必须具有创建表的权限。

owner

是新表所有者的用户 ID 名，owner 必须是 database_name 所指定的数据库中的现有用户 ID，owner 默认为与 database_name 所指定的数据库中的当前连接相关联的用户 ID。如果 CREATE TABLE 语句由 sysadmin 固定服务器角色成员或 database_name 所指定的数据库中的 db_dbowner 或 db_ddladmin 固定数据库角色成员执行，则 owner 可以指定与当前连接的登录相关联的用户 ID 以外的其它用户 ID。如果与执行 CREATE TABLE 语句的登录相关联的用户 ID 仅具有创建表的权限，则 owner 必须指定与当前登录相关联的用户 ID。sysadmin 固定服务器角色成员或别名为 dbo 用户的登录与用户 ID dbo 相关联；因此，由这些用户创建的表的默认所有者为 dbo。不是由上述两种角色的登录创建的表所有者默认为与该登录相关联的用户 ID。

table_name

是新表的名称。表名必须符合标识符规则。数据库中的 owner.table_name 组合必须唯一。table_name 最多可包含 128 个字符，但本地临时表的表名（名称前有一个编号符 #）最多只能包含 116 个字符。

column_name

是表中的列名。列名必须符合标识符规则，并且在表内唯一。以 timestamp 数据类型创建的列可以省略 column_name。如果不指定 column_name，timestamp 列的名称默认为 timestamp。

computed_column_expression

是定义计算列值的表达式。计算列是物理上并不存储在表中的虚拟列。计算列由同一表中的其它列通过表达式计算得到。例如，计算列可以这样定义：cost AS price * qty。表达式可以是非计算列的列名、常量、函数、变量，也可以是用一个或多个运算符连接的上述元素的任意组合。表达式不能为子查询。

计算列可用于选择列表、WHERE 子句、ORDER BY 子句或任何其它可使用常规表达式的位置，但下列情况除外：

  • 计算列不能用作 DEFAULT 或 FOREIGN KEY 约束定义，也不能与 NOT NULL 约束定义一起使用。但是，如果计算列由具有确定性的表达式定义，并且索引列中允许计算结果的数据类型，则可将该列用作索引中的键列，或用作 PRIMARY KEY 或 UNIQUE 约束的一部分。

    例如，如果表中含有整型列 a 和 b，则可以在计算列 a+b 上创建索引。但不能在计算列 a+DATEPART(dd, GETDATE()) 上创建索引，因为在以后的调用中，其值可能发生改变。

  • 计算列不能作为 INSERT 或 UPDATE 语句的目标。

    说明 表中计算列所使用的列值因行而异，因此每行的计算列值可能不同。

    计算列的为空性是由 SQL Server 根据使用的表达式自动确定的。即使只有不可为空的列，大多数表达式的结果也认为是可为空的，因为可能的下溢或溢出也将生成 NULL 结果。使用 COLUMNPROPERTY 函数（AllowsNull 属性）查看表中任何计算列的为空性。通过指定 ISNULL(check_expression, constant)，其中常量为替代任何 NULL 结果的非 NULL 值，可为空的表达式 expr 可以转换为不可为空的表达式。

ON {filegroup | DEFAULT}

指定存储表的文件组。如果指定 filegroup，则表将存储在指定的文件组中。数据库中必须存在该文件组。如果指定 DEFAULT，或者根本未指定 ON 参数，则表存储在默认文件组中。

ON {filegroup | DEFAULT} 也可以在 PRIMARY KEY 约束或 UNIQUE 约束中指定。这些约束会创建索引。如果指定 filegroup，则索引将存储在指定的文件组中。如果指定 DEFAULT，则索引将存储在默认文件组中。如果约束中没有指定文件组，则索引将与表存储在同一文件组中。如果 PRIMARY KEY 约束或 UNIQUE 约束创建聚集索引，则表的数据页将与索引存储在同一文件组中。

说明 在 ON {filegroup | DEFAULT} 和 TEXTIMAGE_ON {filegroup | DEFAULT} 的上下文中，DEFAULT 并不是关键字。DEFAULT 是默认文件组的标识符并需对其进行定界，如 ON "DEFAULT"、ON [DEFAULT] 和 TEXTIMAGE_ON "DEFAULT" 或 TEXTIMAGE_ON [DEFAULT]。

TEXTIMAGE_ON

是表示 text、ntext 和 image 列存储在指定文件组中的关键字。如果表中没有 text、ntext 或 image 列，则不能使用 TEXTIMAGE ON。如果没有指定 TEXTIMAGE_ON，则 text、ntext 和 image 列将与表存储在同一文件组中。

data_type

指定列的数据类型。可以是系统数据类型或用户定义数据类型。用户定义数据类型必须先用 sp_addtype 创建，然后才能在表定义中使用。

在 CREATE TABLE 语句中，用户定义数据类型的 NULL/NOT NULL 赋值可被替代。但长度标准不能更改；不能在 CREATE TABLE 语句中指定用户定义数据类型的长度。

DEFAULT

如果在插入过程中未显式提供值，则指定为列提供的值。DEFAULT 定义可适用于除定义为 timestamp 或带 IDENTITY 属性的列以外的任何列。除去表时，将删除 DEFAULT 定义。只有常量值（如字符串）、系统函数（如 SYSTEM_USER()）或 NULL 可用作默认值。为保持与 SQL Server 早期版本的兼容，可以给 DEFAULT 指派约束名。

constant_expression

是用作列的默认值的常量、NULL 或系统函数。

IDENTITY

表示新列是标识列。当向表中添加新行时，Microsoft® SQL Server™ 将为该标识列提供一个唯一的、递增的值。标识列通常与 PRIMARY KEY 约束一起用作表的唯一行标识符。可以将 IDENTITY 属性指派给 tinyint、smallint、int、bigint、decimal(p,0) 或 numeric(p,0) 列。对于每个表只能创建一个标识列。不能对标识列使用绑定默认值和 DEFAULT 约束。必须同时指定种子和增量，或者二者都不指定。如果二者都未指定，则取默认值 (1,1)。

seed

是装入表的第一行所使用的值。

increment

是添加到前一行的标识值的增量值。

NOT FOR REPLICATION

表示当复制登录（如 sqlrepl）向表中插入数据时，不强制 IDENTITY 属性。复制的行必须保留发布数据库中所赋予的键值；NOT FOR REPLICATION 子句确保不向复制进程所插入的行赋予新的标识值。其它登录所插入的行仍然具有以通常的方式创建的新标识值。建议同时使用具有 NOT FOR REPLICATION 的 CHECK 约束，以确保赋予的标识值处于当前数据库所需的范围内。

ROWGUIDCOL

表示新列是行的全局唯一标识符列。对于每个表只能指派一个 uniqueidentifier 列作为 ROWGUIDCOL 列。ROWGUIDCOL 属性只能指派给 uniqueidentifier 列。如果数据库兼容级别小于或等于 65，则 ROWGUIDCOL 关键字无效。有关更多信息，请参见 sp_dbcmptlevel。

ROWGUIDCOL 属性并不强制列中所存储值的唯一性。该属性也不会为插入到表中的新行自动生成值。若要为每列生成唯一值，那么或者在 INSERT 语句中使用 NEWID 函数，或者将 NEWID 函数指定为该列的默认值。

collation_name

指定列的排序规则。排序规则名称既可以是 Windows 排序规则名称，也可以是 SQL 排序规则名称。collation_name 仅适用于数据类型为 char、varchar、text、nchar、nvarchar 及 ntext 的列。如果没有指定该参数，那么如果列的数据类型是用户定义的，则该列的排序规则就是用户定义数据类型的排序规则，否则就是数据库的默认排序规则。

有关 Windows 和 SQL 排序规则名称的更多信息，请参见 COLLATE。

CONSTRAINT

是可选关键字，表示 PRIMARY KEY、NOT NULL、UNIQUE、FOREIGN KEY 或 CHECK 约束定义的开始。约束是特殊属性，用于强制数据完整性并可以为表及其列创建索引。

constrain_name

是约束的名称。约束名在数据库内必须是唯一的。

NULL | NOT NULL

是确定列中是否允许空值的关键字。从严格意义上讲，NULL 不是约束，但可以使用与指定 NOT NULL 同样的方法指定。

PRIMARY KEY

是通过唯一索引对给定的一列或多列强制实体完整性的约束。对于每个表只能创建一个 PRIMARY KEY 约束。

UNIQUE

是通过唯一索引为给定的一列或多列提供实体完整性的约束。一个表可以有多个 UNIQUE 约束。

CLUSTERED | NONCLUSTERED

是表示为 PRIMARY KEY 或 UNIQUE 约束创建聚集或非聚集索引的关键字。PRIMARY KEY 约束默认为 CLUSTERED，UNIQUE 约束默认为 NONCLUSTERED。

在 CREATE TABLE 语句中只能为一个约束指定 CLUSTERED。如果在为 UNIQUE 约束指定 CLUSTERED 的同时又指定了 PRIMARY KEY 约束，则 PRIMARY KEY 将默认为 NONCLUSTERED。

[ WITH FILLFACTOR = fillfactor ]

指定 SQL Server 存储索引数据时每个索引页的充满程度。用户指定的 fillfactor 取值范围从 1 到 100。如果没有指定 fillfactor，则默认为 0。创建索引时，fillfactor 的值越低，不必分配新空间即可由新索引项使用的空间就越多。

FOREIGN KEY...REFERENCES

是为列中的数据提供引用完整性的约束。FOREIGN KEY 约束要求列中的每个值在被引用表中对应的被引用列中都存在。FOREIGN KEY 约束只能引用被引用表中为 PRIMARY KEY 或 UNIQUE 约束的列或被引用表中在 UNIQUE INDEX 内引用的列。

ref_table

是 FOREIGN KEY 约束所引用的表名。

(ref_column[,...n])

是 FOREIGN KEY 约束所引用的表中的一列或多列。

ON DELETE {CASCADE | NO ACTION}

指定当要创建的表中的行具有引用关系，并且从父表中删除该行所引用的行时，要对该行采取的操作。默认设置为 NO ACTION。

如果指定 CASCADE，则从父表中删除被引用行时，也将从引用表中删除引用行。如果指定 NO ACTION，SQL Server 将产生一个错误并回滚父表中的行删除操作。

例如，在 Northwind 数据库中，Orders 表和 Customers 表之间有引用关系。Orders.CustomerID 外键引用 Customers.CustomerID 主键。

如果对 Customers 表的某行执行 DELETE 语句，并且为 Orders.CustomerID 指定 ON DELETE CASCADE 操作，则 SQL Server 将在 Orders 表中检查是否有与被删除的行相关的一行或多行。如果存在相关行，则 Orders 表中的相关行将随 Customers 表中的被引用行一同删除。

反之，如果指定 NO ACTION，若在 Orders 表中至少有一行引用 Customers 表中要删除的行，则 SQL Server 将产生一个错误并回滚 Customers 表中的删除操作。

ON UPDATE {CASCADE | NO ACTION}

指定当要创建的表中的行具有引用关系，并且在父表中更新该行所引用的行时，要对该行采取的操作。默认设置为 NO ACTION。

如果指定 CASCADE，则在父表中更新被引用行时，也将在引用表中更新引用行。如果指定 NO ACTION，SQL Server 将产生一个错误并回滚父表中的行更新操作。

例如，在 Northwind 数据库中，Orders 表和 Customers 表之间有引用关系：Orders.CustomerID 外键引用 Customers.CustomerID 主键。

如果对 Customers 表的某行执行 UPDATE 语句，并且为 Orders.CustomerID 指定 ON UPDATE CASCADE 操作，则 SQL Server 将在 Orders 表中检查是否有与被更新行相关的一行或多行。如果存在相关行，则 Orders 表中的相关行将随 Customers 表中的被引用行一同更新。

反之，如果指定 NO ACTION，若在 Orders 表中至少有一行引用 Customers 行，则 SQL Server 将产生一个错误并回滚对 Customers 行的更新操作。

CHECK

是通过限制可输入到一列或多列中的可能值强制域完整性的约束。

NOT FOR REPLICATION

是用于防止在复制所使用的分发过程中强制 CHECK 约束的关键字。当表是复制发布的订户时，请不要直接更新订阅表，而要更新发布表，然后让复制进程将数据分发回订阅表。可以在订阅表上定义 CHECK 约束，以防用户修改订阅表。但是如果不使用 NOT FOR REPLICATION 子句，CHECK 约束同样会防止复制进程将修改从发布表分发给订阅表。NOT FOR REPLICATION 子句表示对用户的修改（而不是对复制进程）强加约束。

NOT FOR REPLICATION CHECK 约束适用于被更新记录的前像和后像，以防在复制范围中添加记录或从复制范围中删除记录。将检查所有删除和插入操作；如果操作在复制范围内，则拒绝执行该操作。

如果对标识符列使用此约束，则当复制用户更新标识列时，SQL Server 将允许不必重新计算表标识列的种子值。

logical_expression

是返回 TRUE 或 FALSE 的逻辑表达式。

column

是用括号括起来的一列或多列，在表约束中表示这些列用在约束定义中。

[ASC | DESC]

指定加入到表约束中的一列或多列的排序次序。默认设置为 ASC。

n

是表示前面的项可重复 n 次的占位符。

注释

SQL Server 的每个数据库最多可存储 20 亿个表，每个表可以有 1024 列。表的行数及总大小仅受可用存储空间的限制。每行最多可以存储 8,060 字节。如果创建具有 varchar、nvarchar 或 varbinary 列的表，并且列的字节总数超过 8,060 字节，虽然仍可以创建此表，但会出现警告信息。如果试图插入超过 8,060 字节的行或对行进行更新以至字节总数超过 8,060，将出现错误信息并且语句执行失败。

包含 sql_variant 列的 CREATE TABLE 语句可以生成下列警告：

The total row size (xx) for table 'yy' exceeds the maximum number of bytes per row (8060). Rows that exceed the maximum number of bytes will not be added.

出现该警告是因为 sql_variant 的最大长度只能为 8016 字节。当某个 sql_variant 列包含与最大长度接近的值时，它可以超过行的最大大小限制。

每个表最多可以有 249 个非聚集索引和一个聚集索引。其中包括所有为支持表中所定义的 PRIMARY KEY 和 UNIQUE 约束而生成的索引。

SQL Server 在列定义中并不强制以特定的顺序指定 DEFAULT、IDENTITY、ROWGUIDCOL 或列约束。

临时表

可以创建本地和全局临时表。本地临时表仅在当前会话中可见；全局临时表在所有会话中都可见。

本地临时表的名称前面有一个编号符 (#table_name)，而全局临时表的名称前面有两个编号符 (##table_name)。

SQL 语句使用 CREATE TABLE 语句中为 table_name 指定的名称引用临时表：

CREATE TABLE #MyTempTable (cola INT PRIMARY KEY)
INSERT INTO #MyTempTable VALUES (1)

如果本地临时表由存储过程创建或由多个用户同时执行的应用程序创建，则 SQL Server 必须能够区分由不同用户创建的表。为此，SQL Server 在内部为每个本地临时表的表名追加一个数字后缀。存储在 tempdb 数据库的 sysobjects 表中的临时表，其全名由 CREATE TABLE 语句中指定的表名和系统生成的数字后缀组成。为了允许追加后缀，为本地临时表指定的表名 table_name 不能超过 116 个字符。

除非使用 DROP TABLE 语句显式除去临时表，否则临时表将在退出其作用域时由系统自动除去：

  • 当存储过程完成时，将自动除去在存储过程中创建的本地临时表。由创建表的存储过程执行的所有嵌套存储过程都可以引用此表。但调用创建此表的存储过程的进程无法引用此表。

  • 所有其它本地临时表在当前会话结束时自动除去。

  • 全局临时表在创建此表的会话结束且其它任务停止对其引用时自动除去。任务与表之间的关联只在单个 Transact-SQL 语句的生存周期内保持。换言之，当创建全局临时表的会话结束时，最后一条引用此表的 Transact-SQL 语句完成后，将自动除去此表。

在存储过程或触发器中创建的本地临时表与在调用存储过程或触发器之前创建的同名临时表不同。如果查询引用临时表，而同时有两个同名的临时表，则不定义针对哪个表解析该查询。嵌套存储过程同样可以创建与调用它的存储过程所创建的临时表同名的临时表。嵌套存储过程中对表名的所有引用都被解释为是针对该嵌套过程所创建的表，例如：

CREATE PROCEDURE Test2
AS
CREATE TABLE #t(x INT PRIMARY KEY)
INSERT INTO #t VALUES (2)
SELECT Test2Col = x FROM #t
GO
CREATE PROCEDURE Test1
AS
CREATE TABLE #t(x INT PRIMARY KEY)
INSERT INTO #t VALUES (1)
SELECT Test1Col = x FROM #t
EXEC Test2
GO
CREATE TABLE #t(x INT PRIMARY KEY)
INSERT INTO #t VALUES (99)
GO
EXEC Test1
GO

下面是结果集：

(1 row(s) affected)

Test1Col
-----------
1

(1 row(s) affected)

Test2Col
-----------
2

当创建本地或全局临时表时，CREATE TABLE 语法支持除 FOREIGN KEY 约束以外的其它所有约束定义。如果在临时表中指定 FOREIGN KEY 约束，该语句将返回警告信息，指出此约束已被忽略，表仍会创建，但不具有 FOREIGN KEY 约束。在 FOREIGN KEY 约束中不能引用临时表。

考虑使用表变量而不使用临时表。当需要在临时表上显式地创建索引时，或多个存储过程或函数需要使用表值时，临时表很有用。通常，表变量提供更有效的查询处理。有关更多信息，请参见 table。

PRIMARY KEY 约束
  • 一个表只能包含一个 PRIMARY KEY 约束。

  • 由 PRIMARY KEY 约束生成的索引不能使表中的非聚集索引超过 249 个，聚集索引超过 1 个。

  • 如果没有在 PRIMARY KEY 约束中指定 CLUSTERED 或 NONCLUSTERED，并且没有为 UNIQUE 约束指定聚集索引，则将对该 PRIMARY KEY 约束使用 CLUSTERED。

  • 在 PRIMARY KEY 约束中定义的所有列都必须定义为 NOT NULL。如果没有指定为空性，加入 PRIMARY KEY 约束的所有列的为空性都将设置为 NOT NULL。
UNIQUE 约束
  • 如果 UNIQUE 约束中没有指定 CLUSTERED 或 NONCLUSTERED，则默认为 NONCLUSTERED。

  • 每个 UNIQUE 约束都生成一个索引。由 UNIQUE 约束生成的索引不能使表中的非聚集索引超过 249 个，聚集索引超过 1 个。
FOREIGN KEY 约束
  • 如果在 FOREIGN KEY 约束的列中输入非 NULL 值，则此值必须在被引用的列中存在，否则将返回违反外键约束的错误信息。

  • FOREIGN KEY 约束应用于前面所讲的列，除非指定了源列。

  • FOREIGN KEY 约束仅能引用位于同一服务器上的同一数据库中的表。数据库间的引用完整性必须通过触发器实现。有关更多信息，请参见 CREATE TRIGGER。

  • FOREIGN KEY 可以引用同一表中的其它列（自引用）。

  • 列级 FOREIGN KEY 约束的 REFERENCES 子句仅能列出一个引用列，且该列必须与定义约束的列具有相同的数据类型。

  • 表级 FOREIGN KEY 约束的 REFERENCES 子句中引用列的数目必须与约束列列表中的列数相同。每个引用列的数据类型也必须与列表中相应列的数据类型相同。

  • 如果 timestamp 类型的列是外键或被引用键的一部分，则不能指定 CASCADE。

  • 可以在相互间具有引用关系的表上组合使用 CASCADE 和 NO ACTION。如果 SQL Server 遇到 NO ACTION，将终止执行语句并回滚相关的 CASCADE 操作。当 DELETE 语句导致 CASCADE 和 NO ACTION 组合操作时，在 SQL Server 检查 NO ACTION 操作之前将执行所有 CASCADE 操作。

  • 一个表最多可包含 253 个 FOREIGN KEY 约束。

  • 对于临时表不强制 FOREIGN KEY 约束。

  • 每个表在其 FOREIGN KEY 约束中最多可以引用 253 个不同的表。

  • FOREIGN KEY 约束只能引用被引用表的 PRIMARY KEY 或 UNIQUE 约束中的列或被引用表上 UNIQUE INDEX 中的列。
DEFAULT 定义
  • 每列只能有一个 DEFAULT 定义。

  • DEFAULT 定义可以包含常量值、函数、SQL-92 niladic 函数或 NULL。下表显示 niladic 函数及其在执行 INSERT 语句时返回的默认值。
    SQL-92 niladic 函数 | 返回的值
    CURRENT_TIMESTAMP | 当前日期和时间。
    CURRENT_USER | 执行插入操作的用户名。
    SESSION_USER | 执行插入操作的用户名。
    SYSTEM_USER | 执行插入操作的用户名。
    USER | 执行插入操作的用户名。

  • DEFAULT 定义中的 constant_expression 不能引用表中的其它列，也不能引用其它表、视图或存储过程。

  • 不能在数据类型为 timestamp 的列或具有 IDENTITY 属性的列上创建 DEFAULT 定义。

  • 如果用户定义数据类型绑定到默认对象，则不能在该用户定义数据类型的列上创建 DEFAULT 定义。
CHECK 约束
  • 列可以有任意多个 CHECK 约束，并且约束条件中可以包含用 AND 和 OR 组合起来的多个逻辑表达式。列上的多个 CHECK 约束按创建顺序进行验证。

  • 搜索条件必须取值为布尔表达式，并且不能引用其它表。

  • 列级 CHECK 约束只能引用被约束的列，表级 CHECK 约束只能引用同一表中的列。

    当执行 INSERT 和 DELETE 语句时，CHECK CONSTRAINTS 和规则具有相同的数据验证功能。

  • 当列上存在规则和一个或多个 CHECK 约束时，将验证所有限制。
其它约束信息
  • 为约束创建的索引不能用 DROP INDEX 语句除去；必须用 ALTER TABLE 语句除去约束。可以用 DBCC DBREINDEX 语句重建为约束创建的并由其使用的索引。

  • 约束的名称必须符合标识符规则，但其名称的首字符不能为 #。如果没有提供 constraint_name，则使用系统生成的名称。约束名将出现在所有与违反约束有关的错误信息中。

  • 当 INSERT、UPDATE 或 DELETE 语句违反约束时，将终止执行该语句。但将继续处理事务（如果此语句为显式事务的组成部分）。可以通过检查系统函数 @@ERROR，在事务定义中使用 ROLLBACK TRANSACTION 语句。

如果某个表具有 FOREIGN KEY 或 CHECK CONSTRAINTS 及触发器，则将在触发器执行前先检查约束条件。

若要获得关于表及其列的报表，请使用 sp_help 或 sp_helpconstraint。若要重命名表，请使用 sp_rename。若要获得与表相关的视图和存储过程的报表，请使用 sp_depends。

通常情况下，为表和索引分配空间时，每次以一个扩展盘区为增量单位。当创建表或索引时，首先从混合扩展盘区为其分配页，直到它具有足够的页填满一个统一扩展盘区。当有足够的页填满统一扩展盘区后，每当当前分配的扩展盘区填满时，将再为其分配另一个扩展盘区。若要获得关于由表分配和占用的空间量的报表，请执行 sp_spaceused。

表定义中的为空性规则

列的为空性规则决定该列中是否允许以空值 (NULL) 作为其数据。NULL 不是零或空白：它表示没有输入任何内容，或提供了一个显式 NULL 值，通常表示该值未知或不适用。

当用 CREATE TABLE 或 ALTER TABLE 语句创建或更改表时，数据库或会话设置会影响且可能替代列定义中数据类型的为空性。建议始终将列显式定义为非计算列的 NULL 或 NOT NULL，如果使用用户定义数据类型，则建议允许该列使用此数据类型的默认为空性。

在没有显式指定时，列的为空性遵循以下规则：

  • 如果该列以用户定义数据类型定义：
    • SQL Server 使用在创建数据类型时指定的为空性。使用 sp_help 可获得该数据类型的默认为空性。
  • 如果该列以系统提供的数据类型定义：
    • 如果系统提供的数据类型只有一个选项，则优先使用该选项。timestamp 数据类型只能定义为 NOT NULL。

    • 如果 sp_dbcmptlevel 的设置是 65 或更小，且列没有显式定义 NULL 或 NOT NULL，则 bit 数据类型默认为 NOT NULL。有关更多信息，请参见 sp_dbcmptlevel。

    • 如果有任何会话设置为 ON（用 SET 语句打开），那么：

      如果 ANSI_NULL_DFLT_ON 是 ON，则指派 NULL。

      如果 ANSI_NULL_DFLT_OFF 是 ON，则指派 NOT NULL。

    • 如果配置了任何数据库设置（用 sp_dboption 更改），那么：

      如果 ANSI null default 为 true，则指派 NULL。

      如果 ANSI null default 为 false，则指派 NOT NULL。

  • 当会话的两个 ANSI_NULL_DFLT 选项都未设置，且数据库设置为默认值（ANSI null default 为 false）时，将指派 SQL Server 的默认设置 NOT NULL。

  • 如果该列是计算列，则其为空性总是由 SQL Server 自动确定。使用 COLUMNPROPERTY 函数（AllowsNull 属性）查找这类列的为空性。

说明 默认情况下，SQL Server ODBC 驱动程序和用于 SQL Server 的 Microsoft OLE DB 提供程序都将 ANSI_NULL_DFLT_ON 设置为 ON。ODBC 和 OLE DB 用户可以在 ODBC 数据源中配置该设置，或通过应用程序设置的连接特性或属性配置该设置。

权限

CREATE TABLE 权限默认授予 db_owner 和 db_ddladmin 固定数据库角色成员。db_owner 固定数据库角色成员和 sysadmin 固定服务器角色成员可以将 CREATE TABLE 权限转让给其他用户。

示例
A. 使用 PRIMARY KEY 约束

下例显示在示例数据库 pubs 的 jobs 表中，job_id 列中具有聚集索引的 PRIMARY KEY 约束的列定义；此例由系统提供约束名。

job_id   smallint
      PRIMARY KEY CLUSTERED

下例显示如何为 PRIMARY KEY 约束提供名称。此约束用于 employee 表中的 emp_id 列。此列基于用户定义数据类型。

emp_id   empid
      CONSTRAINT PK_emp_id PRIMARY KEY NONCLUSTERED
B. 使用 FOREIGN KEY 约束

FOREIGN KEY 约束用于引用其它表。FOREIGN KEY 可以是单列键或多列键。下例显示 employee 表上引用 jobs 表的单列 FOREIGN KEY 约束。对于单列 FOREIGN KEY 约束，只需要 REFERENCES 子句。

job_id   smallint      NOT NULL
      DEFAULT 1
      REFERENCES jobs(job_id)

也可以显式使用 FOREIGN KEY 子句并复述列特性。注意在这两个表中列名不必相同。

FOREIGN KEY (job_id) REFERENCES jobs(job_id)

多列键约束作为表约束创建。在 pubs 数据库中，sales 表包含多列 PRIMARY KEY。下例显示如何从其它表中引用此键（可选择显式约束名）。

CONSTRAINT FK_sales_backorder FOREIGN KEY (stor_id, ord_num, title_id)
   REFERENCES sales (stor_id, ord_num, title_id)
C. 使用 UNIQUE 约束

UNIQUE 约束用于强制非主键列的唯一性。PRIMARY KEY 约束列自动包含唯一性限制；但是，UNIQUE 约束允许存在空值。下例显示表 authors 中名为 pseudonym 的列。该列强制作者笔名必须唯一。

pseudonym varchar(30)   NULL
UNIQUE NONCLUSTERED

下例显示在 stor_id 实际上是 PRIMARY KEY 的 stores 表中，stor_name 列和 city 列上创建的 UNIQUE 约束；同一个城市中的商店不应同名。

CONSTRAINT U_store UNIQUE NONCLUSTERED (stor_name, city)
D. 使用 DEFAULT 定义

使用 INSERT 和 UPDATE 语句时，如果没有提供值，则默认值会提供值。在 pubs 数据库中，使用了许多 DEFAULT 定义以确保输入有效的数据或占位符。

在 jobs 表上，当没有显式输入实际的描述信息时，默认的字符串将提供描述信息（列 job_desc）。

DEFAULT 'New Position - title not formalized yet'

在 employee 表中，员工可以受雇于子公司或母公司。如果没有显式提供公司信息，则输入母公司（注意在表定义中可以嵌套注释，如下所示）。

DEFAULT ('9952')
/* By default the Parent Company Publisher is the company
to whom each employee reports. */

除了常量以外，DEFAULT 定义还可以包含函数。使用下例获取输入项的当前日期：

DEFAULT (getdate())

niladic 函数也可以提高数据的完整性。若要跟踪插入行的用户，请使用 niladic 函数 USER（niladic 函数不使用括号）：

DEFAULT USER
E. 使用 CHECK 约束

下例显示对输入到 jobs 表中的 min_lvl 列和 max_lvl 列的值的限制。这两个约束都未命名：

CHECK (min_lvl >= 10)

与

CHECK (max_lvl <= 250)

下例显示对输入到 employee 表的 emp_id 列中的字符数据具有模式限制的命名约束。

CONSTRAINT CK_emp_id CHECK (emp_id LIKE
   '[A-Z][A-Z][A-Z][1-9][0-9][0-9][0-9][0-9][FM]' OR
   emp_id LIKE '[A-Z]-[A-Z][1-9][0-9][0-9][0-9][0-9][FM]')

下例指定 pub_id 必须在特定的列表中或遵循给定的模式。此约束用于 publishers 表中的 pub_id 列。

CHECK (pub_id IN ('1389', '0736', '0877', '1622', '1756')
   OR pub_id LIKE '99[0-9][0-9]')
F. 完整的表定义

下例显示 pubs 数据库中所创建的三个表（jobs、employee 和 publishers）的完整表定义，其中包含所有的约束定义。

/* ************************** jobs table ************************** */
CREATE TABLE jobs
(
   job_id  smallint
      IDENTITY(1,1)
      PRIMARY KEY CLUSTERED,
   job_desc        varchar(50)     NOT NULL
      DEFAULT 'New Position - title not formalized yet',
   min_lvl tinyint NOT NULL
      CHECK (min_lvl >= 10),
   max_lvl tinyint NOT NULL
      CHECK (max_lvl <= 250)
)

/* ************************* employee table ************************* */
CREATE TABLE employee
(
   emp_id  empid
      CONSTRAINT PK_emp_id PRIMARY KEY NONCLUSTERED
      CONSTRAINT CK_emp_id CHECK (emp_id LIKE
         '[A-Z][A-Z][A-Z][1-9][0-9][0-9][0-9][0-9][FM]' or
         emp_id LIKE '[A-Z]-[A-Z][1-9][0-9][0-9][0-9][0-9][FM]'),
      /* Each employee ID consists of three characters that
      represent the employee's initials, followed by a five
      digit number ranging from 10000 through 99999 and then the
      employee's gender (M or F). A (hyphen) - is acceptable
      for the middle initial. */
   fname   varchar(20)     NOT NULL,
   minit   char(1) NULL,
   lname   varchar(30)     NOT NULL,
   job_id  smallint        NOT NULL
      DEFAULT 1
      /* Entry job_id for new hires. */
      REFERENCES jobs(job_id),
   job_lvl tinyint
      DEFAULT 10,
      /* Entry job_lvl for new hires. */
   pub_id  char(4) NOT NULL
      DEFAULT ('9952')
      REFERENCES publishers(pub_id),
      /* By default, the Parent Company Publisher is the company
      to whom each employee reports. */
   hire_date       datetime        NOT NULL
      DEFAULT (getdate())
      /* By default, the current system date is entered. */
)

/* ***************** publishers table ******************** */
CREATE TABLE publishers
(
   pub_id  char(4) NOT NULL
         CONSTRAINT UPKCL_pubind PRIMARY KEY CLUSTERED
         CHECK (pub_id IN ('1389', '0736', '0877', '1622', '1756')
            OR pub_id LIKE '99[0-9][0-9]'),
   pub_name      varchar(40)     NULL,
   city         varchar(20)     NULL,
   state      char(2) NULL,
   country      varchar(30)     NULL
            DEFAULT('USA')
)
G. 在列中使用 uniqueidentifier 数据类型

下例创建含有 uniqueidentifier 列的表。该表使用 PRIMARY KEY 约束以确保用户不会在表中插入重复的值，并在 DEFAULT 约束中使用 NEWID() 函数为新行提供值。

CREATE TABLE Globally_Unique_Data
(guid uniqueidentifier
   CONSTRAINT Guid_Default
   DEFAULT NEWID(),
Employee_Name varchar(60),
CONSTRAINT Guid_PK PRIMARY KEY (Guid)
)
H. 对计算列使用表达式

下例显示如何使用表达式 ((low + high)/2) 计算 myavg 计算列。

CREATE TABLE mytable
   (
    low int,
    high int,
    myavg AS (low + high)/2
   )
I. 对计算列使用 USER_NAME 函数

下例在 myuser_name 列中使用 USER_NAME 函数。

CREATE TABLE mylogintable
   (
    date_in datetime,
    user_id int,
    myuser_name AS USER_NAME()
   )
J. 使用 NOT FOR REPLICATION

下例显示如何在订阅了复制的表中使用 IDENTITY 属性。此表包含 CHECK 约束，以确保此系统生成的 SaleID 值不会增长到为复制发布服务器指派的范围内。

CREATE TABLE Sales
   (SaleID INT IDENTITY(100000,1) NOT FOR REPLICATION,
             CHECK NOT FOR REPLICATION (SaleID <= 199999),
    SalesRegion CHAR(2),
   CONSTRAINT ID_PK PRIMARY KEY (SaleID)
   )

请参见

ALTER TABLE

COLUMNPROPERTY

CREATE INDEX

CREATE RULE

CREATE VIEW

数据类型

DROP INDEX

DROP RULE

DROP TABLE

sp_addtype

sp_depends

sp_help

sp_helpconstraint

sp_rename

sp_spaceused


CREATE TRIGGER

创建触发器，触发器是一种特殊的存储过程，在用户试图对指定的表执行指定的数据修改语句时自动执行。Microsoft® SQL Server™ 允许为任何给定的 INSERT、UPDATE 或 DELETE 语句创建多个触发器。

语法

CREATE TRIGGER trigger_name
ON { table | view }
[ WITH ENCRYPTION ]
{
{ { FOR | AFTER | INSTEAD OF } { [ INSERT ] [ , ] [ UPDATE ] }
[ WITH APPEND ]
[ NOT FOR REPLICATION ]
AS
[ { IF UPDATE ( column )
[ { AND | OR } UPDATE ( column ) ]
[ ...n ]
| IF ( COLUMNS_UPDATED ( ) { bitwise_operator } updated_bitmask )
{ comparison_operator } column_bitmask [ ...n ]
} ]
        sql_statement [ ...n ]
    }
}

参数

trigger_name

是触发器的名称。触发器名称必须符合标识符规则，并且在数据库中必须唯一。可以选择是否指定触发器所有者名称。

Table | view

是在其上执行触发器的表或视图，有时称为触发器表或触发器视图。可以选择是否指定表或视图的所有者名称。

WITH ENCRYPTION

加密 syscomments 表中包含 CREATE TRIGGER 语句文本的条目。使用 WITH ENCRYPTION 可防止将触发器作为 SQL Server 复制的一部分发布。

AFTER

指定触发器只有在触发 SQL 语句中指定的所有操作都已成功执行后才激发。所有的引用级联操作和约束检查也必须成功完成后，才能执行此触发器。

如果仅指定 FOR 关键字，则 AFTER 是默认设置。

不能在视图上定义 AFTER 触发器。

INSTEAD OF

指定执行触发器而不是执行触发 SQL 语句，从而替代触发语句的操作。

在表或视图上，每个 INSERT、UPDATE 或 DELETE 语句最多可以定义一个 INSTEAD OF 触发器。然而，可以在每个具有 INSTEAD OF 触发器的视图上定义视图。

INSTEAD OF 触发器不能在 WITH CHECK OPTION 的可更新视图上定义。如果向指定了 WITH CHECK OPTION 选项的可更新视图添加 INSTEAD OF 触发器，SQL Server 将产生一个错误。用户必须用 ALTER VIEW 删除该选项后才能定义 INSTEAD OF 触发器。

{ [DELETE] [,] [INSERT] [,] [UPDATE] }

是指定在表或视图上执行哪些数据修改语句时将激活触发器的关键字。必须至少指定一个选项。在触发器定义中允许使用以任意顺序组合的这些关键字。如果指定的选项多于一个，需用逗号分隔这些选项。

对于 INSTEAD OF 触发器，不允许在具有 ON DELETE 级联操作引用关系的表上使用 DELETE 选项。同样，也不允许在具有 ON UPDATE 级联操作引用关系的表上使用 UPDATE 选项。

WITH APPEND

指定应该添加现有类型的其它触发器。只有当兼容级别是 65 或更低时，才需要使用该可选子句。如果兼容级别是 70 或更高，则不必使用 WITH APPEND 子句添加现有类型的其它触发器（这是兼容级别设置为 70 或更高的 CREATE TRIGGER 的默认行为）。有关更多信息，请参见 sp_dbcmptlevel。

WITH APPEND 不能与 INSTEAD OF 触发器一起使用，或者，如果显式声明 AFTER 触发器，也不能使用该子句。只有当出于向后兼容而指定 FOR 时（没有 INSTEAD OF 或 AFTER），才能使用 WITH APPEND。以后的版本将不支持 WITH APPEND 和 FOR（将被解释为 AFTER）。

NOT FOR REPLICATION

表示当复制进程更改触发器所涉及的表时，不应执行该触发器。

AS

是触发器要执行的操作。

sql_statement

是触发器的条件和操作。触发器条件指定其它准则，以确定 DELETE、INSERT 或 UPDATE 语句是否导致执行触发器操作。

当尝试 DELETE、INSERT 或 UPDATE 操作时，Transact-SQL语句中指定的触发器操作将生效。

触发器可以包含任意数量和种类的 Transact-SQL 语句。触发器旨在根据数据修改语句检查或更改数据；它不应将数据返回给用户。触发器中的 Transact-SQL 语句常常包含控制流语言。CREATE TRIGGER 语句中使用几个特殊的表：

  • deleted 和 inserted 是逻辑（概念）表。这些表在结构上类似于定义触发器的表（也就是在其中尝试用户操作的表）；这些表用于保存用户操作可能更改的行的旧值或新值。例如，若要检索 deleted 表中的所有值，请使用：
    SELECT *
FROM deleted
  • 如果兼容级别等于 70，那么在 DELETE、INSERT 或 UPDATE 触发器中，SQL Server 将不允许引用 inserted 和 deleted 表中的 text、ntext 或 image 列。不能访问 inserted 和 deleted 表中的 text、ntext 和 image 值。若要在 INSERT 或 UPDATE 触发器中检索新值，请将 inserted 表与原始更新表联接。当兼容级别是 65 或更低时，对 inserted 或 deleted 表中允许空值的text、ntext 或 image 列，将返回空值；如果这些列不可为空，则返回零长度字符串。

    当兼容级别是 80 或更高时，SQL Server 允许在表或视图上通过 INSTEAD OF 触发器更新 text、ntext 或 image 列。

n

是表示触发器中可以包含多条 Transact-SQL 语句的占位符。对于 IF UPDATE (column) 语句，可以通过重复 UPDATE (column) 子句包含多列。

IF UPDATE (column)

测试在指定的列上进行的 INSERT 或 UPDATE 操作，不能用于 DELETE 操作。可以指定多列。因为在 ON 子句中指定了表名，所以在 IF UPDATE 子句中的列名前不要包含表名。若要测试在多个列上进行的 INSERT 或 UPDATE 操作，请在第一个操作后指定单独的 UPDATE(column) 子句。在 INSERT 操作中 IF UPDATE 将返回 TRUE 值，因为这些列插入了显式值或隐性 (NULL) 值。

说明 IF UPDATE (column) 子句的功能等同于 IF、IF...ELSE 或 WHILE 语句，并且可以使用 BEGIN...END 语句块。有关更多信息，请参见控制流语言。

可以在触发器主体中的任意位置使用 UPDATE (column)。

column

是要测试 INSERT 或 UPDATE 操作的列名。该列可以是 SQL Server 支持的任何数据类型。但是，计算列不能用于该环境中。有关更多信息，请参见数据类型。

IF (COLUMNS_UPDATED())

测试是否插入或更新了提及的列，仅用于 INSERT 或 UPDATE 触发器中。COLUMNS_UPDATED 返回 varbinary 位模式，表示插入或更新了表中的哪些列。

COLUMNS_UPDATED 函数以从左到右的顺序返回位，最左边的为最不重要的位。最左边的位表示表中的第一列；向右的下一位表示第二列，依此类推。如果在表上创建的触发器包含 8 列以上，则 COLUMNS_UPDATED 返回多个字节，最左边的为最不重要的字节。在 INSERT 操作中 COLUMNS_UPDATED 将对所有列返回 TRUE 值，因为这些列插入了显式值或隐性 (NULL) 值。

可以在触发器主体中的任意位置使用 COLUMNS_UPDATED。

bitwise_operator

是用于比较运算的位运算符。

updated_bitmask

是整型位掩码，表示实际更新或插入的列。例如，表 t1 包含列 C1、C2、C3、C4 和 C5。假定表 t1 上有 UPDATE 触发器，若要检查列 C2、C3 和 C4 是否都有更新，指定值 14；若要检查是否只有列 C2 有更新，指定值 2。

comparison_operator

是比较运算符。使用等号 (=) 检查 updated_bitmask 中指定的所有列是否都实际进行了更新。使用大于号 (>) 检查 updated_bitmask 中指定的任一列或某些列是否已更新。

column_bitmask

是要检查的列的整型位掩码，用来检查是否已更新或插入了这些列。

注释

触发器常常用于强制业务规则和数据完整性。SQL Server 通过表创建语句（ALTER TABLE 和 CREATE TABLE）提供声明引用完整性 (DRI)；但是 DRI 不提供数据库间的引用完整性。若要强制引用完整性（有关表的主键和外键之间关系的规则），请使用主键和外键约束（ALTER TABLE 和 CREATE TABLE 的 PRIMARY KEY 和 FOREIGN KEY 关键字）。如果触发器表存在约束，则在 INSTEAD OF 触发器执行之后和 AFTER 触发器执行之前检查这些约束。如果违反了约束，则回滚 INSTEAD OF 触发器操作且不执行（激发）AFTER 触发器。

可用 sp_settriggerorder 指定表上第一个和最后一个执行的 AFTER 触发器。在表上只能为每个 INSERT、UPDATE 和 DELETE 操作指定一个第一个执行和一个最后一个执行的 AFTER 触发器。如果同一表上还有其它 AFTER 触发器，则这些触发器将以随机顺序执行。

如果 ALTER TRIGGER 语句更改了第一个或最后一个触发器，则将除去已修改触发器上设置的第一个或最后一个特性，而且必须用 sp_settriggerorder 重置排序值。

只有当触发 SQL 语句（包括所有与更新或删除的对象关联的引用级联操作和约束检查）成功执行后，AFTER 触发器才会执行。AFTER 触发器检查触发语句的运行效果，以及所有由触发语句引起的 UPDATE 和 DELETE 引用级联操作的效果。

触发器限制

CREATE TRIGGER 必须是批处理中的第一条语句，并且只能应用到一个表中。

触发器只能在当前的数据库中创建，不过触发器可以引用当前数据库的外部对象。

如果指定触发器所有者名称以限定触发器，请以相同的方式限定表名。

在同一条 CREATE TRIGGER 语句中，可以为多种用户操作（如 INSERT 和 UPDATE）定义相同的触发器操作。

如果一个表的外键在 DELETE/UPDATE 操作上定义了级联，则不能在该表上定义 INSTEAD OF DELETE/UPDATE 触发器。

在触发器内可以指定任意的 SET 语句。所选择的 SET 选项在触发器执行期间有效，并在触发器执行完后恢复到以前的设置。

与使用存储过程一样，当触发器激发时，将向调用应用程序返回结果。若要避免由于触发器激发而向应用程序返回结果，请不要包含返回结果的 SELECT 语句，也不要包含在触发器中进行变量赋值的语句。包含向用户返回结果的 SELECT 语句或进行变量赋值的语句的触发器需要特殊处理；这些返回的结果必须写入允许修改触发器表的每个应用程序中。如果必须在触发器中进行变量赋值，则应该在触发器的开头使用 SET NOCOUNT 语句以避免返回任何结果集。

DELETE 触发器不能捕获 TRUNCATE TABLE 语句。尽管 TRUNCATE TABLE 语句实际上是没有 WHERE 子句的 DELETE（它删除所有行），但它是无日志记录的，因而不能执行触发器。因为 TRUNCATE TABLE 语句的权限默认授予表所有者且不可转让，所以只有表所有者才需要考虑无意中用 TRUNCATE TABLE 语句规避 DELETE 触发器的问题。

无论有日志记录还是无日志记录，WRITETEXT 语句都不激活触发器。

触发器中不允许以下 Transact-SQL 语句：

ALTER DATABASE | CREATE DATABASE | DISK INIT
DISK RESIZE | DROP DATABASE | LOAD DATABASE
LOAD LOG | RECONFIGURE | RESTORE DATABASE
RESTORE LOG |  |

说明 由于 SQL Server 不支持系统表中的用户定义触发器，因此建议不要在系统表中创建用户定义触发器。

多个触发器

SQL Server 允许为每个数据修改事件（DELETE、INSERT 或 UPDATE）创建多个触发器。例如，如果对已有 UPDATE 触发器的表执行 CREATE TRIGGER FOR UPDATE，则将创建另一个更新触发器。在早期版本中，在每个表上，每个数据修改事件（INSERT、UPDATE 或 DELETE）只允许有一个触发器。

说明 如果触发器名称不同，则 CREATE TRIGGER（兼容级别为 70）的默认行为是在现有的触发器中添加其它触发器。如果触发器名称相同，则 SQL Server 返回一条错误信息。但是，如果兼容级别等于或小于 65，则使用 CREATE TRIGGER 语句创建的新触发器将替换同一类型的任何现有触发器，即使触发器名称不同。有关更多信息，请参见 sp_dbcmptlevel。

递归触发器

当在 sp_dboption 中启用 recursive triggers 设置时，SQL Server 还允许触发器的递归调用。

递归触发器允许发生两种类型的递归：

  • 间接递归

  • 直接递归

使用间接递归时，应用程序更新表 T1，从而激发触发器 TR1，该触发器更新表 T2。在这种情况下，触发器 T2 将激发并更新 T1。

使用直接递归时，应用程序更新表 T1，从而激发触发器 TR1，该触发器更新表 T1。由于表 T1 被更新，触发器 TR1 再次激发，依此类推。

下例既使用了间接触发器递归，又使用了直接触发器递归。假定在表 T1 中定义了两个更新触发器 TR1 和 TR2。触发器 TR1 递归地更新表 T1。UPDATE 语句使 TR1 和 TR2 各执行一次。而 TR1 的执行将触发 TR1（递归）和 TR2 的执行。给定触发器的 inserted 和 deleted 表只包含与唤醒调用触发器的 UPDATE 语句相对应的行。

说明 只有启用 sp_dboption 的 recursive triggers 设置，才会发生上述行为。对于为给定事件定义的多个触发器，并没有确定的执行顺序。每个触发器都应是自包含的。

禁用 recursive triggers 设置只能禁止直接递归。若要也禁用间接递归，请使用 sp_configure 将 nested triggers 服务器选项设置为 0。

如果任一触发器执行了 ROLLBACK TRANSACTION 语句，则无论嵌套级是多少，都不会进一步执行其它触发器。

嵌套触发器

触发器最多可以嵌套 32 层。如果一个触发器更改了包含另一个触发器的表，则第二个触发器将激活，然后该触发器可以再调用第三个触发器，依此类推。如果链中任意一个触发器引发了无限循环，则会超出嵌套级限制，从而导致取消触发器。若要禁用嵌套触发器，请用 sp_configure 将 nested triggers 选项设置为 0（关闭）。默认配置允许嵌套触发器。如果嵌套触发器是关闭的，则也将禁用递归触发器，与 sp_dboption 的 recursive triggers 设置无关。

延迟名称解析

SQL Server 允许 Transact-SQL 存储过程、触发器和批处理引用编译时不存在的表。这种能力称为延迟名称解析。但是，如果 Transact-SQL 存储过程、触发器或批处理引用在存储过程或触发器中定义的表，则只有当兼容级别设置（通过执行 sp_dbcmptlevel 设置）等于 65 时，才会在创建时发出警告。如果使用批处理，则在编译时发出警告。如果引用的表不存在，将在运行时返回错误信息。有关更多信息，请参见延迟名称解析和编译。

权限

CREATE TRIGGER 权限默认授予定义触发器的表所有者、sysadmin 固定服务器角色成员以及 db_owner 和 db_ddladmin 固定数据库角色成员，并且不可转让。

若要检索表或视图中的数据，用户必须在表或视图中拥有 SELECT 语句权限。若要更新表或视图的内容，用户必须在表或视图中拥有 INSERT、DELETE 和 UPDATE 语句权限。

如果视图中存在 INSTEAD OF 触发器，用户必须在该视图中有 INSERT、DELETE 和 UPDATE 特权，以对该视图发出 INSERT、DELETE 和 UPDATE 语句，而不管实际上是否在视图上执行了这样的操作。

示例
A. 使用带有提醒消息的触发器

当有人试图在 titles 表中添加或更改数据时，下例将向客户端显示一条消息。

说明 消息 50009 是 sysmessages 中的用户定义消息。有关创建用户定义消息的更多信息，请参见 sp_addmessage。

USE pubs
IF EXISTS (SELECT name FROM sysobjects
      WHERE name = 'reminder' AND type = 'TR')
   DROP TRIGGER reminder
GO
CREATE TRIGGER reminder
ON titles
FOR INSERT, UPDATE
AS RAISERROR (50009, 16, 10)
GO
B. 使用带有提醒电子邮件的触发器

当 titles 表更改时，下例将电子邮件发送给指定的人员 (MaryM)。

USE pubs
IF EXISTS (SELECT name FROM sysobjects
      WHERE name = 'reminder' AND type = 'TR')
   DROP TRIGGER reminder
GO
CREATE TRIGGER reminder
ON titles
FOR INSERT, UPDATE, DELETE
AS
   EXEC master..xp_sendmail 'MaryM',
      'Don''t forget to print a report for the distributors.'
GO
C. 在 employee 和 jobs 表之间使用触发器业务规则

由于 CHECK 约束只能引用定义了列级或表级约束的列，表间的任何约束（在下例中是指业务规则）都必须定义为触发器。

下例创建一个触发器，当插入或更新雇员工作级别 (job_lvls) 时，该触发器检查指定雇员的工作级别（由此决定薪水）是否处于为该工作定义的范围内。若要获得适当的范围，必须引用 jobs 表。

USE pubs
IF EXISTS (SELECT name FROM sysobjects
      WHERE name = 'employee_insupd' AND type = 'TR')
   DROP TRIGGER employee_insupd
GO
CREATE TRIGGER employee_insupd
ON employee
FOR INSERT, UPDATE
AS
/* Get the range of level for this job type from the jobs table. */
DECLARE @min_lvl tinyint,
   @max_lvl tinyint,
   @emp_lvl tinyint,
   @job_id smallint
SELECT @min_lvl = min_lvl,
   @max_lvl = max_lvl,
   @emp_lvl = i.job_lvl,
   @job_id = i.job_id
FROM employee e INNER JOIN inserted i ON e.emp_id = i.emp_id
   JOIN jobs j ON j.job_id = i.job_id
IF (@job_id = 1) and (@emp_lvl <> 10)
BEGIN
   RAISERROR ('Job id 1 expects the default level of 10.', 16, 1)
   ROLLBACK TRANSACTION
END
ELSE
IF NOT (@emp_lvl BETWEEN @min_lvl AND @max_lvl)
BEGIN
   RAISERROR ('The level for job_id:%d should be between %d and %d.',
      16, 1, @job_id, @min_lvl, @max_lvl)
   ROLLBACK TRANSACTION
END
D. 使用延迟名称解析

下例创建两个触发器以说明延迟名称解析。

USE pubs
IF EXISTS (SELECT name FROM sysobjects
      WHERE name = 'trig1' AND type = 'TR')
   DROP TRIGGER trig1
GO
-- Creating a trigger on a nonexistent table.
CREATE TRIGGER trig1
on authors
FOR INSERT, UPDATE, DELETE
AS
   SELECT a.au_lname, a.au_fname, x.info
   FROM authors a INNER JOIN does_not_exist x
      ON a.au_id = x.au_id
GO
-- Here is the statement to actually see the text of the trigger.
SELECT o.id, c.text
FROM sysobjects o INNER JOIN syscomments c
   ON o.id = c.id
WHERE o.type = 'TR' and o.name = 'trig1'

-- Creating a trigger on an existing table, but with a nonexistent
-- column.
USE pubs
IF EXISTS (SELECT name FROM sysobjects
      WHERE name = 'trig2' AND type = 'TR')
   DROP TRIGGER trig2
GO
CREATE TRIGGER trig2
ON authors
FOR INSERT, UPDATE
AS
   DECLARE @fax varchar(12)
   SELECT @fax = phone
   FROM authors
GO
-- Here is the statement to actually see the text of the trigger.
SELECT o.id, c.text
FROM sysobjects o INNER JOIN syscomments c
   ON o.id = c.id
WHERE o.type = 'TR' and o.name = 'trig2'
E. 使用 COLUMNS_UPDATED

下例创建两个表：一个 employeeData 表和一个 auditEmployeeData 表。人力资源部的成员可以修改 employeeData 表，该表包含敏感的雇员薪水信息。如果更改了雇员的社会保险号码 (SSN)、年薪或银行帐户，则生成审核记录并插入到 auditEmployeeData 审核表。

通过使用 COLUMNS_UPDATED() 功能，可以快速测试对这些包含敏感雇员信息的列所做的更改。只有在试图检测对表中的前 8 列所做的更改时，COLUMNS_UPDATED() 才起作用。

USE pubs
IF EXISTS(SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES
   WHERE TABLE_NAME = 'employeeData')
   DROP TABLE employeeData
IF EXISTS(SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES
   WHERE TABLE_NAME = 'auditEmployeeData')
   DROP TABLE auditEmployeeData
GO
CREATE TABLE employeeData (
   emp_id int NOT NULL,
   emp_bankAccountNumber char (10) NOT NULL,
   emp_salary int NOT NULL,
   emp_SSN char (11) NOT NULL,
   emp_lname nchar (32) NOT NULL,
   emp_fname nchar (32) NOT NULL,
   emp_manager int NOT NULL
   )
GO
CREATE TABLE auditEmployeeData (
   audit_log_id uniqueidentifier DEFAULT NEWID(),
   audit_log_type char (3) NOT NULL,
   audit_emp_id int NOT NULL,
   audit_emp_bankAccountNumber char (10) NULL,
   audit_emp_salary int NULL,
   audit_emp_SSN char (11) NULL,
   audit_user sysname DEFAULT SUSER_SNAME(),
   audit_changed datetime DEFAULT GETDATE()
   )
GO
CREATE TRIGGER updEmployeeData
ON employeeData
FOR update AS
/*Check whether columns 2, 3 or 4 has been updated. If any or all of columns 2, 3 or 4 have been changed, create an audit record. The bitmask is: power(2,(2-1))+power(2,(3-1))+power(2,(4-1)) = 14. To check if all columns 2, 3, and 4 are updated, use = 14 in place of >0 (below).*/

   IF (COLUMNS_UPDATED() & 14) > 0
/*Use IF (COLUMNS_UPDATED() & 14) = 14 to see if all of columns 2, 3, and 4 are updated.*/
      BEGIN
-- Audit OLD record.
      INSERT INTO auditEmployeeData
         (audit_log_type,
         audit_emp_id,
         audit_emp_bankAccountNumber,
         audit_emp_salary,
         audit_emp_SSN)
         SELECT 'OLD',
            del.emp_id,
            del.emp_bankAccountNumber,
            del.emp_salary,
            del.emp_SSN
         FROM deleted del

-- Audit NEW record.
      INSERT INTO auditEmployeeData
         (audit_log_type,
         audit_emp_id,
         audit_emp_bankAccountNumber,
         audit_emp_salary,
         audit_emp_SSN)
         SELECT 'NEW',
            ins.emp_id,
            ins.emp_bankAccountNumber,
            ins.emp_salary,
            ins.emp_SSN
         FROM inserted ins
   END
GO

/*Inserting a new employee does not cause the UPDATE trigger to fire.*/
INSERT INTO employeeData
   VALUES ( 101, 'USA-987-01', 23000, 'R-M53550M', N'Mendel', N'Roland', 32)
GO

/*Updating the employee record for employee number 101 to change the salary to 51000 causes the UPDATE trigger to fire and an audit trail to be produced.*/

UPDATE employeeData
   SET emp_salary = 51000
   WHERE emp_id = 101
GO
SELECT * FROM auditEmployeeData
GO

/*Updating the employee record for employee number 101 to change both the bank account number and social security number (SSN) causes the UPDATE trigger to fire and an audit trail to be produced.*/

UPDATE employeeData
   SET emp_bankAccountNumber = '133146A0', emp_SSN = 'R-M53550M'
   WHERE emp_id = 101
GO
SELECT * FROM auditEmployeeData
GO
F. 使用 COLUMNS_UPDATED 测试 8 列以上

如果必须测试影响到表中前 8 列以外的列的更新时，必须使用 UBSTRING 函数测试由 COLUMNS_UPDATED 返回的适当的位。下例测试影响 Northwind.dbo.Customers 表中的第 3、第 5 或第 9 列的更新。

USE Northwind
DROP TRIGGER  tr1
GO
CREATE TRIGGER tr1 ON Customers
FOR UPDATE AS
   IF ( (SUBSTRING(COLUMNS_UPDATED(),1,1)=power(2,(3-1))
      + power(2,(5-1)))
      AND (SUBSTRING(COLUMNS_UPDATED(),2,1)=power(2,(1-1)))
      )
   PRINT 'Columns 3, 5 and 9 updated'
GO

UPDATE Customers
   SET ContactName=ContactName,
      Address=Address,
      Country=Country
GO

请参见

ALTER TABLE

ALTER TRIGGER

CREATE TABLE

DROP TRIGGER

设计存储过程

sp_depends

sp_help

sp_helptext

sp_rename

sp_settriggerorder

sp_spaceused

使用标识符


CREATE VIEW

创建一个虚拟表，该表以另一种方式表示一个或多个表中的数据。CREATE VIEW 必须是查询批处理中的第一条语句。

语法

CREATE VIEW [ < database_name > .] [ < owner > .] view_name [ ( column [ ,...n ] ) ]
[ WITH < view_attribute > [ ,...n ] ]
AS
select_statement
[ WITH CHECK OPTION ]

< view_attribute > ::=
{ ENCRYPTION | SCHEMABINDING | VIEW_METADATA }

参数

view_name

是视图的名称。视图名称必须符合标识符规则。可以选择是否指定视图所有者名称。

column

是视图中的列名。只有在下列情况下，才必须命名 CREATE VIEW 中的列：当列是从算术表达式、函数或常量派生的，两个或更多的列可能会具有相同的名称（通常是因为联接），视图中的某列被赋予了不同于派生来源列的名称。还可以在 SELECT 语句中指派列名。

如果未指定 column，则视图列将获得与 SELECT 语句中的列相同的名称。

说明 在视图的各列中，列名的权限在 CREATE VIEW 或 ALTER VIEW 语句间均适用，与基础数据源无关。例如，如果在 CREATE VIEW 语句中授予了 title_id 列上的权限，则 ALTER VIEW 语句可以将 title_id 列改名（例如改为 qty），但权限仍与使用 title_id 的视图上的权限相同。

n

是表示可以指定多列的占位符。

AS

是视图要执行的操作。

select_statement

是定义视图的 SELECT 语句。该语句可以使用多个表或其它视图。若要从创建视图的 SELECT 子句所引用的对象中选择，必须具有适当的权限。

视图不必是具体某个表的行和列的简单子集。可以用具有任意复杂性的 SELECT 子句，使用多个表或其它视图来创建视图。

在索引视图定义中，SELECT 语句必须是单个表的语句或带有可选聚合的多表 JOIN。

对于视图定义中的 SELECT 子句有几个限制。CREATE VIEW 语句不能：

  • 包含 COMPUTE 或 COMPUTE BY 子句。

  • 包含 ORDER BY 子句，除非在 SELECT 语句的选择列表中也有一个 TOP 子句。

  • 包含 INTO 关键字。

  • 引用临时表或表变量。

因为 select_statement 使用 SELECT 语句，所以在 FROM 子句中指定 <join_hint> 和 <table_hint> 提示是有效的。有关更多信息，请参见 FROM 和 SELECT。

在 select_statement 中可以使用函数。

select_statement 可使用多个由 UNION 或 UNION ALL 分隔的 SELECT 语句。

WITH CHECK OPTION

强制视图上执行的所有数据修改语句都必须符合由 select_statement 设置的准则。通过视图修改行时，WITH CHECK OPTION 可确保提交修改后，仍可通过视图看到修改的数据。

WITH ENCRYPTION

表示 SQL Server 加密包含 CREATE VIEW 语句文本的系统表列。使用 WITH ENCRYPTION 可防止将视图作为 SQL Server 复制的一部分发布。

SCHEMABINDING

将视图绑定到架构上。指定 SCHEMABINDING 时，select_statement 必须包含所引用的表、视图或用户定义函数的两部分名称 (owner.object)。

不能除去参与用架构绑定子句创建的视图中的表或视图，除非该视图已被除去或更改，不再具有架构绑定。否则，SQL Server 会产生错误。另外，如果对参与具有架构绑定的视图的表执行 ALTER TABLE 语句，而这些语句又会影响该架构绑定视图的定义，则这些语句将会失败。

VIEW_METADATA

指定为引用视图的查询请求浏览模式的元数据时，SQL Server 将向 DBLIB、ODBC 和 OLE DB API 返回有关视图的元数据信息，而不是返回基表或表。浏览模式的元数据是由 SQL Server 向客户端 DB-LIB、ODBC 和 OLE DB API 返回的附加元数据，它允许客户端 API 实现可更新的客户端游标。浏览模式的元数据包含有关结果集内的列所属的基表信息。

对于用 VIEW_METADATA 选项创建的视图，当描述结果集中视图内的列时，浏览模式的元数据返回与基表名相对的视图名。

当用 VIEW_METADATA 创建视图时，如果该视图具有 INSERT 或 UPDATE INSTEAD OF 触发器，则视图的所有列（timestamp 除外）都是可更新的。请参见本主题后面的"可更新视图"。

注释

只能在当前数据库中创建视图。视图最多可以引用 1,024 列。

通过视图进行查询时，Microsoft® SQL Server™ 将检查以确定语句中任意位置引用的所有数据库对象是否都存在，这些对象在语句的上下文中是否有效，以及数据修改语句是否没有违反任何数据完整性规则。如果检查失败，将返回错误信息。如果检查成功，则将操作转换成对基础表的操作。

如果某个视图依赖于已除去的表（或视图），则当有人试图使用该视图时，SQL Server 将产生错误信息。如果创建了新表或视图（该表的结构与以前的基表没有不同之处）以替换除去的表或视图，则视图将再次可用。如果新表或视图的结构发生更改，则必须除去并重新创建该视图。

创建视图时，视图的名称存储在 sysobjects 表中。有关视图中所定义的列的信息添加到 syscolumns 表中，而有关视图相关性的信息添加到 sysdepends 表中。另外，CREATE VIEW 语句的文本添加到 syscomments 表中。这与存储过程相似；当首次执行视图时，只有其查询树存储在过程高速缓存中。每次访问视图时，都重新编译其执行计划。

在通过 numeric 或 float 表达式定义的视图上使用索引所得到的查询结果，可能不同于不在视图上使用索引的类似查询所得到的结果。这种差异可能是由对基础表进行 INSERT、DELETE 或 UPDATE 操作时的舍入错误引起的。

创建视图时，SQL Server 保存 SET QUOTED_IDENTIFIER 和 SET ANSI_NULLS 的设置。使用视图时，将还原这些最初的设置。因此，当访问视图时，将忽略 SET QUOTED_IDENTIFIER 和 SET ANSI_NULLS 的所有客户端会话设置。

说明 SQL Server 是将空字符串解释为单个空格还是真正的空字符串取决于 sp_dbcmptlevel 的设置。如果兼容级别小于或等于 65，SQL Server 就将空字符串解释为单个空格。如果兼容级别等于或大于 70，则 SQL Server 就将空字符串解释为空字符串。有关更多信息，请参见 sp_dbcmptlevel。

可更新视图

Microsoft SQL Server 2000 以两种方法增强可更新视图的类别：

  • INSTEAD OF 触发器：可以在视图上创建 INSTEAD OF 触发器，以使视图可更新。执行 INSTEAD OF 触发器，而不是执行定义触发器的数据修改语句。该触发器使用户得以指定一套处理数据修改语句时需要执行的操作。因此，如果在给定的数据修改语句（INSERT、UPDATE 或 DELETE）上存在视图的 INSTEAD OF 触发器，则通过该语句可更新相应的视图。有关 INSTEAD OF 触发器的更多信息，请参见设计 INSTEAD OF 触发器。

  • 分区视图：如果视图属于称为"分区视图"的指定格式，则该视图的可更新性受限于某些限制。本主题稍后将讨论分区视图及其可更新性。

    必要时，SQL Server 将"本地分区视图"辨别为所有参与表和视图都在同一 SQL Server 上的视图，而将"分布式分区视图"辨别为视图中至少有一个表驻留在不同（远程）服务器上的视图。

如果视图没有 INSTEAD OF 触发器，或者视图不是分区视图，则视图只有满足下列条件才可更新：

  • select_statement 在选择列表中没有聚合函数，也不包含 TOP、GROUP BY、UNION（除非视图是本主题稍后要描述的分区视图）或 DISTINCT 子句。聚合函数可以用在 FROM 子句的子查询中，只要不修改函数返回的值。有关更多信息，请参见聚合函数。

  • select_statement 的选择列表中没有派生列。派生列是由任何非简单列表达式（使用函数、加法或减法运算符等）所构成的结果集列。

  • select_statement 中的 FROM 子句至少引用一个表。select_statement 必须不仅只包含非表格格式的表达式（即不是从表派生出的表达式）。例如，以下视图是不可更新的：
    CREATE VIEW NoTable AS
SELECT GETDATE() AS CurrentDate,
       @@LANGUAGE AS CurrentLanguage,
       CURRENT_USER AS CurrentUser

INSERT、UPDATE 和 DELETE 语句在可以引用可更新视图之前，也必须如上述条件指定的那样满足某些限制条件。只有当视图可更新，并且所编写的 UPDATE 或 INSERT 语句只修改视图的 FROM 子句引用的一个基表中的数据时，UPDATE 和 INSERT 语句才能引用视图。只有当视图在其 FROM 子句中只引用一个表时，DELETE 语句才能引用可更新的视图。

分区视图

分区视图是通过对成员表使用 UNION ALL 所定义的视图，这些成员表的结构相同，但作为多个表分别存储在同一个 SQL Server 中，或存储在称为联合 SQL Server 2000 服务器的自主 SQL Server 2000 服务器组中。

例如，如果使 Customers 表数据分布在分别位于三个服务器上的三个成员表中（Customers_33 在 Server1 上，Customers_66 在 Server2 上，Customers_99 在 Server3 上），将以下面的方法在 Server1 上定义分区视图：

--Partitioned view as defined on Server1
CREATE VIEW Customers
AS
--Select from local member table
SELECT *
FROM CompanyData.dbo.Customers_33
UNION ALL
--Select from member table on Server2
SELECT *
FROM Server2.CompanyData.dbo.Customers_66
UNION ALL
--Select from mmeber table on Server3
SELECT *
FROM Server3.CompanyData.dbo.Customers_99

一般情况下，如果视图为下列格式，则称其为分区视图：

SELECT <select_list1>
FROM T1
UNION ALL
SELECT <select_list2>
FROM T2
UNION ALL
...
SELECT <select_listn>
FROM Tn

分区视图的创建条件

  1. SELECT 列表
    • 成员表中的所有列应在视图定义的列列表中被选定。

    • 每个 select_list 中的同一序号位置上的列应属于同一类型，包括排序规则。列仅仅属于隐性可转换类型（如 UNION 的通常情况下）是不够的。

      另外，at least one 列（例如 <col>）必须以相同的序号位置出现在所有 SELECT 列表中。应这样定义 <col>：使成员表 T1，...，Tn 在 <col> 上分别定义 CHECK 约束 C1，...，Cn。

      必须以下面的格式在表 T1 上定义约束 C1：

      C1 ::= < simple_interval > [ OR < simple_interval > OR ...]
< simple_interval > :: =
    < col > { < | > | <= | >= | = }
    | < col > BETWEEN < value1 > AND < value2 >
    | < col > IN ( value_list )
    | < col > { > | >= } < value1 > AND
        < col > { < | <= } < value2 >
    • 约束应使 <col> 的任何给定值都能满足约束 C1，...，Cn 的 at most one，这样，约束应形成一套不连接的或非重叠的间隔。定义不连接的约束的列 <col> 称为"分区列"。请注意分区列在基础表中可能有不同的名称。约束应处于"已启用"状态，以使它们满足分区列的上述条件。如果禁用了约束，则请使用 ALTER TABLE 的 WITH CHECK 选项或 CHECK constraint_name 选项重新启用约束检查。

      下面是有效约束集的示例：

      { [col < 10], [col between 11 and 20] , [col > 20] }
{ [col between 11 and 20], [col between 21 and 30], [col between 31 and 100] }
    • 在 SELECT 列表中不能多次使用同一列。
  2. 分区列
    • 分区列是表的 PRIMARY KEY 的一部分。

    • 不能是计算列。

    • 如果成员表中的同一列上存在多个约束，则 SQL Server 忽略所有约束且在确定视图是否为分区视图时不考虑这些约束。为满足分区视图的条件，在分区列上应只有一个分区约束。
  3. 成员表（或基础表 T1，...，Tn）
    • 表可以是本地表，也可以是通过由四部分构成的名称或基于 OPENDATASOURCE 或 OPENROWSET 的名称引用的其它 SQL Server 中的表。（OPENDATASOURCE 和 OPENROWSET 语法可以指定表名，但不能指定直接传递查询。）有关更多信息，请参见 OPENDATASOURCE 和 OPENROWSET。

      如果一个或多个成员表是远程表，则视图称为 distributed partitioned view，并且适用附加条件。本节稍后将对其进行讨论。

    • 在用 UNION ALL 语句组合的表集中，同一个表不能出现两次。

    • 成员表不能在表中的计算列上创建索引。

    • 成员表在数目相同的列上应具有所有 PRIMARY KEY 约束。

    • 视图中的所有成员表应有相同的 ANSI 填充设置（使用 sp_configure 中 user options 选项或 SET 选项设置）。

修改分区视图的条件

只有 SQL Server 2000 开发版和企业版允许在分区视图中进行 INSERT、UPDATE 和 DELETE 操作。若要修改分区视图，语句必须满足下列条件：

  • INSERT 语句必须为视图中所有的列提供值，即使基础成员表具有这些列的 DEFAULT 约束或即使它们允许 NULL。对于这些具有 DEFAULT 定义的成员表列，这些语句无法显式地使用关键字 DEFAULT。

  • 插入到分区列中的值应至少满足一个基础约束；否则，INSERT 操作将因违反约束而失败。

  • 即使列中含有在相应成员表中定义的 DEFAULT 值，UPDATE 语句也不能指定 DEFAULT 关键字作为 SET 子句中的值。

  • 如果成员表中有 text、ntext 或 image 列，则 PRIMARY KEY 列无法通过 UPDATE 语句进行修改。

  • 不能通过 INSERT 或 UPDATE 语句修改视图中作为一个或多个成员表中的 IDENTITY 列的列。

  • 如果其中的一个成员表包含 timestamp 列，则不能通过 INSERT 或 UPDATE 语句修改视图。

  • 如果分区视图或针对该视图的 INSERT、UPDATE 和 DELETE语句中的任何一个成员表具有内联接，则不允许使用这些语句。

    说明 若要更新分区视图，用户在成员表上必须具有 INSERT、UPDATE 和 DELETE 权限。

分布式分区视图的附加条件

对于分布式分区视图（当一个或多个成员表为远程表时），适用下列附加条件：

  • 将启动分布式事务以确保更新所影响的所有节点间的原子性。

  • 应将 XACT_ABORT SET 选项设置为 ON，以使 INSERT、UPDATE 或 DELETE 语句生效。

  • 在分区视图引用的远程表中的任何 smallmoney 和 smalldatetime 列分别映射为 money 和 datetime。因此，本地表中相应的列（选择列表中的相同序号位置）应为 money 和 datetime。

  • 分区视图中的任何链接服务器都不能是环回链接服务器（指向同一 SQL Server 的链接服务器）。

对于涉及可更新分区视图和远程表的 INSERT、UPDATE 和 DELETE 操作，忽略 SET ROWCOUNT 选项的设置。

当设置好成员表和分区视图的定义后，Microsoft SQL Server 2000 将生成智能的查询计划以便有效地访问成员表中的数据。通过使用 CHECK 约束定义，查询处理器在成员间映射键值的分布。当用户发出查询时，查询处理器将映射与 WHERE 子句中指定的值进行比较，然后生成使成员服务器间的数据传输量减到最少的执行计划。因此，虽然有些成员表可能位于远程服务器中，但是 SQL Server 2000 将解析分布式查询，使得必须传输的分布式数据量减到最少。有关 SQL Server 2000 如何解析分区视图查询的更多信息，请参见解析分布式分区视图。

复制的考虑事项

为在复制所包含的成员表上创建分区视图，需要考虑下列事项：

  • 如果在更新订阅服务器时基础表包含在合并复制或事务复制中，则唯一标识符列也应包含在 SELECT 列表中。

  • 对分区视图进行的任何 INSERT 操作都必须对唯一标识符列提供 NEWID() 值。对唯一标识符列的任何 UPDATE 操作都必须提供 NEWID() 作为该值，因为无法使用 DEFAULT 关键字。

  • 通过视图对更新所做的复制与在两个不同的数据库之间复制表时完全相同；也就是说，这些表服务于不同的复制代理程序，而且不保证更新的顺序。
权限

CREATE VIEW 权限默认授予 db_owner 和 db_ddladmin 固定数据库角色成员。sysadmin 固定服务器角色成员和 db_owner 固定数据库角色成员可以将 CREATE VIEW 权限转让给其他用户。

若要创建视图，用户必须具有 CREATE VIEW 权限，还必须在视图所引用的表、视图和表值函数上具有 SELECT 权限，在视图所唤醒调用的标量值函数上具有 EXECUTE 权限。

另外，若要创建 WITH SCHEMABINDING 视图，用户必须在每个引用的表、视图和用户定义函数上具有 REFERENCES 权限。

示例
A. 使用简单的 CREATE VIEW

下例创建具有简单 SELECT 语句的视图。当需要频繁地查询列的某种组合时，简单视图非常有用。

USE pubs
IF EXISTS (SELECT TABLE_NAME FROM INFORMATION_SCHEMA.VIEWS
      WHERE TABLE_NAME = 'titles_view')
   DROP VIEW titles_view
GO
CREATE VIEW titles_view
AS
SELECT title, type, price, pubdate
FROM titles
GO
B. 使用 WITH ENCRYPTION

下例使用 WITH ENCRYPTION 选项并显示计算列、重命名列以及多列。

USE pubs
IF EXISTS (SELECT TABLE_NAME FROM INFORMATION_SCHEMA.VIEWS
      WHERE TABLE_NAME = 'accounts')
   DROP VIEW accounts
GO
CREATE VIEW accounts (title, advance, amt_due)
WITH ENCRYPTION
AS
SELECT title, advance, price * royalty * ytd_sales
FROM titles
WHERE price > $5
GO

下面是用来检索加密存储过程的标识号和文本的查询：

USE pubs
GO
SELECT c.id, c.text
FROM syscomments c, sysobjects o
WHERE c.id = o.id and o.name = 'accounts'
GO

下面是结果集：

说明 text 列的输出显示在单独一行中。执行该存储过程时，下列信息将与 id 列信息出现在同一行中。

id          text
----------- ------------------------------------------------------------
661577395
???????????????????????????????????????????????????????????????????????...

(1 row(s) affected)
C. 使用 WITH CHECK OPTION

下例显示名为 CAonly 的视图，该视图使得只对加利福尼亚州的作者应用数据修改。

USE pubs
IF EXISTS (SELECT TABLE_NAME FROM INFORMATION_SCHEMA.VIEWS
      WHERE TABLE_NAME = 'CAonly')
   DROP VIEW CAonly
GO
CREATE VIEW CAonly
AS
SELECT au_lname, au_fname, city, state
FROM authors
WHERE state = 'CA'
WITH CHECK OPTION
GO
D. 在视图中使用内置函数

下例显示包含内置函数的视图定义。使用函数时，必须在 CREATE VIEW 语句中为派生列指定列名。

USE pubs
IF EXISTS (SELECT TABLE_NAME FROM INFORMATION_SCHEMA.VIEWS
      WHERE TABLE_NAME = 'categories')
   DROP VIEW categories
GO
CREATE VIEW categories (category, average_price)
AS
SELECT type, AVG(price)
FROM titles
GROUP BY type
GO
E. 在视图中使用 @@ROWCOUNT 函数

下例使用 @@ROWCOUNT 函数作为视图定义的一部分。

USE pubs
IF EXISTS (SELECT TABLE_NAME FROM INFORMATION_SCHEMA.VIEWS
      WHERE TABLE_NAME = 'myview')
   DROP VIEW myview
GO
CREATE VIEW myview
AS
   SELECT au_lname, au_fname, @@ROWCOUNT AS bar
   FROM authors
   WHERE state = 'UT'
GO
SELECT *
FROM myview
F. 使用分区数据

下例使用名为 SUPPLY1、SUPPLY2、SUPPLY3 和 SUPPLY4 的表，这些表对应于位于不同国家的四个办事处的供应商表。

--create the tables and insert the values
CREATE TABLE SUPPLY1 (
   supplyID INT PRIMARY KEY CHECK (supplyID BETWEEN 1 and 150),
   supplier CHAR(50)
   )
CREATE TABLE SUPPLY2 (
   supplyID INT PRIMARY KEY CHECK (supplyID BETWEEN 151 and 300),
   supplier CHAR(50)
   )
CREATE TABLE SUPPLY3 (
   supplyID INT PRIMARY KEY CHECK (supplyID BETWEEN 301 and 450),
   supplier CHAR(50)
   )
CREATE TABLE SUPPLY4 (
   supplyID INT PRIMARY KEY CHECK (supplyID BETWEEN 451 and 600),
   supplier CHAR(50)
   )
INSERT SUPPLY1 VALUES ('1', 'CaliforniaCorp')
INSERT SUPPLY1 VALUES ('5', 'BraziliaLtd')
INSERT SUPPLY2 VALUES ('231', 'FarEast')
INSERT SUPPLY2 VALUES ('280', 'NZ')
INSERT SUPPLY3 VALUES ('321', 'EuroGroup')
INSERT SUPPLY3 VALUES ('442', 'UKArchip')
INSERT SUPPLY4 VALUES ('475', 'India')
INSERT SUPPLY4 VALUES ('521', 'Afrique')

--create the view that combines all supplier tables
CREATE VIEW all_supplier_view
AS
SELECT *
FROM SUPPLY1
   UNION ALL
SELECT *
FROM SUPPLY2
   UNION ALL
SELECT *
FROM SUPPLY3
   UNION ALL
SELECT *
FROM SUPPLY4

请参见

ALTER TABLE

ALTER VIEW

DELETE

DROP VIEW

INSERT

设计存储过程

sp_depends

sp_help

sp_helptext

sp_rename

系统表

UPDATE

使用标识符

使用分区视图


CURRENT_TIMESTAMP

返回当前的日期和时间。此函数等价于 GETDATE()。

语法

CURRENT_TIMESTAMP

返回类型

datetime

示例
A. 使用 CURRENT_TIMESTAMP 返回当前的日期和时间

下面的示例返回 CURRENT_TIMESTAMP 的值和一个文本描述。

SELECT 'The current time is: '+ CONVERT(char(30), CURRENT_TIMESTAMP)

下面是结果集：

---------------------------------------------------
The current time is: Feb 24 1998  3:45PM

(1 row(s) affected)
B. 将 CURRENT_TIMESTAMP 用作 DEFAULT 约束

下面的示例创建一个表，该表针对销售行的 sales_date 列将 CURRENT_TIMESTAMP 用作 DEFAULT 约束。

USE pubs
GO
CREATE TABLE sales2
(
 sales_id int IDENTITY(10000, 1) NOT NULL,
 cust_id  int NOT NULL,
 sales_date datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
 sales_amt money NOT NULL,
 delivery_date datetime NOT NULL DEFAULT DATEADD(dd, 10, GETDATE())
)
GO
INSERT sales2 (cust_id, sales_amt)
   VALUES (20000, 550)

下面的查询从 sales2 表中选择所有信息。

USE pubs
GO
SELECT *
FROM sales2
GO

下面是结果集：

sales_id    cust_id    sales_date          sales_amt delivery_date
----------- ---------- ------------------- --------- -------------------
10000       20000      Mar 4 1998 10:06AM  550.00    Mar 14 1998 10:06AM

(1 row(s) affected)

请参见

ALTER TABLE

CREATE TABLE

系统函数


CURRENT_USER

返回当前的用户。此函数等价于 USER_NAME()。

语法

CURRENT_USER

返回类型

sysname

示例
A. 使用 CURRENT_USER 返回当前的用户名

下面的示例将一个变量声明为 char，并将 CURRENT_USER 的当前值指派给它，然后返回该变量，返回时还带有一个文本描述。

SELECT 'The current user is: '+ convert(char(30), CURRENT_USER)

下面是结果集：

---------------------------------------------------
The current user is: dbo

(1 row(s) affected)
B. 将 CURRENT_USER 用作 DEFAULT 约束

下面的示例创建一个表，该表针对销售行的 order_person 列将 CURRENT_USER 用作 DEFAULT 约束。

USE pubs
IF EXISTS (SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES
      WHERE TABLE_NAME = 'orders2')
   DROP TABLE orders2
GO
SET NOCOUNT ON
CREATE TABLE orders2
(
 order_id int IDENTITY(1000, 1) NOT NULL,
 cust_id  int NOT NULL,
 order_date datetime NOT NULL DEFAULT GETDATE(),
 order_amt money NOT NULL,
 order_person char(30) NOT NULL DEFAULT CURRENT_USER
)
GO
INSERT orders2 (cust_id, order_amt)
VALUES (5105, 577.95)
GO
SET NOCOUNT OFF

下面的查询从 orders2 表中选择所有信息。

SELECT *
FROM orders2

下面是结果集：

order_id    cust_id     order_date             order_amt    order_person
----------- ----------- ------------------- ------------- --------------
1000        5105        Mar 4 1998 10:13AM      577.95           dbo

(1 row(s) affected)

请参见

ALTER TABLE

CREATE TABLE

系统函数


cursor

这是变量或存储过程 OUTPUT 参数的一种数据类型，这些参数包含对游标的引用。使用 cursor 数据类型创建的变量可以为空。

有些操作可以引用那些带有 cursor 数据类型的变量和参数，这些操作包括：

  • DECLARE @local_variable 和 SET @local_variable 语句。

  • OPEN、FETCH、CLOSE 及 DEALLOCATE 游标语句。

  • 存储过程输出参数。

  • CURSOR_STATUS 函数。

  • sp_cursor_list、sp_describe_cursor、sp_describe_cursor_tables 以及 sp_describe_cursor_columns 系统存储过程。

重要 对于 CREATE TABLE 语句中的列，不能使用 cursor 数据类型。

请参见

CAST 和 CONVERT

CURSOR_STATUS

数据类型转换

数据类型

DECLARE CURSOR

DECLARE @local_variable

SET @local_variable


CURSOR_STATUS

这是一个标量函数，该函数允许存储过程的调用方确定针对一个给定参数，该过程是否返回游标和结果集。

语法

CURSOR_STATUS
(
{ 'local' , 'cursor_name' }
| { 'global' , 'cursor_name' }
| { 'variable' , 'cursor_variable' }
    )

参数

'local'

指定一个常量，该常量表明游标的源是一个本地游标名。

'cursor_name'

游标名。游标名必须符合标识符的规则。

'global'

指定一个常量，该常量表明游标的源是一个全局游标名。

'variable'

指定一个常量，该常量表明游标的源是一个本地变量。

'cursor_variable'

游标变量的名称。必须使用 cursor 数据类型定义游标变量。

返回类型

smallint

返回值 | 游标名 | 游标变量
1 | 游标的结果集至少有一行，并且： 对于不感知游标和键集游标，结果集至少有一行。 对于动态游标，结果集可以有零行、一行或多行。 | 分配给该变量的游标已经打开，并且： 对于不感知游标和键集游标，结果集至少有一行。 对于动态游标，结果集可以有零行、一行或多行。
0 | 游标的结果集为空。* | 分配给该变量的游标已经打开，然而结果集肯定为空。*
-1 | 游标被关闭。 | 分配给该变量的游标被关闭。
-2 | 不可用。 | 可以是： 先前调用的过程并没有将游标指派给 OUTPUT 变量。 先前调用的过程给 OUTPUT 变量指派了游标，然而在过程结束时，游标处于关闭状态。因此，游标被释放，并且没有返回给调用过程。 没有将游标指派给已声明的游标变量。
-3 | 带有指定名称的游标不存在。 | 带有指定名称的游标变量并不存在，或者即使存在这样一个游标变量，但并没有给它分配游标。

* 动态游标从不返回这个结果。

示例

下面的示例创建一个名为 lake_list 的过程，并将执行 lake_list 的输出结果用作 CURSOR_STATUS 的检验。

说明 本示例依赖于一个名为 check_authority 的过程，该过程尚未创建。

USE pubs
IF EXISTS (SELECT name FROM sysobjects
      WHERE name = 'lake_list' AND type = 'P')
   DROP PROCEDURE lake_list
GO
CREATE PROCEDURE lake_list
   ( @region varchar(30),
     @size integer,
     @lake_list_cursor CURSOR VARYING OUTPUT )
AS
BEGIN
   DECLARE @ok SMALLINT
   EXECUTE check_authority @region, username, @ok OUTPUT
   IF @ok = 1
      BEGIN
      SET @lake_list_cursor =CURSOR LOCAL SCROLL FOR
         SELECT name, lat, long, size, boat_launch, cost
         FROM lake_inventory
         WHERE locale = @region AND area >= @size
         ORDER BY name
      OPEN @lake_list_cursor
      END
END
DECLARE @my_lakes_cursor CURSOR
DECLARE @my_region char(30)
SET @my_region = 'Northern Ontario'
EXECUTE lake_list @my_region, 500, @my_lakes_cursor OUTPUT
IF Cursor_Status('variable', '@my_lakes_cursor') <= 0
   BEGIN
   /* Some code to tell the user that there is no list of
   lakes for him/her */
   END
ELSE
   BEGIN
      FETCH @my_lakes_cursor INTO -- Destination here
      -- Continue with other code here.
END

请参见

游标函数

数据类型

使用标识符


DATABASEPROPERTY

返回给定数据库和属性名的命名数据库属性值。

重要 使用 Microsoft® SQL Server™ 2000 函数 DATABASEPROPERTYEX 获得有关数据库选项的当前设置或指定数据库属性的信息。提供 DATABASEPROPERTY 函数是为了向后兼容。

语法

DATABASEPROPERTY( database , property )

参数

database

是包含有数据库名的表达式，返回此数据库的命名属性信息。database 是 nvarchar(128)。

property

是一个表达式，包含将要返回的数据库属性的名称。property 的数据类型为 varchar(128)，可以是下列值中的一个。

Value | 描述 | 返回的值
IsAnsiNullDefault | 数据库遵循 SQL-92 规则，允许空值。 | 1 = TRUE 0 = FALSE NULL = 无效的输入
IsAnsiNullsEnabled | 所有与空值的比较取值为未知。 | 1 = TRUE 0 = FALSE NULL = 无效的输入
IsAnsiWarningsEnabled | 当标准错误条件发生时，发出错误或警告消息。 | 1 = TRUE 0 = FALSE NULL = 无效的输入
IsAutoClose | 数据库在最后一位用户退出后完全关闭并释放资源。 | 1 = TRUE 0 = FALSE NULL = 无效的输入
IsAutoCreateStatistics | 当因表中数据改变造成统计过期时，自动更新当前统计。 | 1 = TRUE 0 = FALSE NULL = 无效的输入
IsAutoShrink | 数据库文件可以自动定期收缩。 | 1 = TRUE 0 = FALSE NULL = 无效的输入
IsAutoUpdateStatistics | 启用自动更新统计数据库选项。 | 1 = TRUE 0 = FALSE NULL = 无效的输入
IsBulkCopy | 数据库允许无日志记录的操作。 | 1 = TRUE 0 = FALSE NULL = 无效的输入
IsCloseCursorsOnCommitEnabled | 关闭在提交事务时打开的游标。 | 1 = TRUE 0 = FALSE NULL = 无效的输入
IsDboOnly | 数据库处于仅 DBO 访问模式。 | 1 = TRUE 0 = FALSE NULL = 无效的输入
IsDetached | 分离操作分离了数据库。 | 1 = TRUE 0 = FALSE NULL = 无效的输入
IsEmergencyMode | 启用紧急模式，允许使用可疑数据库。 | 1 = TRUE 0 = FALSE NULL = 无效的输入
IsFulltextEnabled | 数据库是全文启用。 | 1 = TRUE 0 = FALSE NULL = 无效的输入
IsInLoad | 正在装载数据库。 | 1 = TRUE 0 = FALSE NULL = 无效的输入
IsInRecovery | 正在恢复数据库。 | 1 = TRUE 0 = FALSE NULL1 = 无效的输入
IsInStandBy | 数据库以只读方式联机，并允许还原日志。 | 1 = TRUE 0 = FALSE NULL = 无效的输入
IsLocalCursorsDefault | 游标声明默认为 LOCAL。 | 1 = TRUE 0 = FALSE NULL = 无效的输入
IsNotRecovered | 数据库不能恢复。 | 1 = TRUE 0 = FALSE NULL = 无效的输入
IsNullConcat | 空串联操作数产生 NULL。 | 1 = TRUE 0 = FALSE NULL = 无效的输入
IsOffline | 数据库脱机。 | 1 = TRUE 0 = FALSE NULL = 无效的输入
IsQuotedIdentifiersEnabled | 双引号可用于标识符。 | 1 = TRUE 0 = FALSE NULL = 无效的输入
IsReadOnly | 数据库处于只读访问模式。 | 1 = TRUE 0 = FALSE NULL = 无效的输入
IsRecursiveTriggersEnabled | 启用触发器循环启动。 | 1 = TRUE 0 = FALSE NULL = 无效的输入
IsShutDown | 数据库启动时遇到问题。 | 1 = TRUE 0 = FALSE NULL1 = 无效的输入
IsSingleUser | 数据库处于单用户访问模式。 | 1 = TRUE 0 = FALSE NULL = 无效的输入
IsSuspect | 数据库可疑。 | 1 = TRUE 0 = FALSE NULL = 无效的输入
IsTruncLog | 数据库截断其登录检查点。 | 1 = TRUE 0 = FALSE NULL = 无效的输入
Version | 创建数据库时所使用的 Microsoft® SQL Server™ 代码的内部版本号。仅供 SQL Server 工具在内部用于升级处理。 | Version number = 数据库打开 NULL = 数据库关闭

1. 如果从未启动数据库，或者已经自动关闭数据库，则返回值也为 NULL。

返回类型

integer

示例

此示例返回 master 数据库 IsTruncLog 属性的设置。

USE master
SELECT DATABASEPROPERTY('master', 'IsTruncLog')

下面是结果集：

-------------------
1

请参见

控制流语言

DATABASEPROPERTYEX

DELETE

INSERT

元数据函数

SELECT

sp_dboption

UPDATE

WHERE


DATABASEPROPERTYEX

返回指定数据库的指定数据库选项或属性的当前设置。

语法

DATABASEPROPERTYEX( database , property )

参数

database

是取值为数据库名的表达式，将返回此数据库的属性设置。database 是 nvarchar(128)。

property

是表明应返回的选项或属性设置的表达式。property 是 nvarchar(128)，并可以是下列值之一。

值 | 描述 | 返回的值
Collation | 数据库默认排序规则名。 | 排序规则名
IsAnsiNullDefault | 数据库遵循 SQL-92 规则，允许空值。 | 1 = TRUE 0 = FALSE NULL = 无效的输入
IsAnsiNullsEnabled | 所有与空值的比较取值为未知。 | 1 = TRUE 0 = FALSE NULL = 无效的输入
IsAnsiPaddingEnabled | 在比较或插入前，填充字符串至相同长度。 | 1 = TRUE 0 = FALSE NULL = 无效的输入
IsAnsiWarningsEnabled | 当标准错误条件发生时，发出错误或警告消息。 | 1 = TRUE 0 = FALSE NULL = 无效的输入
IsArithmeticAbortEnabled | 当在查询执行中发生溢出或被零除的错误时终止查询。 | 1 = TRUE 0 = FALSE NULL = 无效的输入
IsAutoClose | 数据库在最后一位用户退出后完全关闭并释放资源。 | 1 = TRUE 0 = FALSE NULL = 无效的输入
IsAutoCreateStatistics | 当因表中数据改变造成统计过期时，自动更新当前统计。 | 1 = TRUE 0 = FALSE NULL = 无效的输入
IsAutoShrink | 数据库文件可以自动定期收缩。 | 1 = TRUE 0 = FALSE NULL = 无效的输入
IsAutoUpdateStatistics | 启用自动更新统计数据库选项。 | 1 = TRUE 0 = FALSE NULL = 无效的输入
IsCloseCursorsOnCommitEnabled | 关闭在提交事务时打开的游标。 | 1 = TRUE 0 = FALSE NULL = 无效的输入
IsFulltextEnabled | 数据库是全文启用。 | 1 = TRUE 0 = FALSE NULL = 无效的输入
IsInStandBy | 数据库以只读方式联机，并允许还原日志。 | 1 = TRUE 0 = FALSE NULL = 无效的输入
IsLocalCursorsDefault | 游标声明默认为 LOCAL。 | 1 = TRUE 0 = FALSE NULL = 无效的输入
IsMergePublished | 如果安装了复制，可以发布数据库表供复制。 | 1 = TRUE 0 = FALSE NULL = 无效的输入
IsNullConcat | 空串联操作数产生 NULL。 | 1 = TRUE 0 = FALSE NULL = 无效的输入
IsNumericRoundAbortEnabled | 当表达式中没有精度时产生错误。 | 1 = TRUE 0 = FALSE NULL = 无效的输入
IsQuotedIdentifiersEnabled | 双引号可用于标识符。 | 1 = TRUE 0 = FALSE NULL = 无效的输入
IsRecursiveTriggersEnabled | 启用触发器循环启动。 | 1 = TRUE 0 = FALSE NULL = 无效的输入
IsSubscribed | 可以订阅数据库来发布。 | 1 = TRUE 0 = FALSE NULL = 无效的输入
IsTornPageDetectionEnabled | Microsoft® SQL Server™ 检测因电力故障或其它系统故障造成的不完全 I/O 操作。 | 1 = TRUE 0 = FALSE NULL = 无效的输入
Recovery | 数据库的恢复模型。 | FULL = 完全恢复模型 BULK_LOGGED = 大量记录日志模型 SIMPLE = 简单恢复模型
SQLSortOrder | SQL Server 早期版本支持的 SQL Server 排序次序 ID。 | 0 = 数据库正使用 Windows 排序规则 >0 = SQL Server 排序次序 ID
Status | 数据库状态。 | ONLINE = 数据库可供查询 OFFLINE = 数据库已明确地脱机 RESTORING = 正在还原数据库 RECOVERING = 正在恢复数据库，还不能查询 SUSPECT = 不能恢复数据库
Updateability | 表明是否可以修改数据。 | READ_ONLY = 数据可读，但不可修改 READ_WRITE = 数据可读并可修改
UserAccess | 表明哪个用户可以访问数据库。 | SINGLE_USER = 每次仅一个 db_owner, dbcreator, 或 sysadmin 用户 RESTRICTED_USER = 仅 db_owner, dbcreator, 和 sysadmin 角色成员 MULTI_USER = 所有用户
Version | 创建数据库时使用的 Microsoft SQL Server 代码内部版本号。仅供 SQL Server 工具在内部用于升级处理。 | Version number = 数据库打开 NULL = 数据库关闭

返回类型

sql_variant

注释

此函数一次只返回一个属性设置。

DATABASEPROPERTY 支持向后兼容性，但不提供此版本中添加的属性信息。另外，DATABASEPROPERTYEX中新的属性已经替换了 DATABASEPROPERTY 支持的许多属性。

示例
A. 检索 autoshrink 数据库选项的状态

此示例返回 Northwind 数据库的 autoshrink 数据库选项的状态。

SELECT DATABASEPROPERTYEX('Northwind', 'IsAutoShrink')

下面是结果集（表明 autoshrink 关闭）：

------------------
0
B. 检索数据库默认排序规则

此示例返回 Northwind 数据库默认排序规则名。

SELECT DATABASEPROPERTYEX('Northwind', 'Collation')

下面是结果集：

------------------------------
SQL_Latin1_General_CP1_CS_AS

请参见

ALTER DATABASE

COLLATE


DATALENGTH

返回任何表达式所占用的字节数。

语法

DATALENGTH ( expression )

参数

expression

任何类型的表达式。

返回类型

int

注释

DATALENGTH 对 varchar、varbinary、text、image、nvarchar 和 ntext 数据类型特别有用，因为这些数据类型可以存储可变长度数据。

NULL 的 DATALENGTH 的结果是 NULL。

说明 兼容级别可能影响返回值。有关兼容级别的更多信息，请参见 sp_dbcmptlevel。

示例

此示例查找 publishers 表中 pub_name 列的长度。

USE pubs
GO
SELECT length = DATALENGTH(pub_name), pub_name
FROM publishers
ORDER BY pub_name
GO

下面是结果集：

length      pub_name
----------- ----------------------------------------
20          Algodata Infosystems
16          Binnet & Hardley
21          Five Lakes Publishing
5           GGG&G
18          Lucerne Publishing
14          New Moon Books
17          Ramona Publishers
14          Scootney Books

(8 row(s) affected)

请参见

CAST 和 CONVERT

数据类型

系统函数


DATEADD

在向指定日期加上一段时间的基础上，返回新的 datetime 值。

语法

DATEADD ( datepart , number, date )

参数

datepart

是规定应向日期的哪一部分返回新值的参数。下表列出了 Microsoft® SQL Server™ 识别的日期部分和缩写。

日期部分 | 缩写
Year | yy, yyyy
quarter | qq, q
Month | mm, m
dayofyear | dy, y
Day | dd, d
Week | wk, ww
Hour | hh
minute | mi, n
second | ss, s
millisecond | ms

number

是用来增加 datepart 的值。如果指定一个不是整数的值，则将废弃此值的小数部分。例如，如果为 datepart 指定 day，为 number 指定 1.75，则 date 将增加 1。

date

是返回 datetime 或 smalldatetime 值或日期格式字符串的表达式。有关指定日期的更多信息，请参见 datetime 和 smalldatetime。

如果您只指定年份的最后两位数字，则小于或等于"两位数年份截止期"配置选项的值的最后两位数字的数字所在世纪与截止年所在世纪相同。大于该选项的值的最后两位数字的数字所在世纪为截止年所在世纪的前一个世纪。例如，如果 two digit year cutoff 为 2049（默认），则 49 被解释为 2049，2050 被解释为 1950。为避免模糊，请使用四位数的年份。

返回类型

返回 datetime，但如果 date 参数是 smalldatetime，返回 smalldatetime。

示例

此示例打印出 pubs 数据库中标题的时间结构的列表。此时间结构表示当前发布日期加上 21 天。

USE pubs
GO
SELECT DATEADD(day, 21, pubdate) AS timeframe
FROM titles
GO

下面是结果集：

timeframe
---------------------------
Jul 3 1991 12:00AM
Jun 30 1991 12:00AM
Jul 21 1991 12:00AM
Jul 13 1991 12:00AM
Jun 30 1991 12:00AM
Jul 9 1991 12:00AM
Mar 14 1997  5:09PM
Jul 21 1991 12:00AM
Jul 3 1994 12:00AM
Mar 14 1997  5:09PM
Nov 11 1991 12:00AM
Jul 6 1991 12:00AM
Oct 26 1991 12:00AM
Jul 3 1991 12:00AM
Jul 3 1991 12:00AM
Nov 11 1991 12:00AM
Jul 3 1991 12:00AM
Jul 3 1991 12:00AM

(18 row(s) affected)

请参见

CAST 和 CONVERT

数据类型

日期和时间函数

时间格式


DATEDIFF

返回跨两个指定日期的日期和时间边界数。

语法

DATEDIFF ( datepart , startdate , enddate )

参数

datepart

是规定了应在日期的哪一部分计算差额的参数。下表列出了 Microsoft® SQL Server™ 识别的日期部分和缩写。

日期部分 | 缩写
year | yy, yyyy
quarter | qq, q
Month | mm, m
dayofyear | dy, y
Day | dd, d
Week | wk, ww
Hour | hh
minute | mi, n
second | ss, s
millisecond | ms

startdate

是计算的开始日期。startdate 是返回 datetime 或 smalldatetime 值或日期格式字符串的表达式。

因为 smalldatetime 只精确到分钟，所以当用 smalldatetime 值时，秒和毫秒总是 0。

如果您只指定年份的最后两位数字，则小于或等于"两位数年份截止期"配置选项的值的最后两位数字的数字所在世纪与截止年所在世纪相同。大于该选项的值的最后两位数字的数字所在世纪为截止年所在世纪的前一个世纪。例如，如果 two digit year cutoff 为 2049（默认），则 49 被解释为 2049，2050 被解释为 1950。为避免模糊，请使用四位数的年份。

有关时间值指定的更多信息，请参见时间格式。有关日期指定的更多信息，请参见 datetime 和 smalldatetime。

enddate

是计算的终止日期。enddate 是返回 datetime 或 smalldatetime 值或日期格式字符串的表达式。

返回类型

integer

注释

startdate 是从 enddate 减去。如果 startdate 比 enddate 晚，返回负值。

当结果超出整数值范围，DATEDIFF 产生错误。对于毫秒，最大数是 24 天 20 小时 31 分钟零 23.647 秒。对于秒，最大数是 68 年。

计算跨分钟、秒和毫秒这些边界的方法，使得 DATEDIFF 给出的结果在全部数据类型中是一致的。结果是带正负号的整数值，其等于跨第一个和第二个日期间的 datepart 边界数。例如，在 1 月 4 日（星期日）和 1 月 11 日（星期日）之间的星期数是 1。

示例

此示例确定在 pubs 数据库中标题发布日期和当前日期间的天数。

USE pubs
GO
SELECT DATEDIFF(day, pubdate, getdate()) AS no_of_days
FROM titles
GO

请参见

CAST 和 CONVERT

数据类型

日期和时间函数


DATENAME

返回代表指定日期的指定日期部分的字符串。

语法

DATENAME ( datepart , date )

参数

datepart

是指定应返回的日期部分的参数。下表列出了 Microsoft® SQL Server™ 识别的日期部分和缩写。

日期部分 | 缩写
year | yy, yyyy
quarter | qq, q
month | mm, m
dayofyear | dy, y
day | dd, d
week | wk, ww
weekday | dw
Hour | hh
minute | mi, n
second | ss, s
millisecond | ms

weekday (dw) 日期部分返回星期几（星期天、星期一等）。

是返回 datetime 或 smalldatetime 值或日期格式字符串的表达式。对 1753 年 1 月 1 日之后的日期用datetime 数据类型。更早的日期存储为字符数据。当输入 datetime 值时，始终将其放入引号中。因为 smalldatetime 只精确到分钟，所以当用 smalldatetime 值时，秒和毫秒总是 0。有关指定日期的更多信息，请参见 datetime 和 smalldatetime。有关时间值指定的更多信息，请参见时间格式。

如果只指定年份的最后两位数字，则小于或等于 two digit year cutoff 配置选项的值的最后两位数字的值所在世纪与截止年所在世纪相同。大于该选项的值的最后两位数字的数字所在世纪为截止年所在世纪的前一个世纪。例如，如果 two digit year cutoff 为 2050（默认），则 49 被解释为 2049，50 被解释为 1950。为避免模糊，请使用四位数字的年份。

返回类型

nvarchar

注释

SQL Server 自动在字符和 datetime 值间按需要进行转换，例如，当将字符值与 datetime 值进行比较时。

示例

此示例从 GETDATE 返回的日期中提取月份名。

SELECT DATENAME(month, getdate()) AS 'Month Name'

下面是结果集：

Month Name
------------------------------
February

请参见

CAST 和 CONVERT

数据类型

日期和时间函数


DATEPART

返回代表指定日期的指定日期部分的整数。

语法

DATEPART ( datepart , date )

参数

datepart

是指定应返回的日期部分的参数。下表列出了 Microsoft® SQL Server™ 识别的日期部分和缩写。

日期部分 | 缩写
year | yy, yyyy
quarter | qq, q
month | mm, m
dayofyear | dy, y
day | dd, d
week | wk, ww
weekday | dw
Hour | hh
minute | mi, n
second | ss, s
millisecond | ms

week (wk, ww) 日期部分反映对 SET DATEFIRST 作的更改。任何一年的 1 月 1 日定义了 week 日期部分的开始数字，例如：DATEPART(wk, 'Jan 1, xxxx') = 1，此处 xxxx 代表任一年。

weekday (dw) 日期部分返回对应于星期中的某天的数，例如：Sunday = 1、Saturday = 7。weekday 日期部分产生的数取决于 SET DATEFIRST 设定的值，此命令设定星期中的第一天。

date

是返回 datetime 或 smalldatetime 值或日期格式字符串的表达式。对 1753 年 1 月 1 日之后的日期用datetime 数据类型。更早的日期存储为字符数据。当输入 datetime 值时，始终将其放入引号中。因为 smalldatetime 只精确到分钟，所以当用 smalldatetime 值时，秒和毫秒总是 0。

如果只指定年份的最后两位数字，则小于或等于"两位数年份截止期"配置选项的值的最后两位数字的数字所在世纪与截止年所在世纪相同。大于该选项的值的最后两位数字的数字所在世纪为截止年所在世纪的前一个世纪。例如，如果 two digit year cutoff 为 2049 （默认），则 49 被解释为 2049，2050 被解释为 1950。为避免模糊，请使用四位数的年份。

有关时间值指定的更多信息，请参见时间格式。有关日期指定的更多信息，请参见 datetime 和 smalldatetime。

返回类型

int

注释

DAY、MONTH、和 YEAR 函数分别是 DATEPART(dd, date)、DATEPART(mm, date)、和 DATEPART(yy, date) 的同义词。

示例

GETDATE 函数返回当前日期；然而，比较时并不总是需要完整的日期信息（通常只是对日期的一部分进行比较）。此示例显示 GETDATE 及 DATEPART 的输出。

SELECT GETDATE() AS 'Current Date'
GO

下面是结果集：

Current Date
---------------------------
Feb 18 1998 11:46PM

SELECT DATEPART(month, GETDATE()) AS 'Month Number'
GO

下面是结果集：

Month Number
------------
2

此示例假设日期是 5 月 29 日。

SELECT DATEPART(month, GETDATE())
GO

下面是结果集：

-----------
5

(1 row(s) affected)

在此示例中，以数字表示日期。注意：SQL Server 将 0 解释为 01/01/1900。

SELECT DATEPART(m, 0), DATEPART(d, 0), DATEPART(yy, 0)

下面是结果集：

----- ------ ------
1     1      1900

请参见

CAST 和 CONVERT

数据类型

日期和时间函数


datetime 和 smalldatetime

代表日期和一天内的时间的日期和时间数据类型。

datetime

从 1753 年 1 月 1 日到 9999 年 12 月 31 日的日期和时间数据，精确度为百分之三秒（等于 3.33 毫秒或 0.00333 秒）。如下表所示，把值调整到 .000、.003、或 .007 秒的增量。

示例 | 调整后的示例
01/01/98 23:59:59.999 | 1998-01-02 00:00:00.000
01/01/98 23:59:59.995, 01/01/98 23:59:59.996, 01/01/98 23:59:59.997, 或 01/01/98 23:59:59.998 | 1998-01-01 23:59:59.997
01/01/98 23:59:59.992, 01/01/98 23:59:59.993, 01/01/98 23:59:59.994 | 1998-01-01 23:59:59.993
01/01/98 23:59:59.990 或 01/01/98 23:59:59.991 | 1998-01-01 23:59:59.990

Microsoft® SQL Server™ 拒绝所有其不能识别为 1753 年到 9999 年间的日期的值。

smalldatetime

从 1900 年 1 月 1 日到 2079 年 6 月 6 日的日期和时间数据精确到分钟。29.998 秒或更低的 smalldatetime 值向下舍入为最接近的分钟，29.999 秒或更高的 smalldatetime 值向上舍入为最接近的分钟。

--returns time as 12:35
SELECT CAST('2000-05-08 12:35:29.998' AS smalldatetime)
GO
--returns time as 12:36
SELECT CAST('2000-05-08 12:35:29.999' AS smalldatetime)
GO
注释

Microsoft SQL Server 用两个 4 字节的整数内部存储 datetime 数据类型的值。第一个 4 字节存储 base date（即 1900 年 1 月 1 日）之前或之后的天数。基础日期是系统参考日期。不允许早于 1753 年 1 月 1 日的 datetime 值。另外一个 4 字节存储以午夜后毫秒数所代表的每天的时间。

smalldatetime 数据类型存储日期和每天的时间，但精确度低于 datetime。SQL Server 将 smalldatetime 的值存储为两个 2 字节的整数。第一个 2 字节存储 1900 年 1 月 1 日后的天数。另外一个 2 字节存储午夜后的分钟数。日期范围从1900 年 1 月 1 日到 2079 年 6 月 6 日，精确到分钟。

请参见

ALTER TABLE

CAST 和 CONVERT

CREATE TABLE

数据类型转换

数据类型

DECLARE @local_variable

DELETE

INSERT

SET @local_variable

UPDATE


DAY

返回代表指定日期的天的日期部分的整数。

语法

DAY ( date )

参数

date

类型为 datetime 或 smalldatetime 的表达式。

返回类型

int

注释

此函数等价于 DATEPART(dd, date)。

示例

此示例返回从日期 03/12/1998 后的天数。

SELECT DAY('03/12/1998') AS 'Day Number'
GO

下面是结果集：

Day Number
------------
12

在此示例中，以数字表示日期。注意：Microsoft® SQL Server™ 将 0 解释为 01/01/1900。

SELECT MONTH(0), DAY(0), YEAR(0)

下面是结果集。

----- ------ ------
1     1      1900

请参见

日期和时间函数

datetime 和 smalldatetime

表达式


DB_ID

返回数据库标识 (ID) 号。

语法

DB_ID ( [ 'database_name' ] )

参数

'database_name'

是用来返回相应数据库 ID 的数据库名。database_name 是 nvarchar。如果不填 database_name，则返回当前数据库 ID。

返回类型

smallint

示例

此示例检查在 sysdatabases 中的每个数据库，使用数据库名来确定数据库 ID。

USE master
SELECT name, DB_ID(name) AS DB_ID
FROM sysdatabases
ORDER BY dbid

下面是结果集：

name                           DB_ID
------------------------------ ------
master                         1
tempdb                         2
model                          3
msdb                           4
pubs                           5

(5 row(s) affected)

请参见

元数据函数


DB_NAME

返回数据库名。

语法

DB_NAME ( database_id )

参数

database_id

是应返回数据库的标识号 (ID)。database_id 是 smallint，没有默认值。如果没有指定 ID，则返回当前数据库名。

返回类型

nvarchar(128)

示例

此示例检查 sysdatabases 中的每个数据库，使用数据库标识号来确定数据库名。

USE master
SELECT dbid, DB_NAME(dbid) AS DB_NAME
FROM sysdatabases
ORDER BY dbid
GO

下面是结果集：

dbid   DB_NAME
------ ------------------------------
1      master
2      tempdb
3      model
4      msdb
5      pubs

(5 row(s) affected)

请参见

元数据函数


DBCC

Transact-SQL 编程语言提供 DBCC 语句作为 Microsoft® SQL Server™ 2000 的数据库控制台命令。这些语句对数据库的物理和逻辑一致性进行检查。许多 DBCC 语句能够对检测到的问题进行修复。

数据库控制台命令语句被分为以下类别。

语句分类 | 执行
维护语句 | 对数据库、索引或文件组进行维护的任务。
杂项语句 | 诸如启用行级锁定或从内存中删除动态链接库 (DLL) 等杂项任务。
状态语句 | 状态检查。
验证语句 | 对数据库、表、索引、目录、文件组、系统表或数据库页的分配进行的验证操作。

SQL Server 2000 的 DBCC 语句使用输入参数和返回值。所有 DBCC 语句参数都可以接受 Unicode 和 DBCS 字面值。

使用 DBCC 结果集输出

许多 DBCC 命令可以产生表格格式的输出（使用 WITH TABLERESULTS 选项）。该信息可装载到表中以便将来使用。以下显示一个示例脚本：

-- Create the table to accept the results
CREATE TABLE #tracestatus (
   TraceFlag INT,
   Status INT
   )

-- Execute the command, putting the results in the table
INSERT INTO #tracestatus
   EXEC ('DBCC TRACESTATUS (-1) WITH NO_INFOMSGS')

-- Display the results
SELECT *
FROM #tracestatus
GO
维护语句

DBCC DBREINDEX

DBCC DBREPAIR

DBCC INDEXDEFRAG

DBCC SHRINKDATABASE

DBCC SHRINKFILE

DBCC UPDATEUSAGE

杂项语句

DBCC dllname (FREE)

DBCC HELP

DBCC PINTABLE

DBCC ROWLOCK

DBCC TRACEOFF

DBCC TRACEON

DBCC UNPINTABLE

状态语句

DBCC PINTABLE

DBCC OPENTRAN

DBCC OUTPUTBUFFER

DBCC PROCCACHE

DBCC SHOWCONTIG

DBCC SHOW_STATISTICS

DBCC SQLPERF

DBCC TRACESTATUS

DBCC USEROPTIONS

验证语句

DBCC CHECKALLOC

DBCC CHECKCATALOG

DBCC CHECKCONSTRAINTS

DBCC CHECKDB

DBCC CHECKFILEGROUP

DBCC CHECKIDENT

DBCC CHECKTABLE

DBCC NEWALLOC


DBCC CHECKALLOC

检查指定数据库的磁盘空间分配结构的一致性。

语法

DBCC CHECKALLOC
( 'database_name'
[ , NOINDEX
|
{ REPAIR_ALLOW_DATA_LOSS
| REPAIR_FAST
| REPAIR_REBUILD
} ]
) [ WITH { [ ALL_ERRORMSGS | NO_INFOMSGS ]
[ , [ TABLOCK ] ]
[ , [ ESTIMATEONLY ] ]
}
]

参数

'database_name'

是数据库，要对其分配和页使用情况进行检查。如果未指定，则默认为当前数据库。数据库名称必须符合标识符的规则。有关更多信息，请参见使用标识符。

NOINDEX

指定不检查非系统表的非聚集索引。

说明 NOINDEX 仅为向后兼容性保留。执行 DBCC CHECKALLOC 时，对所有索引进行检查。

REPAIR_ALLOW_DATA_LOSS | REPAIR_FAST | REPAIR_REBUILD

指定 DBCC CHECKALLOC 修复发现的错误。给定的 database_name 必须在单用户模式下以使用这些修复选项之一，可以为下列值中的一个值。

值 | 描述
REPAIR_ALLOW_DATA_LOSS | 执行由 REPAIR_REBUILD 完成的所有修复，包括对行和页进行分配和取消分配以改正分配错误、结构行或页的错误，以及删除已损坏的文本对象。这些修复可能会导致一些数据丢失。修复操作可以在用户事务下完成，以允许用户回滚所做的更改。如果回滚修复，则数据库仍会含有错误，应该从备份进行恢复。如果由于所提供修复等级的缘故遗漏某个错误的修复，则将遗漏任何取决于该修复的修复。修复完成后，备份数据库。
REPAIR_FAST | 进行小的、不耗时的修复操作，如修复非聚集索引中的附加键。这些修复可以很快完成，并且不会有丢失数据的危险。
REPAIR_REBUILD | 执行由 REPAIR_FAST 完成的所有修复，包括需要较长时间的修复（如重建索引）。执行这些修复时不会有丢失数据的危险。

WITH

指定有关下列内容的选项：返回错误信息的数量、获得的锁或估计的 tempdb 要求。如果 ALL_ERRORMSGS 和 NO_INFOMSGS 都未指定，则 Microsoft® SQL Server™ 2000 将返回全部错误信息。

ALL_ERRORMSGS

显示所有错误信息。如果未指定，SQL Server 就按每个对象最多 200 条错误信息进行显示。

NO_INFOMSGS

禁止显示所有信息性消息和关于所用空间的报告。

TABLOCK

导致 DBCC 命令获取共享表锁。对 DBCC CHECKALLOC 忽略该参数。

ESTIMATE ONLY

显示与所有其它指定选项一起运行 DBCC CHECKALLOC 时所需的估计 tempdb 空间大小。

注释

DBCC CHECKALLOC 对数据库中的分配和页使用（包括索引视图）情况进行检查。只用于向后兼容性的 NOINDEX 选项也适用于索引视图。

如果已经执行 DBCC CHECKDB，则不必执行 DBCC CHECKALLOC。DBCC CHECKDB 是 DBCC CHECKALLOC 的超集，除了对索引结构和数据完整性进行检查之外，它还包括对分配进行检查。

DBCC CHECKDB 是最安全的修复语句，因为它对最多的可能出现的错误进行标识和修复。如果只报告数据库中有分配错误，请执行带有修复选项的 DBCC CHECKALLOC 以对这些错误进行更正。然而，若要确保正确修复所有错误（包括分配错误），请执行带有修复选项的 DBCC CHECKDB。DBCC CHECKALLOC 消息按对象 ID 进行排序（从 tempdb 中生成的消息除外）。DBCC CHECKALLOC 对数据库中所有数据页的分配进行验证；而 DBCC CHECKDB 除了对分配信息进行验证外，还对数据存储中使用的页信息进行验证。

默认情况下，DBCC CHECKALLOC 不获取表锁。相反，它获取架构锁，该锁在 DBCC CHECKALLOC 正在执行时阻止对元数据进行更改，但允许更改数据。DBCC 语句收集信息，然后扫描日志以查找所做的任何其它更改，并在扫描的结尾将两组信息合并在一起以产生数据的一致视图。

结果集

下表描述 DBCC CHECKALLOC 返回的信息。

项目 | 描述
FirstIAM | 仅限内部使用。
Root | 仅限内部使用。
Dpages | 来自 sysindexes 的数据页计数。
Pages used | 分配的页。
Dedicated extents | 分配给对象的扩展盘区。 如果使用混合分配页，可能有未分配扩展盘区的页。

DBCC CHECKALLOC 报表的第二部分是每个文件中每个索引的分配摘要。该摘要使用户对数据的分布情况有一个大概的了解。

项目 | 描述
Reserved | 分配给索引的页和已分配的扩展盘区中未使用的页。
Used | 分配给索引和索引正在使用的页。

不管是否指定任何选项（WITH NO_INFOMSGS 除外），DBCC CHECKALLOC 都会返回以下的结果集（值可能会变化）：

DBCC results for 'master'.
***************************************************************
Table sysobjects                Object ID 1.
Index ID 1         FirstIAM (1:11)   Root (1:12)    Dpages 22.
    Index ID 1. 24 pages used in 5 dedicated extents.
Index ID 2         FirstIAM (1:1368)   Root (1:1362)    Dpages 10.
    Index ID 2. 12 pages used in 2 dedicated extents.
Index ID 3         FirstIAM (1:1392)   Root (1:1408)    Dpages 4.
    Index ID 3. 6 pages used in 0 dedicated extents.
Total number of extents is 7.
***************************************************************
'...'
***************************************************************
Table spt_server_info                Object ID 1938105945.
Index ID 1         FirstIAM (1:520)   Root (1:508)    Dpages 1.
    Index ID 1. 3 pages used in 0 dedicated extents.
Total number of extents is 0.
***************************************************************
Processed 52 entries in sysindexes for database ID 1.
File 1. Number of extents = 210, used pages = 1126, reserved pages = 1280.
           File 1 (number of mixed extents = 73, mixed pages = 184).
    Object ID 1, Index ID 0, data extents 5, pages 24, mixed extent pages 9.
'...'
    Object ID 1938105945, Index ID 0, data extents 0, pages 3, mixed extent pages 3.
Total number of extents = 210, used pages = 1126, reserved pages = 1280 in this database.
       (number of mixed extents = 73, mixed pages = 184) in this database.
CHECKALLOC found 0 allocation errors and 0 consistency errors in database 'master'.
DBCC execution completed. If DBCC printed error messages, contact your system administrator.

如果指定 ESTIMATE ONLY 选项，DBCC CHECKALLOC 会返回以下结果集。

Estimated TEMPDB space needed for CHECKALLOC (KB)
-------------------------------------------------
34

(1 row(s) affected)

DBCC execution completed. If DBCC printed error messages, contact your system administrator.
权限

DBCC CHECKALLOC 权限默认授予 sysadmin 固定服务器角色成员或 db_owner 固定数据库角色成员且不可转让。

示例

下例对当前数据库和 pubs 数据库执行 DBCC CHECKALLOC。

-- Check the current database.
DBCC CHECKALLOC
GO
-- Check the pubs database.
DBCC CHECKALLOC ('pubs')
GO

请参见

DBCC

DBCC NEWALLOC

空间分配和重新使用

sp_dboption


DBCC CHECKCATALOG

检查指定数据库中的系统表内及系统表间的一致性。

语法

DBCC CHECKCATALOG
( 'database_name'
) [ WITH NO_INFOMSGS ]

参数

'database_name'

是要对其系统表一致性进行检查的数据库。如果未指定，则默认为当前数据库。数据库名称必须符合标识符的规则。有关更多信息，请参见使用标识符。

WITH NO_INFOMSGS

当错误信息少于 200 条时，禁止显示所有的信息性消息和关于所用空间的报告。如果未指定，DBCC CHECKCATALOG 则会显示所有的错误信息。DBCC CHECKCATALOG 消息按对象 ID 排序（从 tempdb 中生成的消息除外）。

注释

DBCC CHECKCATALOG 对 syscolumns 中的每种数据类型在 systypes 中是否都有一个匹配项进行检查，同时还对 sysobjects 中的每个表和视图在 syscolumns 中是否都至少有一列进行检查。

结果集

如果没有指定数据库，DBCC CHECKCATALOG 会返回以下结果集（消息）：

DBCC results for 'current database'.
DBCC execution completed. If DBCC printed error messages, contact your system administrator.

如果提供 Northwind 作为数据库名称，DBCC CHECKCATALOG 会返回以下结果集（消息）：

DBCC results for 'Northwind'.
DBCC execution completed. If DBCC printed error messages, contact your system administrator.
权限

DBCC CHECKCATALOG 权限默认授予 sysadmin 固定服务器角色、db_owner 和 db_backupoperator 固定数据库角色的成员且不可转让。

示例

下例对当前数据库和 pubs 数据库中对象的分配和结构完整性进行检查。

-- Check the current database.
DBCC CHECKCATALOG
GO
-- Check the pubs database.
DBCC CHECKCATALOG ('pubs')
GO

请参见

DBCC

系统表


DBCC CHECKCONSTRAINTS

检查指定表上的指定约束或所有约束的完整性。

语法

DBCC CHECKCONSTRAINTS
[( 'table_name' | 'constraint_name'
)]

[ WITH { ALL_ERRORMSGS | ALL_CONSTRAINTS } ]

参数

'table_name' | 'constraint_name'

是要检查的表或约束。如果指定 table_name，则对该表所有启用的约束进行检查。如果指定 constraint_name，则只对该约束进行检查。如果 table_name 和 constraint_name 都没有指定，将检查当前数据库中所有表上启用的约束。

约束名称唯一地标识其所属的表。有关更多信息，请参见使用标识符。

ALL_CONSTRAINTS

如果指定了表名或检查所有的表，则对表上所有启用及禁用的约束进行检查。否则，只检查启用的约束。如果指定了约束名，则 ALL_CONSTRAINTS 无效。

ALL_ERRORMSGS

返回所检查的表中违反约束的所有行。默认为前 200 行。

注释

DBCC CHECKCONSTRAINTS 构造并执行一个对表的所有外键约束和检查约束的查询。

例如，外键查询可有如下形式：

SELECT columns
FROM table_being_checked LEFT JOIN referenced_table
   ON table_being_checked.fkey1 = referenced_table.pkey1
   AND table_being_checked.fkey2 = referenced_table.pkey2
WHERE table_being_checked.fkey1 IS NOT NULL
   AND referenced_table.pkey1 IS NULL
   AND table_being_checked.fkey2 IS NOT NULL
   AND referenced_table.pkey2 IS NULL

查询数据存储在临时表中。检查完所有请求的表和约束后，将返回结果集。

DBCC CHECKCONSTRAINTS 检查外键和已检查的约束的完整性，但并不检查表的磁盘上数据结构的完整性。这些数据结构检查可用 DBCC CHECKDB 和 DBCC CHECKTABLE 执行。

结果集

DBCC CHECKCONSTRAINTS 返回带有下面列的行集。

列名 | 数据类型 | 描述
Table Name | varchar | 表的名称。
Constraint Name | varchar | 违反的约束名。
Where | varchar | 标识违反约束的行的列值分配。 该列中的值可以用于 SELECT 语句（为查询违反约束的行）的 WHERE 子句中。

例如，orders 表的 DBCC CHECKCONSTRAINT 将产生下列结果。

Table Name   Constraint Name      Where
-----------   -----------------------   -----------------------
orders      PartNo_FKey         PartNo = '12'

Where 列中的值"PartNo = '12'"可以在识别违反约束"PartNo_FKEY"的行的 SELECT 语句中使用。

Select *
From orders
Where PartNo = '12'

之后，用户可以决定是否对行进行修改、删除，或者只进行调整。

权限

DBCC CHECKCONSTRAINTS 权限默认授予 sysadmin 固定服务器角色和 db_owner 固定数据库角色的成员且不可转让。

示例
A. 检查表

下例检查 pubs 数据库中 orders 表的约束完整性。

DBCC CHECKCONSTRAINTS ('authors')
GO
B. 检查特定约束

下例检查 PartNo_FKey 约束的完整性。约束名称唯一地标识要声明的表。

DBCC CHECKCONSTRAINTS ('PartNo_Fkey')
GO
C. 检查所有表的所有启用和禁用的约束

下例检查当前数据库表上的所有启用和禁用约束的完整性。

DBCC CHECKCONSTRAINTS WITH ALL_CONSTRAINTS
GO


DBCC CHECKDB

检查指定数据库中的所有对象的分配和结构完整性。

语法

DBCC CHECKDB
( 'database_name'
[ , NOINDEX
| { REPAIR_ALLOW_DATA_LOSS
| REPAIR_FAST
| REPAIR_REBUILD
} ]
) [ WITH { [ ALL_ERRORMSGS ]
[ , [ NO_INFOMSGS ] ]
[ , [ TABLOCK ] ]
[ , [ ESTIMATEONLY ] ]
[ , [ PHYSICAL_ONLY ] ]
}
]

参数

'database_name'

是要对其中的所有对象分配和结构完整性进行检查的数据库。如果未指定，则默认为当前数据库。数据库名称必须符合标识符的规则。有关更多信息，请参见使用标识符。

NOINDEX

指定不检查非系统表的非聚集索引。NOINDEX 减少执行总时间，因为它不对用户定义的表的非聚集索引进行检查。NOINDEX 对系统表没有影响，因为 DBCC CHECKDB 总是对所有系统表索引进行检查。

REPAIR_ALLOW_DATA_LOSS | REPAIR_FAST | REPAIR_REBUILD

指定 DBCC CHECKDB 修复发现的错误。给定的 database_name 必须在单用户模式下以使用修复选项，它可以是下列值之一。

值 | 描述
REPAIR_ALLOW_DATA_LOSS | 执行由 REPAIR_REBUILD 完成的所有修复，包括对行和页进行分配和取消分配以改正分配错误、结构行或页的错误，以及删除已损坏的文本对象。这些修复可能会导致一些数据丢失。修复操作可以在用户事务下完成以允许用户回滚所做的更改。如果回滚修复，则数据库仍会含有错误，应该从备份进行恢复。如果由于所提供修复等级的缘故遗漏某个错误的修复，则将遗漏任何取决于该修复的修复。修复完成后，备份数据库。
REPAIR_FAST | 进行小的、不耗时的修复操作，如修复非聚集索引中的附加键。这些修复可以很快完成，并且不会有丢失数据的危险。
REPAIR_REBUILD | 执行由 REPAIR_FAST 完成的所有修复，包括需要较长时间的修复（如重建索引）。执行这些修复时不会有丢失数据的危险。

WITH

指定有关下列内容的选项：返回错误信息的数量、获得的锁或估计的 tempdb 要求。

ALL_ERRORMSGS

显示每个对象不受限制的错误数。如果没有指定 ALL_ERRORMSGS，每个对象至多显示 200 个错误信息。按对象 ID 对错误信息进行排序（从 tempdb 中生成的消息除外）。

NO_INFOMSGS

禁止显示所有信息性消息（严重级别 10）和关于所用空间的报告。

TABLOCK

导致 DBCC CHECKDB 获得共享表锁。TABLOCK 可使 DBCC CHECKDB 在负荷较重的数据库上运行得更快，但 DBCC CHECKDB 运行时会减少数据库上可获得的并发性。

ESTIMATE ONLY

显示估计的 tempdb 空间大小，要运行带有所有其它指定选项的 DBCC CHECKDB 则需要该空间。不执行该检查。

PHYSICAL_ONLY

仅限于检查页和记录标题物理结构的完整性，以及页对象 ID 和索引 ID 与分配结构之间的一致性。该检查旨在以较低的开销检查数据库的物理一致性，同时还检测会危及用户数据安全的残缺页和常见的硬件故障。PHYSICAL_ONLY 始终意味着 NO_INFOMSGS，并且不能与任何修复选项一起使用。

注释

DBCC CHECKDB 对索引视图执行物理一致性检查。只用于向后兼容的 NOINDEX 选项也适用于索引视图上的任何辅助索引。

DBCC CHECKDB 是最安全的修复语句，因为它对最多的可能出现的各种错误进行标识和修复。如果只报告数据库中有分配错误，请执行带修复选项的 DBCC CHECKALLOC 以对这些错误进行修复。然而，若要确保正确修复所有错误（包括分配错误），请执行带修复选项的 DBCC CHECKDB，而不要执行带修复选项的 DBCC CHECKALLOC。

DBCC CHECKDB 对数据库中所有内容的完整性进行验证。如果当前正在执行或最近已执行 DBCC CHECKDB，则不需要运行 DBCC CHECKALLOC 或 DBCC CHECKTABLE。

DBCC CHECKDB 执行同样的检查，仿佛是对数据库中的每个表执行 DBCC CHECKALLOC 语句和 DBCC CHECKTABLE 语句。

默认情况下，DBCC CHECKDB 不获取表锁。但它获取架构锁，该锁防止对元数据进行更改，但允许更改数据。获取的架构锁将防止用户得到排它表锁，在生成聚集索引、除去任何索引或截断表时需要排它表锁。

DBCC 语句收集信息，然后扫描日志以查找所做的任何其它更改，并在扫描的结尾将两组信息合并在一起以产生数据的一致视图。

如果指定 TABLOCK 选项，DBCC CHECKDB 将获取共享表锁。这样可允许某些类别的错误有更详细的错误信息，并通过避免使用事务日志数据而将所要求的 tempdb 空间大小降为最低。TABLOCK 选项不阻止日志截断并使命令可以更快地运行。

DBCC CHECKDB 对数据库中每个表的 text、ntext 和 image 页的链接和大小及数据库中所有页的分配进行检查。

对于数据库中每个表，DBCC CHECKDB 检查其：

  • 索引和数据页是否已正确链接。

  • 索引是否按照正确的顺序排列。

  • 各指针是否一致。

  • 每页上的数据是否均合理。

  • 页面偏移量是否合理。

错误表示数据库中的潜在问题，应该立即改正。

默认情况下，DBCC CHECKDB 对对象执行并行检查。并行度由查询处理器自动确定。最大并行度的配置方式与并行查询相同。使用 sp_configure 系统存储过程限制可用于 DBCC 检查的最大处理器数。有关更多信息，请参见 max degree of parallelism 选项。

使用跟踪标记 2528 可禁用并行检查。有关更多信息，请参见跟踪标记。

结果集

不管是否指定任何选项（NO_INFOMSGS 或 NOINDEX 选项除外），如果未指定数据库，DBCC CHECKDB 返回当前数据库的以下结果集（值可能会变化）：

DBCC results for 'master'.
DBCC results for 'sysobjects'.
There are 862 rows in 13 pages for object 'sysobjects'.
DBCC results for 'sysindexes'.
There are 80 rows in 3 pages for object 'sysindexes'.
'...'
DBCC results for 'spt_provider_types'.
There are 23 rows in 1 pages for object 'spt_provider_types'.
CHECKDB found 0 allocation errors and 0 consistency errors in database 'master'.
DBCC execution completed. If DBCC printed error messages, contact your system administrator.

如果指定 NO_INFOMSGS 选项，DBCC CHECKDB 将返回以下结果集（消息）：

The command(s) completed successfully.

如果指定 ESTIMATEONLY 选项，DBCC CHECKDB 将返回以下结果集。

Estimated TEMPDB space needed for CHECKALLOC (KB)
-------------------------------------------------
13

(1 row(s) affected)

Estimated TEMPDB space needed for CHECKTABLES (KB)
--------------------------------------------------
57

(1 row(s) affected)

DBCC execution completed. If DBCC printed error messages, contact your system administrator.
权限

DBCC CHECKDB 权限默认授予 sysadmin 固定服务器角色或 db_owner 固定数据库角色的成员且不可转让。

示例
A. 检查当前数据库和 pubs 数据库

下例对当前数据库和 pubs 数据库执行 DBCC CHECKDB。

-- Check the current database.
DBCC CHECKDB
GO
-- Check the pubs database without nonclustered indexes.
DBCC CHECKDB ('pubs', NOINDEX)
GO
B. 检查当前数据库，禁止显示信息性消息

下例检查当前数据库，并禁止显示所有信息性消息。

DBCC CHECKDB WITH NO_INFOMSGS
GO

请参见

SQL Server 2000 的各种版本所支持的功能

如何配置可用于并行查询的处理器数目（企业管理器）

物理数据库构架

sp_helpdb

系统表


DBCC CHECKFILEGROUP

检查指定文件组中的所有表（在当前数据库中）的分配和结构完整性。

语法

DBCC CHECKFILEGROUP
( [ { 'filegroup' | filegroup_id } ]
[ , NOINDEX ]
) [ WITH { [ ALL_ERRORMSGS | NO_INFOMSGS ]
[ , [ TABLOCK ] ]
[ , [ ESTIMATEONLY ] ]
}
]

参数

'filegroup'

是文件组名称，要对其表分配和结构完整性进行检查。如果未指定，则默认为主文件组。文件组名称必须符合标识符的规则。有关更多信息，请参见使用标识符。

filegroup_id

是文件组标识 (ID) 号，要对其表分配和结构完整性进行检查。从含有该文件组的数据库中的 FILEGROUP_ID 函数或 sysfilegroups 系统表获得 filegroup_id。

NOINDEX

指定不检查非系统表的非聚集索引。这会减少执行时间。NOINDEX 对系统表没有影响。在默认文件组上运行时，DBCC CHECKFILEGROUP 总是对所有的系统表索引进行检查。

WITH

指定有关下列内容的选项：返回错误信息的数量、获得的锁或估计的 tempdb 要求。如果 ALL_ERRORMSGS 和 NO_INFOMSGS 都未指定，则 Microsoft® SQL Server™ 将返回全部错误信息。

ALL_ERRORMSGS

显示所有错误信息。如果未指定，SQL Server 就按每个表最多 200 条错误信息进行显示。按对象 ID 对错误信息进行排序（从 tempdb 中生成的消息除外）。

NO_INFOMSGS

禁止显示所有信息性消息和关于所用空间的报告。

TABLOCK

导致 DBCC CHECKFILEGROUP 获得共享表锁。

ESTIMATE ONLY

显示与所有其它指定选项一起运行 DBCC CHECKFILEGROUP 时所需的估计 tempdb 空间大小。

注释

DBCC CHECKFILEGROUP 和 DBCC CHECKDB 是相似的 DBCC 语句。主要差别在于 DBCC CHECKFILEGROUP 所执行的检查：仅限于单个的指定文件组和所需的表。

对数据库中的所有文件组执行 DBCC CHECKFILEGROUP 语句与运行单个 DBCC CHECKDB 语句相同。唯一的差别在于：如果表的索引在不同文件组上，则将多次检查该表和索引（对包含表或其索引的每个文件组检查一次）。

操作期间，DBCC CHECKFILEGROUP 阻止对文件组中的所有表和索引（以及其索引在当前所检查的文件组中的其它文件组中的表）进行修改。

DBCC CHECKFILEGROUP 执行期间，不允许对表执行创建和删除操作。

默认情况下，DBCC CHECKFILEGROUP 不获取表锁。但它获取架构锁，该锁防止对元数据进行更改，但允许更改数据。DBCC 语句收集信息，然后扫描任何日志以查找其它所做的任何更改，在扫描的结尾将两组信息合并在一起以产生数据的一致视图。

如果指定 TABLOCK 选项，DBCC CHECKFILEGROUP 获取共享表锁。这样可允许某些类别的错误有更详细的错误信息，并通过避免使用事务日志数据而将所要求的 tempdb 空间大小降为最低。

DBCC CHECKFILEGROUP 对每个文件组的 text、ntext 和 image 页的链接和大小以及文件组中所有页的分配进行检查。

DBCC CHECKFILEGROUP 还对索引视图执行物理一致性检查。只用于向后兼容性的 NOINDEX 选项也适用于索引视图。

对于文件组中的每个表，DBCC CHECKFILEGROUP 检查其：

  • 索引和数据页是否已正确链接。

  • 索引是否按照正确的顺序排列。

  • 各指针是否一致。

  • 每页上的数据是否均合理。

  • 页面偏移量是否合理。

如果所显式检查的文件组中的非聚集索引与其它文件组中的表相关联，则也要对其它文件组中的表（最初未显式检查）进行检查，因为要对索引进行验证也要求对基表结构进行验证。然而，如果所检查的文件组中的表在其它文件组中有非聚集索引，则不对该索引进行检查，因为：

  • 基表结构不依赖于非聚集索引的结构。

  • DBCC CHECKFILEGROUP 语句重点只对文件组中的对象进行验证。不必扫描非聚集索引以对基表进行验证。

  • 如果在数据库中多个文件组上运行 DBCC CHECKFILEGROUP，在对含有索引的文件组进行专门检查时只检查该索引可以减少重复处理。

聚集索引和表不可能在不同文件组上，所以这些注意事项只适用于非聚集索引。

对 filegroup 和 filegroup_id 的引用只在当前数据库中有用。执行 DBCC CHECKFILEGROUP之前，确保将上下文切换到适当的数据库。有关更改当前数据库的更多信息，请参见 USE。

默认情况下，DBCC CHECKFILEGROUP 对对象执行并行检查。并行度由查询处理器自动确定。最大并行度的配置方式与并行查询相同。使用 sp_configure 系统存储过程限制可用于 DBCC 检查的最大处理器数。有关更多信息，请参见 max degree of parallelism 选项。

使用跟踪标记 2528 可禁用并行检查。有关更多信息，请参见跟踪标记。

结果集

不管是否指定任何选项（NOINDEX 除外），如果没有指定数据库，DBCC CHECKFILEGROUP 将为当前数据库返回以下结果集（值可能会有变化）：

DBCC results for 'master'.
DBCC results for 'sysobjects'.
There are 862 rows in 13 pages for object 'sysobjects'.
DBCC results for 'sysindexes'.
There are 80 rows in 3 pages for object 'sysindexes'.
'...'
DBCC results for 'spt_provider_types'.
There are 23 rows in 1 pages for object 'spt_provider_types'.
CHECKFILEGROUP found 0 allocation errors and 0 consistency errors in database 'master'.
DBCC execution completed. If DBCC printed error messages, contact your system administrator.

如果指定 NO_INFOMSGS 选项，DBCC CHECKFILEGROUP 将返回以下结果集：

DBCC execution completed. If DBCC printed error messages, contact your system administrator.

如果指定 ESTIMATEONLY 选项，DBCC CHECKFILEGROUP 将返回以下结果集。

Estimated TEMPDB space needed for CHECKALLOC (KB)
-------------------------------------------------
15

(1 row(s) affected)

Estimated TEMPDB space needed for CHECKTABLES (KB)
--------------------------------------------------
207

(1 row(s) affected)

DBCC execution completed. If DBCC printed error messages, contact your system administrator.
权限

DBCC CHECKFILEGROUP 权限默认授予 sysadmin 固定服务器角色或 db_owner 固定数据库角色的成员且不可转让。

示例
A. 检查 pubs 数据库中的 PRIMARY 文件组

下例检查 pubs 数据库主文件组。

USE pubs
GO
DBCC CHECKFILEGROUP
GO
B. 检查没有非聚集索引的 pubs PRIMARY 文件组

下例通过指定主文件组的标识号和指定 NOINDEX 选项对 pubs 数据库主文件组（不包括非聚集索引）进行检查。

USE pubs
GO
DBCC CHECKFILEGROUP (1, NOINDEX)
GO

请参见

SQL Server 2000 的各种版本所支持的功能

FILEGROUP_ID

如何配置可用于并行查询的处理器数目（企业管理器）

物理数据库构架

sp_helpfile

sp_helpfilegroup

sysfilegroups


DBCC CHECKIDENT

检查指定表的当前标识值，如有必要，还对标识值进行更正。

语法

DBCC CHECKIDENT
( 'table_name'
[ , { NORESEED
| { RESEED [ , new_reseed_value ] }
}
]
)

参数

'table_name'

是要对其当前标识值进行检查的表名。表名必须符合标识符规则。有关更多信息，请参见使用标识符。指定的表必须包含标识列。

NORESEED

指定不应更正当前标识值。

RESEED

指定应该更正当前标识值。

new_reseed_value

是在标识列中重新赋值时要使用的值。

注释

如有必要，DBCC CHECKIDENT 会更正列的当前标识值。然而，如果标识列是使用 NOT FOR REPLICATION 子句（在 CREATE TABLE 或 ALTER TABLE 语句中）创建的，则不更正当前标识值。

如果标识列上有主键或唯一键约束，无效标识信息可能会导致错误信息 2627。

对当前标识值所做的具体更正取决于参数规范。

DBCC CHECKIDENT 语句 | 所做的标识更正
DBCC CHECKIDENT ('table_name', NORESEED) | 不重置当前标识值。DBCC CHECKIDENT 返回一个报表，它指明当前标识值和应有的标识值。
DBCC CHECKIDENT ('table_name') 或 DBCC CHECKIDENT ('table_name', RESEED) | 如果表的当前标识值小于列中存储的最大标识值，则使用标识列中的最大值对其进行重置。
DBCC CHECKIDENT ('table_name', RESEED, new_reseed_value) | 当前值设置为 new_reseed_value。如果自创建表后没有将行插入该表，则在执行 DBCC CHECKIDENT 后插入的第一行将使用 new_reseed_value 作为标识。否则，下一个插入的行将使用 new_reseed_value + 1。如果 new_reseed_value 的值小于标识列中的最大值，以后引用该表时将产生 2627 号错误信息。

当前标识值可以大于表中的最大值。在此情况下，DBCC CHECKIDENT 并不自动重置当前标识值。若要在当前标识值大于列中的最大值时对当前标识值进行重置，请使用两种方法中的任意一种：

  • 执行 DBCC CHECKIDENT ('table_name', NORESEED) 以确定列中的当前最大值，然后使用 DBCC CHECKIDENT ('table_name', RESEED, new_reseed_value) 语句将该值指定为 new_reseed_value。

  • 将 new_reseed_value 置为很小值来执行 DBCC CHECKIDENT ('table_name', RESEED, new_reseed_value)，然后运行 DBCC CHECKIDENT ('table_name', RESEED)。
结果集

不管是否指定任何选项（针对于包含标识列的表；下例使用 pubs 数据库的 jobs 表），DBCC CHECKIDENT 返回以下结果集（值可能会有变化）：

Checking identity information: current identity value '14', current column value '14'.
DBCC execution completed. If DBCC printed error messages, contact your system administrator.
权限

DBCC CHECKIDENT 权限默认授予表所有者、sysadmin 固定服务器角色和 db_owner 固定数据库角色的成员且不可转让。

示例
A. 如有必要，重置当前标识值

下例在必要的情况下重置 jobs 表的当前标识值。

USE pubs
GO
DBCC CHECKIDENT (jobs)
GO
B. 报告当前标识值

下例报告 jobs 表中的当前标识值；如果该标识值不正确，并不对其进行更正。

USE pubs
GO
DBCC CHECKIDENT (jobs, NORESEED)
GO
C. 强制当前标识值为 30

下例强制 jobs 表中的当前标识值为 30。

USE pubs
GO
DBCC CHECKIDENT (jobs, RESEED, 30)
GO

请参见

ALTER TABLE

CREATE TABLE

DBCC

IDENTITY（属性）

USE


DBCC CHECKTABLE

检查指定表或索引视图的数据、索引及 text、ntext 和 image 页的完整性。

语法

DBCC CHECKTABLE
( 'table_name' | 'view_name'
[ , NOINDEX
| index_id
 | { REPAIR_ALLOW_DATA_LOSS
| REPAIR_FAST
| REPAIR_REBUILD }
]
) [ WITH { [ ALL_ERRORMSGS | NO_INFOMSGS ]
[ , [ TABLOCK ] ]
[ , [ ESTIMATEONLY ] ]
[ , [ PHYSICAL_ONLY ] ]
}
]

参数

'table_name' | 'view_name'

是要对其数据页完整性进行检查的表或索引视图。表名和视图名必须符合标识符的规则。有关更多信息，请参见使用标识符。

NOINDEX

指定不检查非系统表的非聚集索引。

REPAIR_ALLOW_DATA_LOSS | REPAIR_FAST | REPAIR_REBUILD

指定 DBCC CHECKTABLE 修复发现的错误。数据库必须在单用户模式下以使用修复选项，可以是下列值之一。

值 | 描述
REPAIR_ALLOW_DATA_LOSS | 执行由 REPAIR_REBUILD 完成的所有修复，包括对行和页进行分配和取消分配以改正分配错误、结构行或页的错误，以及删除已损坏的文本对象。这些修复可能会导致一些数据丢失。修复操作可以在用户事务下完成以允许用户回滚所做的更改。如果回滚修复，则数据库仍会含有错误，应该从备份进行恢复。如果由于所提供修复等级的缘故遗漏某个错误的修复，则将遗漏任何取决于该修复的修复。修复完成后，备份数据库。
REPAIR_FAST | 进行小的、不耗时的修复操作，如修复非聚集索引中的附加键。这些修复可以很快完成，并且不会有丢失数据的危险。
REPAIR_REBUILD | 执行由 REPAIR_FAST 完成的所有修复，包括需要较长时间的修复（如重建索引）。执行这些修复时不会有丢失数据的危险。

index_id

是要对其数据页完整性进行检查的索引标识 (ID) 号。如果指定 index_id，DBCC CHECKTABLE 只会对该索引进行检查。

WITH

指定有关下列内容的选项：返回错误信息的数量、获得的锁或估计的 tempdb 要求。如果 ALL_ERRORMSGS 和 NO_INFOMSGS 都未指定，则 Microsoft® SQL Server™ 将返回全部错误信息。

ALL_ERRORMSGS

显示所有错误信息。如果未指定，SQL Server 就按每个表最多 200 条错误信息进行显示。错误信息按对象 ID 进行排序。

NO_INFOMSGS

禁止显示所有信息性消息和关于所用空间的报告。

TABLOCK

导致 DBCC CHECKTABLE 获得共享表锁。

ESTIMATE ONLY

显示估计的 tempdb 空间大小，要运行带有所有其它指定选项的 DBCC CHECKTABLE 则需要该空间。

PHYSICAL_ONLY

仅限于检查页和记录标题物理结构的完整性，以及页对象 ID 和索引 ID 与分配结构之间的一致性。该检查旨在以较低的开销检查数据库的物理一致性，同时还检测会危及用户数据安全的残缺页和常见的硬件故障。PHYSICAL_ONLY 始终意味着 NO_INFOMSGS，并且不能与任何修复选项一起使用。

注释

DBCC CHECKTABLE 对表和索引视图执行物理一致性检查。只用于向后兼容性的 NOINDEX 选项也适用于索引视图。

对于指定的表，DBCC CHECKTABLE 检查其：

  • 索引和数据页是否已正确链接。

  • 索引是否按照正确的顺序排列。

  • 各指针是否一致。

  • 每页上的数据是否均合理。

  • 页面偏移量是否合理。

DBCC CHECKTABLE 对指定表的 text、ntext 和 image 页的链接及大小进行检查。然而，DBCC CHECKTABLE 不验证数据库中所有分配结构的一致性。使用 DBCC CHECKALLOC 进行此验证。

默认情况下，DBCC CHECKTABLE 不获取表锁。但它获取架构锁，该锁阻止对元数据进行更改，但允许更改数据。DBCC 语句收集信息，然后扫描任何日志以查找其它所做的任何更改，在扫描的结尾将两组信息合并在一起以产生数据的一致视图。

如果指定 TABLOCK 选项，DBCC CHECKTABLE 获取共享表锁。这样可允许某些类别的错误有更详细的错误信息，并通过避免使用事务日志数据而将所要求的 tempdb 空间大小降为最低。

若要对数据库中每个表执行 DBCC CHECKTABLE，请使用 DBCC CHECKDB。

默认情况下，DBCC CHECKTABLE 对对象执行并行检查。并行度由查询处理器自动确定。最大并行度的配置方式与并行查询相同。使用 sp_configure 系统存储过程限制可用于 DBCC 检查的最大处理器数。有关更多信息，请参见 max degree of parallelism 选项。

使用跟踪标记 2528 可禁用并行检查。有关更多信息，请参见跟踪标记。

结果集

DBCC CHECKTABLE 返回以下结果集（如果只指定表名或如果提供任意选项，都返回与之相同的结果集）；下例指定 pubs 数据库中的 authors 表（值可能会有变化）：

DBCC results for 'authors'.
There are 23 rows in 1 pages for object 'authors'.
DBCC execution completed. If DBCC printed error messages, contact your system administrator.

如果指定 ESTIMATEONLY 选项，DBCC CHECKTABLE 将返回以下结果集。

Estimated TEMPDB space needed for CHECKTABLES (KB)
--------------------------------------------------
2

(1 row(s) affected)

DBCC execution completed. If DBCC printed error messages, contact your system administrator.
权限

DBCC CHECKTABLE 权限默认授予 sysadmin 固定服务器角色、db_owner 固定数据库角色的成员或表的所有者且不可转让。

示例
A. 检查特定表

下例检查 authors 表的数据页完整性。

DBCC CHECKTABLE ('authors')
GO
B. 检查表，但不检查非聚集索引

下例对 authors 表的数据页完整性进行检查，但不检查非聚集索引。

DBCC CHECKTABLE ('authors') WITH PHYSICAL_ONLY
GO
C. 检查特定索引

下例对通过访问 sysindexes 获得的特定索引进行检查。

USE pubs
DECLARE @indid int
SELECT @indid = indid
FROM sysindexes
WHERE id = OBJECT_ID('authors') AND name = 'aunmind'
DBCC CHECKTABLE ('authors', @indid)
GO

请参见

DBCC

SQL Server 2000 的各种版本所支持的功能

如何配置可用于并行查询的处理器数目（企业管理器）

表和索引构架


DBCC CLEANTABLE

收回除去的可变长度列和文本列的空间。

语法

DBCC CLEANTABLE
( { 'database_name' | database_id }
, { 'table_name' | table_id | 'view_name' | view_id }
[ , batch_size ]
)

参数

'database_name' | database_id

是将要清除的表所在的数据库。

'table_name' | table_id | 'view_name' | view_id

是要清除的表或视图。

batch_size

是每个事务处理的行数。如果未指定，则该语句用一个事务处理整个表。

注释

DBCC CLEANTABLE 收回用 ALTER TABLE DROP COLUMN 语句除去可变长度列或 text 列后的空间。而不收回固定长度列除去后的空间。

DBCC CLEANTABLE 作为一个或多个事务运行。如果未指定批处理大小，则该语句用一个事务处理整行。对于一些大表，单个事务的长度和所需的日志空间可能太大。如果指定批处理大小，则该语句用一系列事务运行，每个事务都包括指定的行数。DBCC CLEANTABLE 不能作为其它事务内的一个事务进行运行。

将完整地记录该操作。

在系统表或临时表上 DBCC CLEANTABLE 不受支持。

结果集
DBCC execution completed. If DBCC printed error messages, contact your system administrator.
权限

DBCC CLEANTABLE 权限默认授予 sysadmin 固定服务器角色和 db_owner 和 db_ddladmin 固定数据库角色的成员。


DBCC CONCURRENCYVIOLATION

显示有关在 SQL Server 2000 Desktop Engine 或 SQL Server 2000 个人版上并发执行 5 个以上批处理的次数的统计。还控制是否在 SQL Server 错误日志中记录这些统计。

语法

DBCC CONCURRENCYVIOLATION [ ( DISPLAY | RESET | STARTLOG | STOPLOG ) ]

参数

DISPLAY

显示并发冲突计数器的当前值。计数器记录自从启动日志记录或上次重置计数器以来并发执行 5 个以上批处理的次数。如果没有指定选项，则 DISPLAY 是默认值。

RESET

将所有的并发冲突计数器设置为零。

STARTLOG

每当有 5 个以上的并发批处理时，就每分钟在 SQL Server 事件日志中记入一次并发冲突计数器记录。

STOPLOG

停止定期在 SQL Server 事件日志中记入并发冲突计数器记录。

注释

DBCC CONCURRENCYVIOLATION 可在任何 SQL Server 2000 版本上执行，但只在这两个具有并发工作负荷调控器的 SQL Server 2000 版本上有效：SQL Server 2000 Desktop Engine 和 SQL Server 2000 个人版。在所有其它版本上，除了返回以下消息外没有其它作用：

DBCC execution completed. If DBCC printed error messages, contact your system administrator.

当并发执行 5 个以上的批处理时，SQL Server 2000 桌面版和 SQL Server 2000 个人版具有可限制性能的并发工作负荷调控器。随着并发执行的批处理数不断增加，调控器通过增加数量来降低系统的性能。并发执行 5 个以上批处理的次数计数在内部计数器中维护。可使用带 DISPLAY 参数或不用参数的 DBCC CONCURRENCYVIOLATION 语句显示这些计数器的内容。如果系统经过仔细调整后性能仍很低，并且 DBCC CONCURRENCYVIOLATIONS 显示数据库引擎经常有远远超过 5 个的批处理并发执行，则应考虑升级到其它的 SQL Server 2000 版本。

可使用 DBCC CONCURRENCYVIOLATION(STARTLOG) 语句，启用定期在 SQL Server 事件日志中记入并发冲突计数器记录的功能。当启用日志记录时，如果正在执行的并发批处理超过 5 个，则将每分钟在事件日志中记入一次并发冲突计数器记录。每当有 4 个或更少的并发批处理时，不将计数器写入错误日志。

DBCC CONCURRENCYVIOLATION 语句的主要输出在以下几行中：

Concurrency violations since 2000-02-02 11:03:17.20
 1   2   3    4    5   6    7   8   9   10-100   >100
 5   3   1    0    0   0    0   0   0      0       0
  • 第一行表示计数器累计的时间长度。

  • 第二行由表示哪个计数器在那个消息字段中报告的标题组成。每个标题表示每个冲突超出 5 个批处理限制的数目。1 表示并发执行的批处理次数计数为 6（5 个批处理限制 + 1 个冲突），2 表示并发执行的批处理次数计数为 7（5 + 2），依此类推。标题 10-100 表示系统的次数计数有 10 到 100 个批处理超过限制，标题 >100 表示系统的次数计数有超过 100 个批处理超过限制。

  • 第 3 行报告所指的批处理数并发执行的次数。在上面的示例行中，当系统有 1 个批处理超过限制时执行 5 次，有 2 个批处理超过限制时执行 3 次，有 3 个批处理超过限制时执行 1 次。

当启用定期日志记录时，每当并发执行的批处理超过 5 个，便在 SQL Server 错误日志中记录以下格式的消息：

2000-02-02 11:03:17.20 spid 12  This SQL Server has been opimized for 5 concurrent queries. This limit has been exceeded by 2 queries and performance may be adversely affected.
结果集

如果对并发冲突计数器启用定期日志记录，DBCC CONCURRENCYVIOLATION 将返回以下结果集（消息）：

Concurrency violations since 2000-02-02 11:03:17.20
 1   2   3    4    5   6    7   8   9   10-100   >100
 5   3   1    0    0   0    0   0   0      0       0
Concurrency violations will be written to the SQL Server error log.
DBCC execution completed. If DBCC printed error messages, contact your system administrator.

如果没有对并发冲突计数器启用定期日志记录，DBCC CONCURRENCYVIOLATION 将返回以下结果集（消息）：

Concurrency violations since 2000-02-02 11:03:17.20
 1   2   3    4    5   6    7   8   9   10-100   >100
 5   3   1    0    0   0    0   0   0      0       0
Concurrency violations will not be written to the SQL Server error log.
DBCC execution completed. If DBCC printed error messages, contact your system administrator.
权限

DBCC CONCURRENCYVIOLATION 权限默认授予 sysadmin 固定服务器角色的成员且不可转让。

示例

下例显示当前计数器值，然后重置计数器。

-- Display the current counter values.
DBCC CONCURRENCYVIOLATION
GO
-- Reset the counter values to 0.
DBCC CONCURRENCYVIOLATION(RESET)
GO

请参见

DBCC

桌面上的 SQL Server 2000 数据库


DBCC DBREINDEX

重建指定数据库中表的一个或多个索引。

语法

DBCC DBREINDEX
( [ 'database.owner.table_name'
[ , index_name
[ , fillfactor ]
]
]
) [ WITH NO_INFOMSGS ]

参数

'database.owner.table_name'

是要重建其指定的索引的表名。数据库、所有者和表名必须符合标识符的规则。有关更多信息，请参见使用标识符。如果提供 database 或 owner 部分，则必须使用单引号 (') 将整个 database.owner.table_name 括起来。如果只指定 table_name，则不需要单引号。

index_name

是要重建的索引名。索引名必须符合标识符的规则。如果未指定 index_name 或指定为 ' '，就要对表的所有索引进行重建。

fillfactor

是创建索引时每个索引页上要用于存储数据的空间百分比。fillfactor 替换起始填充因子以作为索引或任何其它重建的非聚集索引（因为已重建聚集索引）的新默认值。如果 fillfactor 为 0，DBCC DBREINDEX 在创建索引时将使用指定的起始 fillfactor。

WITH NO_INFOMSGS

禁止显示所有信息性消息（具有从 0 到 10 的严重级别）。

注释

DBCC DBREINDEX 重建表的索引或为表定义的所有索引。通过允许动态重建索引，可以重建强制 PRIMARY KEY 或 UNIQUE 约束的索引，而不必除去并重新创建这些约束。这意味着不必知道表的结构或约束就可以重建索引，将数据大容量复制到表中后就会出现这种情况。

如果指定 index_name 或 fillfactor，还必须指定以前所有的参数。

DBCC DBREINDEX 可以使用一条语句重建表的所有索引，这比对多个 DROP INDEX 和 CREATE INDEX 语句进行编码容易。由于该工作是通过一条语句完成的，所以 DBCC DBREINDEX 自动为原子性，而单个 DROP INDEX 和 CREATE INDEX 语句要成为原子性则必须放在事务中。另外，与使用单个 DROP INDEX 和 CREATE INDEX 语句相比，DBCC DBREINDEX 可从 DBCC DBREINDEX 的优化性能中更多地获益。

不支持在系统表上使用 DBCC DBREINDEX。

结果集

不管是否指定任何选项（ NO_INFOMSGS 除外），DBCC DBREINDEX 返回以下结果集；下例使用 pubs 数据库的 authors 表（值可能会有变化）：

Index (ID = 1) is being rebuilt.
Index (ID = 2) is being rebuilt.
DBCC execution completed. If DBCC printed error messages, contact your system administrator.

如果指定 NO_INFOMSGS 选项，DBCC DBREINDEX 将返回以下结果集（消息）：

DBCC execution completed. If DBCC printed error messages, contact your system administrator.
权限

DBCC DBREINDEX 权限默认授予表所有者、sysadmin 固定服务器角色或 db_owner 和 db_ddladmin 固定数据库角色的成员且不可转让。

示例
A. 重建某个索引

下例使用填充因子 80 重建 pubs 数据库中 authors 表上的 au_nmind 聚集索引。

DBCC DBREINDEX ('pubs.dbo.authors', UPKCL_auidind, 80)
B. 重建所有索引

下例使用填充因子值 70 重建 authors 表上的所有索引。

DBCC DBREINDEX (authors, '', 70)

请参见

ALTER TABLE

CREATE TABLE

DBCC

表和索引构架


DBCC DBREPAIR

除去损坏的数据库。

重要 在 Microsoft® SQL Server™ 2000 中包括 DBCC DBREPAIR 只是为了向后兼容。建议使用 DROP DATABASE 除去损坏的数据库。在 SQL Server 的将来版本中，可能不支持 DBCC DBREPAIR。

请参见

DBCC

DROP DATABASE


DBCC dllname (FREE)

从内存中卸载指定的扩展存储过程动态链接库 (DLL)。

语法

DBCC dllname ( FREE )

参数

dllname

是要从内存中释放的 DLL 名称。

注释

当执行扩展存储过程时，DLL 仍保持由 Microsoft® SQL Server™ 装载，直到关闭服务器为止。此语句允许从内存中卸载 DLL，而不用关闭 SQL Server。执行 sp_helpextendedproc 以显示当前由 SQL Server 装载的 DLL 文件。

结果集

如果指定有效的 DLL，DBCC dllname (FREE) 将返回以下结果集（消息）：

DBCC execution completed. If DBCC printed error messages, contact your system administrator.
权限

DBCC dllname (FREE) 权限默认授予 sysadmin 固定服务器角色或 db_owner 固定数据库角色的成员且不可转让。

示例

下例假设用 Xp_sample.dll 实现扩展过程 xp_sample 并已执行此扩展过程。并使用 DBCC dllname (FREE) 语句卸载与 xp_sample 扩展过程相关联的 Xp_sample.dll 文件。

DBCC xp_sample (FREE)

请参见

DBCC

扩展存储过程的执行特点

sp_addextendedproc

sp_dropextendedproc

sp_helpextendedproc

卸载扩展存储过程 DLL


DBCC DROPCLEANBUFFERS

从缓冲池中删除所有清除缓冲区。

语法

DBCC DROPCLEANBUFFERS

注释

使用 DBCC DROPCLEANBUFFERS 测试带有冷高速缓存的查询，而不用关闭和重新启动服务器。

结果集
DBCC execution completed. If DBCC printed error messages, contact your system administrator.
权限

DBCC DROPCLEANBUFFERS 权限仅默认授予 sysadmin 固定服务器角色的成员且不可转让。


DBCC FREEPROCCACHE

从过程高速缓存中删除所有元素。

语法

DBCC FREEPROCCACHE

注释

使用 DBCC FREEPROCCACHE 清除过程高速缓存。例如，释放过程高速缓存将导致重新编译某些部分（例如特别 SQL 语句），而不是从高速缓存中对其再使用。

结果集
DBCC execution completed. If DBCC printed error messages, contact your system administrator.
权限

DBCC FREEPROCACHE 权限仅默认授予 sysadmin 和 serveradmin 固定服务器角色的成员且不可转让。


DBCC HELP

返回指定的 DBCC 语句的语法信息。

语法

DBCC HELP ( 'dbcc_statement' | @dbcc_statement_var | '?' )

参数

dbcc_statement | @dbcc_statement_var

是接收语法信息的 DBCC 语句的名称。只提供 DBCC 语句的 DBCC 部分后的部分。例如，提供 CHECKDB 而不是 DBCC CHECKDB。

?

指定 Microsoft® SQL Server™ 返回可为其获得帮助信息的所有 DBCC 语句（去掉语句的"DBCC"部分）。

结果集

DBCC HELP 返回显示指定 DBCC 语句语法的结果集。不同 DBCC 语句之间语法不同。

权限

DBCC HELP 权限仅默认授予 sysadmin 固定服务器角色的成员且不可转让。

示例
A. 使用带变量的 DBCC HELP

下例返回 DBCC CHECKDB 的语法信息。

DECLARE @dbcc_stmt sysname
SET @dbcc_stmt = 'CHECKDB'
DBCC HELP (@dbcc_stmt)
GO
B. 使用带 ? 选项的 DBCC HELP

下例返回可获得相关帮助信息的所有 DBCC 语句。

DBCC HELP ('?')
GO

请参见

DBCC


DBCC INDEXDEFRAG

整理指定的表或视图的聚集索引和辅助索引碎片。

语法

DBCC INDEXDEFRAG
( { database_name | database_id | 0 }
, { table_name | table_id | 'view_name' | view_id }
, { index_name | index_id }
) [ WITH NO_INFOMSGS ]

参数

database_name | database_id | 0

是对其索引进行碎片整理的数据库。数据库名称必须符合标识符的规则。有关更多信息，请参见使用标识符。如果指定 0，则使用当前数据库。

table_name | table_id | 'view_name' | view_id

是对其索引进行碎片整理的表或视图。表名和视图名称必须符合标识符规则。

index_name | index_id

是要进行碎片整理的索引。索引名必须符合标识符的规则。

WITH NO_INFOMSGS

禁止显示所有信息性消息（具有从 0 到 10 的严重级别）。

注释

DBCC INDEXDEFRAG 可以对表或视图上的索引和非聚集索引进行碎片整理。DBCC INDEXDEFRAG 对索引的叶级进行碎片整理，以便页的物理顺序与叶节点从左到右的逻辑顺序相匹配，从而提高索引扫描性能。

DBCC INDEXDEFRAG 还压缩索引页，并在压缩时考虑创建索引时指定的 FILLFACTOR。此压缩所产生的任何空页都将删除。有关 FILLFACTOR 的更多信息，请参见 CREATE INDEX。

如果索引跨越多个文件，则 DBCC INDEXDEFRAG 一次对一个文件进行碎片整理。页不在文件之间迁移。

DBCC INDEXDEFRAG 每隔 5 分钟向用户报告预计完成的百分比。可在进程中的任一点结束 DBCC INDEXDEFRAG，任何已完成的工作都将保留。

与 DBCC DBREINDEX（一般的索引生成操作）不同，DBCC INDEXDEFRAG 是联机操作。它不长期控制锁，因此不会防碍运行查询或更新。若索引的碎片相对较少，则整理该索引的速度比生成一个新索引要快，这是因为碎片整理所需的时间与碎片的数量有关。对碎片太多的索引进行整理可能要比重建花更多的时间。另外，始终对碎片整理进行完整的日志记录，与数据库恢复模型设置无关（请参见 ALTER DATABASE）。对碎片太多的索引进行整理所生成的日志记录可能比完全记录的索引创建还要多。然而，若需经常进行日志备份或如果恢复模型设置是 SIMPLE，碎片整理将作为一系列短事务执行，因此不需要大量的日志。

另外，如果两个索引在磁盘上交叉存取事务，DBCC INDEXDEFRAG 将没有作用，原因是 INDEXDEFRAG 打乱了已有的页。若要改善页的聚集，请重建索引。

不支持在系统表上使用 DBCC INDEXDEFRAG。

结果集

如果没有指定 WITH NO_INFOMSGS，DBCC INDEXDEFRAG 将返回以下结果集（值可能会有变化）：

Pages Scanned Pages Moved Pages Removed
------------- ----------- -------------
359           346         8
    (1 row(s) affected)

DBCC execution completed. If DBCC printed error messages, contact your system administrator.
    权限

    DBCC INDEXDEFRAG 权限默认授予 sysadmin 固定服务器角色或 db_owner 和 db_ddladmin 固定数据库角色的成员以及表的所有者且不可转让。

    示例
    DBCC INDEXDEFRAG (Northwind, Orders, CustomersOrders)
GO


DBCC INPUTBUFFER

显示从客户端发送到 Microsoft® SQL Server™ 的最后一个语句。

语法

DBCC INPUTBUFFER (spid)

参数

spid

是 sp_who 系统存储过程的输出中所显示的用户连接系统进程 ID (SPID)。

结果集

DBCC INPUTBUFFER 返回包含如下列的行集。

列名 | 数据类型 | 描述
EventType | nvarchar(30) | 事件类型，例如：RPC、语言或无事件。
Parameters | Int | 0 = 文本 1- n = 参数
EventInfo | nvarchar(255) | 对于 RPC 的 EventType，EventInfo 仅包含过程名。对于语言或无事件的 EventType，仅显示事件的头 255 个字符。

例如，当缓冲区中的最后事件是 DBCC INPUTBUFFER(11) 时，DBCC INPUTBUFFER 将返回以下结果集。

EventType      Parameters EventInfo
-------------- ---------- ---------------------
Language Event 0          DBCC INPUTBUFFER (11)

(1 row(s) affected)

DBCC execution completed. If DBCC printed error messages, contact your system administrator.

说明 在 Windows NT® 上，当两个事件间没有可以显示的事件时，有非常短的过渡期。在 Windows 98 上，事件仅当活动时才显示。

权限

DBCC INPUTBUFFER 权限默认授予 sysadmin 固定服务器角色的成员，该成员可以看到任何 SPID。其他用户可以看到自己拥有的 SPID。权限不可转让。

示例

下例假设有效的 SPID 为 10。

DBCC INPUTBUFFER (10)

请参见

DBCC

sp_who

跟踪标记


DBCC NEWALLOC

检查数据库的扩展结构内的每个表的数据和索引页的分配。

重要 DBCC NEWALLOC 等同于 DBCC CHECKALLOC，包含在 Microsoft® SQL Server™ 2000 中只是为了向后兼容。建议使用 DBCC CHECKALLOC 对指定数据库中所有页的分配与使用进行检查。在 Microsoft SQL Server 的将来版本中，可能不支持 DBCC NEWALLOC。

请参见

DBCC

DBCC CHECKDB

DBCC CHECKALLOC

sqlmaint 实用工具


DBCC OPENTRAN

如果在指定数据库内存在最旧的活动事务和最旧的分布和非分布式复制事务，则显示与之相关的信息。只有当存在活动事务或数据库包含复制信息时，才显示结果。如果没有活动事务，就显示信息性消息。

语法

DBCC OPENTRAN
( { 'database_name' | database_id} )
[ WITH TABLERESULTS
[ , NO_INFOMSGS ]
]

参数

'database_name'

是显示其中的最旧事务信息的数据库名称。数据库名称必须符合标识符的规则。有关更多信息，请参见使用标识符。

database_id

是要显示其中的最旧事务信息的数据库标识 (ID) 号。通过使用 DB_ID 函数获得数据库 ID。

WITH TABLERESULTS

以报表形式指定结果以便可以装载到表中。使用此选项创建结果表，可以将该结果表插入到表中以进行比较。未指定此选项时，对结果进行格式化以增加可读性。

NO_INFOMSGS

禁止显示所有信息性消息。

注释

如果既没有指定 database_name 也没有指定 database_id，则默认为当前数据库。

使用 DBCC OPENTRAN 确定打开的事务是否存在于日志中。使用 BACKUP LOG 语句时，只可以截断日志的非活动部分；打开的事务可以导致日志不能完全地截断。在 Microsoft® SQL Server™ 的早期版本中，若要清除日志中的未提交事务，必须注销所有用户或关闭并重新启动服务器。如有必要，可以使用 DBCC OPENTRAN 标识并终止打开的事务（通过从 sp_who 输出中获得系统进程 ID）。

结果集

如果没有打开的事务，DBCC OPENTRAN 显示以下结果集：

No active open transactions.
DBCC execution completed. If DBCC printed error messages, contact your system administrator.
权限

DBCC OPENTRAN 权限默认授予 sysadmin 固定服务器角色或 db_owner 固定数据库角色的成员且不可转让。

示例

下例获得当前数据库和 pubs 数据库的事务信息。

-- Display transaction information only for the current database.
DBCC OPENTRAN
GO
-- Display transaction information for the pubs database.
DBCC OPENTRAN('pubs')
GO

请参见

BEGIN TRANSACTION

COMMIT TRANSACTION

DBCC

DB_ID

ROLLBACK TRANSACTION


DBCC OUTPUTBUFFER

以十六进制或 ASCII 格式返回指定系统进程 ID (SPID) 的当前输出缓冲区。

语法

DBCC OUTPUTBUFFER ( spid )

参数

spid

是 sp_who 系统存储过程的输出中所显示的用户连接系统进程 ID。

注释

使用 DBCC OUTPUTBUFFER 时，DBCC OUTPUTBUFFER 显示发送到指定客户端 (spid) 的结果。对于不包含输出流的进程，则返回错误信息。

若要显示所执行的、其返回的结果由 DBCC OUTPUTBUFFER 所显示的语句，请执行 DBCC INPUTBUFFER。

结果集

DBCC OUTPUTBUFFER 返回以下结果集（值可能会有变化）：

Output Buffer
------------------------------------------------------------------------
01fb8028:  04 00 01 5f 00 00 00 00 e3 1b 00 01 06 6d 00 61  ..._.........m.a
01fb8038:  00 73 00 74 00 65 00 72 00 06 6d 00 61 00 73 00  .s.t.e.r..m.a.s.
'...'
01fb8218:  04 17 00 00 00 00 00 d1 04 18 00 00 00 00 00 d1  ................
01fb8228:   .

(33 row(s) affected)

DBCC execution completed. If DBCC printed error messages, contact your system administrator.
权限

DBCC OUTPUTBUFFER 权限仅默认授予 sysadmin 固定服务器角色的成员，这些成员可以看到任何 SPID。权限不可转让。

示例

下例为假定为 13 的 SPID 返回当前输出缓冲区信息。

DBCC OUTPUTBUFFER (13)

请参见

DBCC

sp_who

跟踪标记


DBCC PINTABLE

将表标记为驻留，这表示 Microsoft® SQL Server™ 不从内存中刷新表页。

语法

DBCC PINTABLE ( database_id , table_id )

参数

database_id

是要驻留的表的数据库标识 (ID) 号。若要确定该数据库 ID，请使用 DB_ID 函数。

table_id

是要驻留的表的对象标识号。若要确定表 ID，请使用 OBJECT_ID 函数。

注释

DBCC PINTABLE 不会导致将表读入到内存中。当表中的页由普通的 Transact-SQL 语句读入到高速缓存中时，这些页将标记为内存驻留页。当 SQL Server 需要空间以读入新页时，不会清空内存驻留页。SQL Server 仍然记录对页的更新，并且如有必要，将更新的页写回到磁盘。然而，在使用 DBCC UNPINTABLE 语句使该表不驻留之前，SQL Server 在高速缓存中一直保存可用页的复本。

DBCC PINTABLE 最适用于将小的、经常引用的表保存在内存中。将小表的页一次性读入到内存中，将来对其数据的所有引用都不需要从磁盘读入。

注意 DBCC PINTABLE 可以提供性能改进，但是使用时务必小心。如果驻留大表，则该表在开始时会使用一大部分高速缓存，而不为系统中的其它表保留足够的高速缓存。如果所驻留的表比高速缓存大，则该表会填满整个高速缓存。sysadmin 固定服务器角色的某个成员必须关闭而后重新启动 SQL Server，然后使表不驻留。驻留太多的表和驻留比高速缓存大的表会产生同样的问题。

结果集

下面是结果集：

Warning: Pinning tables should be carefully considered. If a pinned table is larger, or grows larger, than the available data cache, the server may need to be restarted and the table unpinned.
DBCC execution completed. If DBCC printed error messages, contact your system administrator.
权限

DBCC PINTABLE 权限默认授予 sysadmin 固定服务器角色的成员且不可转让。

示例

下例驻留 pubs 数据库中的 authors 表。

DECLARE @db_id int, @tbl_id int
USE pubs
SET @db_id = DB_ID('pubs')
SET @tbl_id = OBJECT_ID('pubs..authors')
DBCC PINTABLE (@db_id, @tbl_id)

请参见

DBCC

内存构架

DBCC UNPINTABLE

sp_tableoption


DBCC PROCCACHE

以报表形式显示有关过程高速缓存的信息。

语法

DBCC PROCCACHE

注释

SQL Server 性能监视器使用 DBCC PROCCACHE 获得有关过程高速缓存的信息。

结果集

下表描述结果集内的列。

列名 | 描述
num proc buffs | 过程高速缓存中可能有的存储过程数。
num proc buffs used | 容纳存储过程的高速缓存槽数。
num proc buffs active | 容纳正在执行的存储过程的高速缓存槽数。
proc cache size | 过程高速缓存的总大小。
proc cache used | 容纳存储过程的过程高速缓存量。
proc cache active | 容纳正在执行的存储过程的过程高速缓存量。

权限

DBCC PROCCACHE 权限默认授予 sysadmin 固定服务器角色或 db_owner 固定数据库角色的成员且不可转让。

请参见

DBCC

内存构架


DBCC ROWLOCK

在 Microsoft® SQL Server™ 6.5 版中使用，对表启用插入行锁定 (IRL) 操作。

重要 在 SQL Server 中，默认启用行级锁定。SQL Server 的锁定策略为行锁定，并可能提升为页或表锁定。DBCC ROWLOCK 不改变 SQL Server的锁定行为（无效），在 Microsoft SQL Server 2000 中包含它只是为了向后与现有的脚本和过程兼容。SQL Server 的将来版本可能不支持 DBCC ROWLOCK。

请参见

DBCC


DBCC SHOW_STATISTICS

显示指定表上的指定目标的当前分布统计信息。

语法

DBCC SHOW_STATISTICS ( table , target )

参数

table

是表名，要显示该表的统计信息。表名必须符合标识符规则。有关更多信息，请参见使用标识符。

target

是对象名（索引名称或集合），要显示该对象的统计信息。目标名称必须符合标识符的规则。如果 target 既是索引名又是统计集合名，将返回索引和列统计信息。如果没有找到指定名称的索引或统计集合，将返回错误。

注释

所返回的结果指明索引的选择性（所返回的密度越低，选择性越大），并提供用于确定索引对查询优化器是否有用的基本信息。所返回的结果基于索引的分发步骤。

若要查看更新统计的最近日期，请使用 STATS_DATE。

结果集

下表描述结果集内的列。

列名 | 描述
Updated | 上一次更新统计的日期和时间。
Rows | 表中的行数。
Rows Sampled | 统计信息的抽样行数。
Steps | 分发步骤数。
Density | 第一个索引列前缀的选择性（不频繁）。
Average key length | 第一个索引列前缀的平均长度。
All density | 索引列前缀集的选择性（频繁）。
Average length | 索引列前缀集的平均长度。
Columns | 为其显示 All density 和 Average length 的索引列前缀的名称。
RANGE_HI_KEY | 柱状图步骤的上部绑定值。
RANGE_ROWS | 位于柱状图步骤内的示例的行数，上部绑定除外。
EQ_ROWS | 示例中值与柱状图步骤的上部绑定值相等的行的数目。
DISTINCT_RANGE_ROWS | 柱状图步骤内非重复值的数目，上部绑定除外。
AVG_RANGE_ROWS | 柱状图步骤内重复值的平均数目，上部绑定除外 (RANGE_ROWS / DISTINCT_RANGE_ROWS for DISTINCT_RANGE_ROWS > 0)。

权限

DBCC SHOW_STATISTICS 权限默认授予 sysadmin 固定服务器角色或 db_owner 和 db_ddladmin 固定数据库角色的成员以及表的所有者且不可转让。

示例

下例显示 authors 表的 UPKCL_auidind 索引的统计信息。

USE pubs
DBCC SHOW_STATISTICS (authors, UPKCL_auidind)
GO

下面是结果集：

Statistics for INDEX 'UPKCL_auidind'.
Updated               Rows   Rows Sampled   Steps   Density
--------------------- ------ -------------- ------- --------------
Mar  1 2000  4:58AM    23    23             23      4.3478262E-2

Average key length
------------------
11.0

(1 row(s) affected)

All density              Average Length           Columns
------------------------ ------------------------ ----------------
4.3478262E-2             11.0                     au_id

(1 row(s) affected)

RANGE_HI_KEY RANGE_ROWS EQ_ROWS DISTINCT_RANGE_ROWS AVG_RANGE_ROWS
------------ ---------- ------- ------------------- --------------
172-32-1176  0.0        1.0     0                   0.0
213-46-8915  0.0        1.0     0                   0.0
238-95-7766  0.0        1.0     0                   0.0
267-41-2394  0.0        1.0     0                   0.0
274-80-9391  0.0        1.0     0                   0.0
341-22-1782  0.0        1.0     0                   0.0
409-56-7008  0.0        1.0     0                   0.0
427-17-2319  0.0        1.0     0                   0.0
472-27-2349  0.0        1.0     0                   0.0
486-29-1786  0.0        1.0     0                   0.0
527-72-3246  0.0        1.0     0                   0.0
648-92-1872  0.0        1.0     0                   0.0
672-71-3249  0.0        1.0     0                   0.0
712-45-1867  0.0        1.0     0                   0.0
722-51-5454  0.0        1.0     0                   0.0
724-08-9931  0.0        1.0     0                   0.0
724-80-9391  0.0        1.0     0                   0.0
756-30-7391  0.0        1.0     0                   0.0
807-91-6654  0.0        1.0     0                   0.0
846-92-7186  0.0        1.0     0                   0.0
893-72-1158  0.0        1.0     0                   0.0
899-46-2035  0.0        1.0     0                   0.0
998-72-3567  0.0        1.0     0                   0.0

(23 row(s) affected)

请参见

CREATE INDEX

CREATE STATISTICS

DBCC

分发内容统计

DROP STATISTICS

sp_autostats

sp_createstats

sp_dboption

STATS_DATE

UPDATE STATISTICS

USE


DBCC SHOWCONTIG

显示指定的表的数据和索引的碎片信息。

语法

DBCC SHOWCONTIG
[ ( { table_name | table_id | view_name | view_id }
[ , index_name | index_id ]
)
]
[ WITH { ALL_INDEXES
| FAST [ , ALL_INDEXES ]
| TABLERESULTS [ , { ALL_INDEXES } ]
[ , { FAST | ALL_LEVELS } ]
}
]

参数

table_name | table_id | view_name | view_id

是要对其碎片信息进行检查的表或视图。如果未指定，则对当前数据库中的所有表和索引视图进行检查。若要获得表或视图 ID，请使用 OBJECT_ID 函数。

index_name | index_id

是要对其碎片信息进行检查的索引。如果未指定，则该语句对指定表或视图的基索引进行处理。若要获得索引 ID，请使用 sysindexes。

WITH

指定由 DBCC 语句所返回的信息类型选项。

FAST

指定是否要对索引执行快速扫描和输出最少信息。快速扫描不读取索引的叶或数据级页。

TABLERESULTS

将结果显示为带有附加信息的行集。

ALL_INDEXES

显示指定表和视图的所有索引的结果（即使指定特定的索引）。

ALL_LEVELS

只能与 TABLERESULTS 选项一起使用。不能与 FAST 选项一起使用。指定是否为所处理的每个索引的每个级别产生输出。如果未指定，将只对索引叶级或表数据级进行处理。

注释

当指定 index_id 时，DBCC SHOWCONTIG 语句将遍历指定索引的叶级上的页链。如果只指定 table_id，或者如果 index_id 为 0，则对指定表的数据页进行扫描。

DBCC SHOWCONTIG 确定表是否高度碎片化。在对表进行数据修改（INSERT、UPDATE 和 DELETE 语句）的过程中会出现表碎片现象。由于这些修改通常并不在表的行中进行平均分布，所以每页的填满状态会随时间而改变。对于扫描部分或全部表的查询，这些表碎片会导致额外的页读取，这将防碍数据的并行扫描。

当索引的碎片非常多时，有两种减少碎片的方法：

  • 除去并重新创建聚集索引。

    重新创建聚集索引将对数据进行重新组织，其结果是使数据页填满。填满程度可以使用 FILLFACTOR 选项进行配置。这种方法的缺点是索引在除去/重新创建周期内为脱机状态，并且操作属原子级。如果中断索引创建，则不会重新创建该索引。

  • 使用 DBCC INDEXDEFRAG 按逻辑顺序重新排序索引的叶级页。

    DBCC INDEXDEFRAG 命令是联机操作，所以索引只有在该命令正在运行时才可用。而且可以在不丢失已完成工作的情况下中断该操作。这种方法的缺点是在重新组织数据方面没有聚集索引的除去/重新创建操作有效。

结果集中的"每页上的平均可用字节数"和"平均页密度（完整）"统计量指出索引页的饱满程度。"每页上的平均可用字节数"的数字应较小，而"平均页密度（完整）"的数字应较大。在指定 FILLFACTOR 选项的情况下除去和重新创建聚集索引可改善这些统计。另外，DBCC INDEXDEFRAG 命令在压缩索引时考虑其 FILLFACTOR，这将改善这些统计。

索引的碎片级可以两种方式确定：

  • 比较"扩展盘区开关数"和"扫描扩展盘区数"的值。

    注意：如果索引跨多个文件，这种确定碎片的方法不起作用。"扩展盘区开关数"的值应尽可能接近于"扫描扩展盘区数"的值。算出这一比率作为"扫描密度"的值，该值应尽可能高。通过前面讨论的减少碎片的任一种方法可改善该值。

  • 理解"逻辑扫描碎片"和"扩展盘区扫描碎片"的值。

    "逻辑扫描碎片"和"扩展盘区扫描碎片"（对于较小的扩展盘区）的值很好地表明了表的碎片级。这些值应尽可能接近零（但 0% 到 10% 的值也可接受）。需要注意的是，如果索引跨多个文件，则"扩展盘区扫描碎片"的值较大。两种减少碎片的方法都可用于减少这些值。

结果集

下表描述结果集内的信息。

统计 | 描述
扫描页数 | 表或索引的页数。
扫描扩展盘区数 | 表或索引中的扩展盘区数。
扩展盘区开关数 | 遍历索引或表的页时，DBCC 语句从一个扩展盘区移动到其它扩展盘区的次数。
平均扩展盘区上的平均页数 | 页链中每个扩展盘区的页数。
扫描密度 [最佳值:实际值] | 最佳值是指在一切都连续地链接的情况下，扩展盘区更改的理想数目。实际值是指扩展盘区更改的实际次数。如果一切都连续，则扫描密度数为 100；如果小于 100，则存在碎片。扫描密度为百分比值。
逻辑扫描碎片 | 对索引的叶级页扫描所返回的无序页的百分比。该数与堆集和文本索引无关。无序页是指在 IAM 中所指示的下一页不同于由叶级页中的下一页指针所指向的页。
扩展盘区扫描碎片 | 无序扩展盘区在扫描索引叶级页中所占的百分比。该数与堆集无关。无序扩展盘区是指：含有索引的当前页的扩展盘区不是物理上的含有索引的前一页的扩展盘区后的下一个扩展盘区。
平均每页上的平均可用字节数 | 所扫描的页上的平均可用字节数。数字越大，页的填满程度越低。数字越小越好。该数还受行大小影响：行大小越大，数字就越大。
平均页密度（完整） | 平均页密度（为百分比）。该值考虑行大小，所以它是页的填满程度的更准确表示。百分比越大越好。

如果指定表 ID 和 FAST 选项，DBCC SHOWCONTIG 将返回仅包含以下列的结果集：

  • 扫描页数

  • 扩展盘区开关数

  • 扫描密度 [最佳值:实际值]

  • 逻辑扫描碎片

如果指定 TABLERESULTS，DBCC SHOWCONTIG 将返回在第一个表中描述的 8 列和以下的附加列。

  • ExtentSwitches

  • AverageFreeBytes

  • AveragePageDensity

  • ScanDensity

  • BestCount

  • ActualCount

  • LogicalFragmentation

  • ExtentFragmentation
统计 | 描述
ObjectName | 处理的表或视图的名称。
ObjectId | 对象名 ID。
IndexName | 处理的索引名。堆集的 IndexName 为 NULL。
IndexId | 索引的 ID。堆集的 IndexId 为 0。
Level | 索引的级别。级别 0 是索引的叶（或数据）级。级别数随着沿树向上移动到索引根而增加。堆集的级别为 0。
Pages | 组成某个索引级或整个堆集的页数。
Rows | 某个索引级上的数据或索引记录数。对于堆集，这是整个堆集中的数据记录数。
MinimumRecordSize | 某个索引级或整个堆集中的最小记录大小。
MaximumRecordSize | 某个索引级或整个堆集中的最大记录大小。
AverageRecordSize | 某个索引级或整个堆集中的平均记录大小。
ForwardedRecords | 某个索引级或整个堆集中的转发记录数。
Extents | 某个索引级或整个堆集中的扩展盘区数。

指定 TABLERESULTS 和 FAST 时，DBCC SHOWCONTIG 将返回如下列。

  • ObjectName

  • ObjectId

  • IndexName

  • IndexId

  • Pages

  • ExtentSwitchs

  • ScanDensity

  • BestCount

  • ActualCount

  • LogicalFragmentation
权限

DBCC SHOWCONTIG 权限默认授予 sysadmin 固定服务器角色或 db_owner 和 db_ddladmin 固定数据库角色的成员以及表的所有者且不可转让。

示例
A. 显示表的碎片信息

下例显示带指定表名的表的碎片信息。

USE Northwind
GO
DBCC SHOWCONTIG (Employees)
GO
B. 使用 OBJECT_ID 获得表 ID 和使用 sysindexes 获得索引 ID

下例使用 OBJECT_ID 和 sysindexes 获得 authors 表的 aunmind 索引的表 ID 和索引 ID。

USE pubs
GO
DECLARE @id int, @indid int
SET @id = OBJECT_ID('authors')
SELECT @indid = indid
FROM sysindexes
WHERE id = @id
   AND name = 'aunmind'
DBCC SHOWCONTIG (@id, @indid)
GO
C. 显示表的简略结果集

下例返回 pubs 数据库中 authors 表的简略结果集。

USE pubs
DBCC SHOWCONTIG ('authors', 1) WITH FAST
D. 显示数据库中每个表上的每个索引的完整结果集

下例显示 pubs 数据库中每个表上的每个索引的完整表结果集。

USE pubs
DBCC SHOWCONTIG WITH TABLERESULTS, ALL_INDEXES
E. 使用 DBCC SHOWCONTIG 和 DBCC INDEXDEFRAG 对数据库中的索引进行碎片整理

下例显示对数据库中碎片数量在声明的阈值之上的所有索引进行碎片整理的简单方法。

/*Perform a 'USE <database name>' to select the database in which to run the script.*/
-- Declare variables
SET NOCOUNT ON
DECLARE @tablename VARCHAR (128)
DECLARE @execstr   VARCHAR (255)
DECLARE @objectid  INT
DECLARE @indexid   INT
DECLARE @frag      DECIMAL
DECLARE @maxfrag   DECIMAL

-- Decide on the maximum fragmentation to allow
SELECT @maxfrag = 30.0

-- Declare cursor
DECLARE tables CURSOR FOR
   SELECT TABLE_NAME
   FROM INFORMATION_SCHEMA.TABLES
   WHERE TABLE_TYPE = 'BASE TABLE'

-- Create the table
CREATE TABLE #fraglist (
   ObjectName CHAR (255),
   ObjectId INT,
   IndexName CHAR (255),
   IndexId INT,
   Lvl INT,
   CountPages INT,
   CountRows INT,
   MinRecSize INT,
   MaxRecSize INT,
   AvgRecSize INT,
   ForRecCount INT,
   Extents INT,
   ExtentSwitches INT,
   AvgFreeBytes INT,
   AvgPageDensity INT,
   ScanDensity DECIMAL,
   BestCount INT,
   ActualCount INT,
   LogicalFrag DECIMAL,
   ExtentFrag DECIMAL)

-- Open the cursor
OPEN tables

-- Loop through all the tables in the database
FETCH NEXT
   FROM tables
   INTO @tablename

WHILE @@FETCH_STATUS = 0
BEGIN
-- Do the showcontig of all indexes of the table
   INSERT INTO #fraglist
   EXEC ('DBCC SHOWCONTIG (''' + @tablename + ''')
      WITH FAST, TABLERESULTS, ALL_INDEXES, NO_INFOMSGS')
   FETCH NEXT
      FROM tables
      INTO @tablename
END

-- Close and deallocate the cursor
CLOSE tables
DEALLOCATE tables

-- Declare cursor for list of indexes to be defragged
DECLARE indexes CURSOR FOR
   SELECT ObjectName, ObjectId, IndexId, LogicalFrag
   FROM #fraglist
   WHERE LogicalFrag >= @maxfrag
      AND INDEXPROPERTY (ObjectId, IndexName, 'IndexDepth') > 0

-- Open the cursor
OPEN indexes

-- loop through the indexes
FETCH NEXT
   FROM indexes
   INTO @tablename, @objectid, @indexid, @frag

WHILE @@FETCH_STATUS = 0
BEGIN
   PRINT 'Executing DBCC INDEXDEFRAG (0, ' + RTRIM(@tablename) + ',
      ' + RTRIM(@indexid) + ') - fragmentation currently '
       + RTRIM(CONVERT(varchar(15),@frag)) + '%'
   SELECT @execstr = 'DBCC INDEXDEFRAG (0, ' + RTRIM(@objectid) + ',
       ' + RTRIM(@indexid) + ')'
   EXEC (@execstr)

   FETCH NEXT
      FROM indexes
      INTO @tablename, @objectid, @indexid, @frag
END

-- Close and deallocate the cursor
CLOSE indexes
DEALLOCATE indexes

-- Delete the temporary table
DROP TABLE #fraglist
GO

请参见

CREATE INDEX

DBCC

DBCC DBREINDEX

DBCC INDEXDEFRAG

DROP INDEX

OBJECT_ID

空间分配和重新使用

sysindexes

表和索引构架


DBCC SHRINKDATABASE

收缩指定数据库中的数据文件大小。

语法

DBCC SHRINKDATABASE
( database_name [ , target_percent ]
[ , { NOTRUNCATE | TRUNCATEONLY } ]
)

参数

database_name

是要收缩的数据库名称。数据库名称必须符合标识符的规则。有关更多信息，请参见使用标识符。

target_percent

是数据库收缩后的数据库文件中所要的剩余可用空间百分比。

NOTRUNCATE

导致在数据库文件中保留所释放的文件空间。如果未指定，将所释放的文件空间释放给操作系统。

TRUNCATEONLY

导致将数据文件中的任何未使用的空间释放给操作系统，并将文件收缩到上一次所分配的大小，从而减少文件大小，而不移动任何数据。不试图重新定位未分配页的行。使用 TRUNCATEONLY 时，忽略 target_percentis。

注释

Microsoft® SQL Server™ 可收缩：

  • 特定数据库的所有数据和日志文件。执行 DBCC SHRINKDATABASE。

  • 一次一个特定数据库中的数据或日志文件。执行 DBCC SHRINKFILE。

DBCC SHRINKDATABASE 以每个文件为单位对数据文件进行收缩。然而，DBCC SHRINKDATABASE 在对日志文件进行收缩时，看起来好像所有的日志文件都存在于一个连续的日志池中。

假设名为 mydb 的数据库有两个数据文件和两个日志文件。这些数据文件和日志文件大小都为 10 MB。第一个数据文件包含 6 MB 数据。

对于每个文件，SQL Server 计算目标大小，即要收缩文件到的大小。当用 target_percent 指定 DBCC SHRINKDATABASE 时，SQL Server 计算的目标大小是收缩后文件中的 target_percent 可用空间大小。例如，如果指定按 target_percent 为 25 收缩 mydb。SQL Server 计算的该文件的目标大小为 8 MB（6 MB 数据加上 2 MB 可用空间）。因此，SQL Server 将任何数据从数据文件的最后 2 MB 中移动到数据文件前 8 MB 的可用空间中，然后对该文件进行收缩。

假设 mydb 的第一个数据文件包含 7 MB 的数据。若将 target_percent 指定为 30，则允许将该数据文件收缩到所要的可用百分比 30。然而，若将 target_percent 指定为 40，就不会收缩该数据文件，因为 SQL Server 不能将文件收缩到比数据当前占有的空间还小的程度。也可以从另一个角度考虑这个问题：40% 要求的可用空间 + 70% 完整的数据文件（10 MB 中的 7 MB）大于 100%。因为所要求的可用百分比加上数据文件占用的当前百分比大于 100%（多出 10%），所以任何大于 30 的 target_size 都不会收缩该数据文件。

对于日志文件，SQL Server 使用 target_percent 以对整个日志的目标大小进行计算；因此，target_percent 是收缩操作后日志中的可用空间大小。之后，整个日志的目标大小可以解释为每个日志文件的目标大小。DBCC SHRINKDATABASE 尝试立即将每个物理日志文件收缩到其目标大小。如果虚拟日志中的所有逻辑日志部分都没有超出日志文件的目标大小，则该文件将成功截断，DBCC SHRINKDATABASE 完成且不显示任何消息。然而，如果虚拟日志中的逻辑日志部分超出其目标大小，则 SQL Server 释放尽可能多的空间并发出一条消息。该消息告诉您需要执行什么操作来移动文件末尾超出虚拟日志的逻辑日志部分。执行完该操作后，可以重新发出 DBCC SHRINKDATABASE 命令以释放剩余的空间。有关收缩事务日志的更多信息，请参见收缩事务日志。

因为日志文件只能收缩到虚拟日志文件边界，所以不可能将日志文件收缩到比虚拟日志文件更小（即使现在没有使用该文件）。例如，可以将数据库的 1 GB 日志文件收缩到只有 128 MB。有关截断的更多信息，请参见截断事务日志。有关确定虚拟日志文件大小的更多信息，请参见虚拟日志文件。

由 DBCC SHRINKDATABASE 计算的数据和日志文件的目标大小始终不小于文件的最小大小。文件的最小大小是在文件最初创建时指定的大小，或是上一次用更改文件大小的操作（如用带有 MODIFY FILE 选项的 ALTER DATABASE 或 DBCC SHRINKFILE）显式设置的大小。例如，如果在执行 CREATE DATABASE 时，将 mydb 的所有数据和日志文件大小都指定为 10 MB，则每个文件的最小大小都为 10 MB。DBCC SHRINKDATABASE 不能收缩任何小于 10 MB 的文件。如果使用带有 MODIFY FILE 选项的 ALTER DATABASE 将其中的一个文件显示增长到 20 MB，则该文件新的最小大小为 20 MB。若要将文件大小收缩到小于其最小大小，请使用 DBCC SHRINKFILE 并指定新大小。执行 DBCC SHRINKFILE 会将文件的最小大小更改为所指定的新大小。

在使用数据文件时，DBCC SHRINKDATABASE 有 NOTRUNCATE 和 TRUNCATEONLY 选项。如果为日志文件指定这两个选项，则将忽略这两个选项。DBCC SHRINKDATABASE 不带任何选项等价于 DBCC SHRINKDATABASE 带有 NOTRUNCATE 选项，后面还要跟着带有 TRUNCATEONLY 选项的 DBCC SHRINKDATABASE。

不论是否指定 target_percent，NOTRUNCATE 选项都执行 DBCC SHRINKDATABASE 的实际数据移动操作（包括将分配页从文件的末尾移动到文件前面的未分配页）。然而，文件末尾的可用空间不会返回给操作系统，文件的物理大小也不会更改。因此，如果指定 NOTRUNCATE 选项，数据文件好像没有收缩。例如，假设再次使用 mydb 数据库，该 mydb 有两个数据文件和两个日志文件。第二个数据文件和第二个日志文件的大小都为 10 MB。执行 DBCC SHRINKDATABASE mydb NOTRUNCATE 时，Microsoft SQL Server 将数据从数据文件的后面几页移动到前面几页中。而文件的大小仍然为 10 MB。

TRUNCATEONLY 选项将文件末尾的所有可用空间收回给操作系统。然而，TRUNCATEONLY 在文件内不执行任何页移动操作。指定的文件只能收缩到上一次分配的大小。如果使用 TRUNCATEONLY 选项指定 target_percent，则忽略后者。

所生成的数据库不能比 model 数据库更小。

要收缩的数据库不必在单用户模式下；其他的用户仍可以在数据库收缩时对其进行工作。这也包括系统数据库。

结果集

下表描述结果集内的列。

列名 | 描述
DbId | SQL Server 试图收缩的文件的数据库标识号。
FileId | SQL Server 试图收缩的文件的文件标识号。
CurrentSize | 文件当前占用的 8KB 页数。
MinimumSize | 文件可以占用的最小 8KB 页数。这与文件的最小大小或最初创建时的大小相对应。
UsedPages | 文件当前使用的 8KB 页数。
EstimatedPages | SQL Server 估计文件能够收缩到的 8KB 页数。

说明 SQL Server 并不显示未收缩的文件的行。

权限

DBCC SHRINKDATABASE 权限默认授予 sysadmin 固定服务器角色或 db_owner 固定数据库角色的成员且不可转让。

示例

下例将 UserDB 用户数据库中的文件减小，以使 UserDB 中的文件有 10% 的可用空间。

DBCC SHRINKDATABASE (UserDB, 10)
GO

请参见

ALTER DATABASE

DBCC

物理数据库文件和文件组


DBCC SHRINKFILE

收缩相关数据库的指定数据文件或日志文件大小。

语法

DBCC SHRINKFILE
( { file_name | file_id }
{ [ , target_size ]
| [ , { EMPTYFILE | NOTRUNCATE | TRUNCATEONLY } ]
}
)

参数

file_name

是已收缩文件的逻辑名称。文件名必须符合标识符的规则。有关更多信息，请参见使用标识符。

file_id

是要收缩的文件的标识 (ID) 号。若要获得文件 ID，请使用 FILE_ID 函数或在当前数据库中搜索 sysfiles。

target_size

是用兆字节表示的所要的文件大小（用整数表示）。如果没有指定，DBCC SHRINKFILE 将文件大小减少到默认文件大小。

如果指定 target_size，DBCC SHRINKFILE 将试图将文件收缩到指定大小。将要释放的文件部分中的已使用页将重新定位到保留的文件部分中的可用空间。例如，如果数据文件为 10MB，则带有 target_size 为 8 的 DBCC SHRINKFILE 将导致文件最后 2 MB 中所有已用页重新分配到文件前 8 MB 中的任何可用槽中。DBCC SHRINKFILE 不会将文件收缩到小于存储文件中的数据所需要的大小。例如，如果使用 10MB 数据文件中的7 MB，带有 target_size 为 6 的 DBCC SHRINKFILE 语句只能将该文件收缩到 7 MB，而不能收缩到 6 MB。

EMPTYFILE

将所有数据从指定文件中迁移到同一文件组中的其它文件。Microsoft® SQL Server™ 不再允许将数据放在用于 EMPTYFILE 选项的文件上。该选项允许使用 ALTER DATABASE 语句除去文件。

NOTRUNCATE

导致将释放的文件空间保留在文件中。

当与 target_size 一起指定 NOTRUNCATE 时，释放的空间不会释放给操作系统。DBCC SHRINKFILE 的唯一影响是将已使用的页从 target_size 行上面重新定位到文件的前面。当未指定 NOTRUNCATE 时，所有释放的文件空间返回给操作系统。

TRUNCATEONLY

导致文件中的任何未使用的空间释放给操作系统，并将文件收缩到上一次分配的大小，从而减少文件大小，而不移动任何数据。不尝试将行重新定位到未分配页。如果使用 TRUNCATEONLY，将忽略 target_size。

注释

DBCC SHRINKFILE 适用于当前数据库中的文件。将上下文切换到数据库，以发出引用该特定数据库中文件的 DBCC SHRINKFILE 语句。有关更改当前数据库的更多信息，请参见 USE。

所生成的数据库不能比 model 数据库更小。

使用 DBCC SHRINKFILE 以将文件减小到比其最初创建时更小。之后，文件的最小大小重置为新指定的大小。

若要删除在文件中可能出现的任何数据，请在执行ALTER DATABASE 之前执行 DBCC SHRINKFILE('file_name', EMPTYFILE)。

要收缩的数据库不必在单用户模式下；收缩文件时，同时其他用户可以在数据库中工作。不必在单用户模式下运行 SQL Server 以对系统数据库进行收缩。

对于日志文件，SQL Server 使用 target_size 以计算整个日志的目标大小；因此，target_size 是收缩操作完成后日志中的可用空间大小。之后，整个日志的目标大小可以解释为每个日志文件的目标大小。DBCC SHRINKFILE 尝试立即将每个物理日志文件收缩至其目标大小。如果虚拟日志中的所有逻辑日志部分都没有超出日志文件的目标大小，该文件将成功截断，DBCC SHRINKFILE 完成且不显示任何消息。然而，如果虚拟日志中的逻辑日志部分超出目标大小，则 SQL Server 释放尽可能多的空间并发出一条消息。该信息告诉您需要执行什么操作来移动文件末尾超出虚拟日志的逻辑日志部分。执行完该操作后，可以重新发出 DBCC SHRINKFILE 命令以释放剩余的空间。有关收缩事务日志的更多信息，请参见收缩事务日志。

因为日志文件只能收缩到虚拟日志文件边界，所以不可能将日志文件收缩到比虚拟日志文件更小（即使现在没有使用该文件）。例如，可以将数据库的 1 GB 日志文件收缩到只有 128 MB。有关截断的更多信息，请参见截断事务日志。有关确定虚拟日志文件大小的更多信息，请参见虚拟日志文件。

结果集

下表描述结果集内的列。

列名 | 描述
DbId | SQL Server 试图收缩的文件的数据库标识号。
FileId | SQL Server 试图收缩的文件的文件标识号。
CurrentSize | 文件当前占用的 8KB 页数。
MinimumSize | 文件可以占用的最小 8KB 页数。这与文件的最小大小或最初创建时的大小相对应。
UsedPages | 文件当前使用的 8KB 页数。
EstimatedPages | SQL Server 估计文件能够收缩到的 8KB 页数。

权限

DBCC SHRINKFILE 权限默认授予 sysadmin 固定服务器角色或 db_owner 固定数据库角色的成员且不可转让。

示例

下例将 UserDB 用户数据库中名为 DataFil1 的文件收缩到 7 MB。

USE UserDB
GO
DBCC SHRINKFILE (DataFil1, 7)
GO

请参见

ALTER DATABASE

DBCC

FILE_ID

物理数据库文件和文件组

sysfiles


DBCC SQLPERF

提供有关所有数据库中的事务日志空间使用情况的统计信息。

语法

DBCC SQLPERF ( LOGSPACE )

注释

事务日志积累每个数据库中数据的更改信息。由 DBCC SQLPERF(LOGSPACE) 返回的信息可用于监视使用的空间大小，并指明何时对事务日志进行备份或截断。

结果集

下表描述结果集内的列。

列名 | 定义
Database Name | 数据库名称，为该数据库显示日志统计信息。
Log Size (MB) | 日志的可用空间的实际大小。该大小比当初为日志空间分配的要小，因为 Microsoft® SQL Server™ 保留一小部分磁盘空间用于内部头信息。
Log Space Used (%) | 事务日志信息当前所占用的日志文件的百分比。
Status | 日志文件状态（总是包含 0）。

权限

DBCC SQLPERF 对任何用户默认权限。

示例

下例显示当前安装的所有数据库的 LOGSPACE 信息。

DBCC SQLPERF(LOGSPACE)
GO

下面是结果集：

Database Name Log Size (MB) Log Space Used (%) Status
------------- ------------- ------------------ -----------
pubs                1.99219            4.26471           0
msdb                3.99219            17.0132           0
tempdb              1.99219            1.64216           0
model                   1.0            12.7953           0
master              3.99219            14.3469           0

请参见

DBCC

sp_spaceused


DBCC TRACEOFF

禁用指定的跟踪标记。

语法

DBCC TRACEOFF ( trace# [ ,...n ] )

参数

trace#

是要禁用的跟踪标记号。

n

是表示可指定多个跟踪标记的占位符。

注释

跟踪标记用于自定义某些控制 Microsoft® SQL Server™ 操作方式的特性。

若要查找有关跟踪标记状态的信息，请使用 DBCC TRACESTATUS。若要启用某些跟踪标记，请使用 DBCC TRACEON。

结果集

DBCC TRACEOFF 返回以下结果集（消息）：

DBCC execution completed. If DBCC printed error messages, contact your system administrator.
权限

DBCC TRACEOFF 权限仅默认授予 sysadmin 固定服务器角色的成员且不可转让。

示例

下例禁用跟踪标记 3205 的效果。

DBCC TRACEOFF (3205)
GO

请参见

DBCC

DBCC TRACEON

DBCC TRACESTATUS

跟踪标记


DBCC TRACEON

打开（启用）指定的跟踪标记。

语法

DBCC TRACEON ( trace# [ ,...n ] )

参数

trace#

是要打开的跟踪标记号。

n

是表示可指定多个跟踪标记的占位符。

注释

跟踪标记用于自定义某些控制 Microsoft® SQL Server™ 操作方式的特性。跟踪标记在服务器中一直保持启用状态，直到通过执行 DBCC TRACEOFF 语句对其禁用为止。在发出 DBCC TRACEON 语句之前，连入到服务器的新连接看不到任何跟踪标记。一旦发出该语句，该连接就能看到服务器中当前启用的所有跟踪标记（即使这些标记是由其它连接启用）。

有关跟踪标记状态的更多信息，请参见 DBCC TRACESTATUS。

结果集

DBCC TRACEON 返回以下结果集（消息）：

DBCC execution completed. If DBCC printed error messages, contact your system administrator.
权限

DBCC TRACEON 权限仅默认授予 sysadmin 固定服务器角色的成员且不可转让。

示例

下例禁用磁带驱动程序的硬件压缩。

DBCC TRACEON (3205)
GO

请参见

DBCC

DBCC TRACEOFF

DBCC TRACESTATUS

跟踪标记


DBCC TRACESTATUS

显示跟踪标记的状态。

语法

DBCC TRACESTATUS ( trace# [ ,...n ] )

参数

trace#

是将显示其状态的跟踪标记号。

n

是表示可指定多个跟踪标记的占位符。

结果集

DBCC TRACESTATUS 返回跟踪标记号列和状态列，指明跟踪标记是 ON (1) 还是 OFF (0)。若要获取当前打开的所有跟踪标记的状态信息，请将 trace# 指定为 – 1。

注释

若要启用某些跟踪标记，请使用 DBCC TRACEON。若要禁用跟踪标记，请使用 DBCC TRACEOFF。

权限

DBCC TRACESTATUS 权限默认授予任何用户。

示例
A. 显示当前启用的所有跟踪标记的状态

下例通过将值指定为 –1 来显示当前启用的所有跟踪标记的状态。

DBCC TRACESTATUS(-1)
GO
B. 显示多个跟踪标记的状态

下例显示跟踪标记 2528 和 3205 的状态。

DBCC TRACESTATUS (2528, 3205)
GO

请参见

DBCC

DBCC TRACEOFF

DBCC TRACEON

跟踪标记


DBCC UNPINTABLE

将表标记为不在内存驻留。将表标记为不在内存驻留后，可以清空高速缓存中的表页。

语法

DBCC UNPINTABLE ( database_id , table_id )

参数

database_id

是含有要驻留的表的数据库的数据库标识 (ID) 号。若要获得数据库 ID，请使用 DB_ID。

table_id

是要驻留的表的对象 ID。若要确定对象 ID，请使用 OBJECT_ID。

注释

DBCC UNPINTABLE 不会导致立即将表从数据高速缓存中清空。而指定如果需要空间以从磁盘中读入新页，高速缓存中的表的所有页都可以清空。

结果集

DBCC UNPINTABLE 返回以下结果集（消息）：

DBCC execution completed. If DBCC printed error messages, contact your system administrator.
权限

DBCC UNPINTABLE 权限默认授予 sysadmin 固定服务器角色的成员且不可转让。

示例

下例使 pubs 数据库中的 authors 表不驻留。

DECLARE @db_id int, @tbl_id int
USE pubs
SET @db_id = DB_ID('pubs')
SET @tbl_id = OBJECT_ID('pubs..authors')
DBCC UNPINTABLE (@db_id, @tbl_id)

请参见

DB_ID

DBCC

DBCC PINTABLE

内存构架

OBJECT_ID

sp_tableoption


DBCC UPDATEUSAGE

报告和更正 sysindexes 表的不正确内容，该内容可能会导致通过 sp_spaceused 系统存储过程产生不正确的空间使用报表。

语法

DBCC UPDATEUSAGE
( { 'database_name' | 0 }
[ , { 'table_name' | 'view_name' }
[ , { index_id | 'index_name' } ] ]
)
[ WITH [ COUNT_ROWS ] [ , NO_INFOMSGS ]
]

参数

'database_name' | 0

是要对其空间使用统计信息进行报告和更正的数据库名称。数据库名称必须符合标识符的规则。有关更多信息，请参见使用标识符。如果指定 0，则使用当前数据库。

'table_name' | 'view_name'

是要对其空间使用统计信息进行报告和更正的表名或索引名。表名和视图名称必须符合标识符规则。

index_id | 'index_name'

是要使用的索引标识 (ID) 号或索引名。如果未指定，该语句就对指定表或索引的所有索引进行处理。

COUNT_ROWS

指定使用表或视图中的行数计数来更新 sysindexes 的 rows 列。这只适用于其 indid 为 0 或 1 的 sysindexes 行。该选项可能会影响大表和索引视图的性能。

NO_INFOMSGS

禁止显示所有信息性消息。

注释

DBCC UPDATEUSAGE 对表和聚集索引中 sysindexes 表的 rows、used、reserved 和 dpages 列进行更正。不对非聚集索引的大小信息进行维护。

如果 sysindexes 中没有不正确的内容，DBCC UPDATEUSAGE 则不返回数据。如果发现不正确的内容，并对其进行更正，同时没有使用 WITH NO_INFOMSGS 选项，UPDATEUSAGE 就会返回 sysindexes 中所更新的行和列。

使用 UPDATEUSAGE 以与空间使用计数器同步。DBCC UPDATEUSAGE 在大表或大数据库上运行可能会需要一些时间，所以通常只在怀疑 sp_spaceused 所返回的值不正确时使用。返回表或索引的空间信息之前，sp_spaceused 接受可选参数以运行 DBCC UPDATEUSAGE。

结果集

DBCC UPDATEUSAGE 返回 Northwind 数据库的以下结果集（值可能会有变化）：

DBCC UPDATEUSAGE: sysindexes row updated for table 'Orders' (index ID 4):
        USED pages: Changed from (2) to (4) pages.
        RSVD pages: Changed from (2) to (4) pages.
DBCC UPDATEUSAGE: sysindexes row updated for table 'Orders' (index ID 5):
        USED pages: Changed from (2) to (4) pages.
        RSVD pages: Changed from (2) to (4) pages.
'...'
DBCC execution completed. If DBCC printed error messages, contact your system administrator.
权限

DBCC UPDATEUSAGE 权限默认授予 sysadmin 固定服务器角色或 db_owner 固定数据库角色的成员且不可转让。

示例
A. 通过为当前数据库指定 0 更新 sysindexes

下例为数据库名称指定 0，而 Microsoft® SQL Server™ 报告有关当前数据库的信息。

DBCC UPDATEUSAGE (0)
GO
B. 为 pubs 更新 sysindexes，禁止显示信息性消息

下例将 pubs 指定为数据库名称，并禁止显示所有信息性消息。

DBCC UPDATEUSAGE ('pubs') WITH NO_INFOMSGS
GO
C. 更新 authors 表的 sysindexes

下例报告有关 authors 表的信息。

DBCC UPDATEUSAGE ('pubs','authors')
GO
D. 更新指定索引的 sysindexes

下例使用索引名 UPKCL_auidind。

DBCC UPDATEUSAGE ('pubs', 'authors', 'UPKCL_auidind')

请参见

DBCC

sp_spaceused

sysindexes

表和索引构架

UPDATE STATISTICS


DBCC USEROPTIONS

返回当前连接的活动（设置）的 SET 选项。

语法

DBCC USEROPTIONS

结果集

DBCC USEROPTIONS 返回以下结果集（值和项可能会变化）：

Set Option                   Value
---------------------------- -------------------------------------------
textsize                     64512
language                     us_english
dateformat                   mdy
datefirst                    7
ansi_null_dflt_on            SET
ansi_warnings                SET
ansi_padding                 SET
ansi_nulls                   SET
concat_null_yields_null      SET

(9 row(s) affected)

DBCC execution completed. If DBCC printed error messages, contact your system administrator.

DBCC USEROPTIONS 返回 SET 选项的名称列和该选项的设置列。

权限

DBCC USEROPTIONS 对任何用户默认权限。

示例

下例返回当前连接的活动 SET 选项。

DBCC USEROPTIONS

请参见

DBCC

自定义事务隔离级别

SET

SET TRANSACTION ISOLATION LEVEL


DEALLOCATE

删除游标引用。当释放最后的游标引用时，组成该游标的数据结构由 Microsoft® SQL Server™ 释放。

语法

DEALLOCATE { { [ GLOBAL ] cursor_name } | @cursor_variable_name }

参数

cursor_name

是已声明游标的名称。当全局和局部游标都以 cursor_name 作为它们的名称存在时，如果指定 GLOBAL，则 cursor_name 引用全局游标，如果未指定 GLOBAL，则 cursor_name 引用局部游标。

@cursor_variable_name

是 cursor 变量的名称。@cursor_variable_name 必须为 cursor 类型。

注释

对游标进行操作的语句使用游标名称或游标变量引用游标。DEALLOCATE 删除游标与游标名称或游标变量之间的关联。如果一个名称或变量是最后引用游标的名称或变量，则将释放游标，游标使用的任何资源也随之释放。用于保护提取隔离的滚动锁在 DEALLOCATE 上释放。用于保护更新（包括通过游标进行的定位更新）的事务锁一直到事务结束才释放。

DECLARE CURSOR 语句分配游标并使其与游标名称关联：

DECLARE abc SCROLL CURSOR FOR
SELECT * FROM authors

游标名称与某个游标关联之后，该游标在释放之前不能用作相同作用域（GLOBAL 或 LOCAL）内另一个游标的名称。

游标变量使用下列两种方法之一与游标关联：

  • 通过名称，使用 SET 语句将游标设置为游标变量：
    DECLARE @MyCrsrRef CURSOR
SET @MyCrsrRef = abc
  • 也可以不定义游标名称而创建游标并使其与变量关联：
    DECLARE @MyCursor CURSOR
SET @MyCursor = CURSOR LOCAL SCROLL FOR
SELECT * FROM titles

DEALLOCATE @cursor_variable_name 语句只删除对游标命名变量的引用。直到批处理、存储过程或触发器结束时变量离开作用域，才释放变量。在 DEALLOCATE @cursor_variable_name 语句之后，可以使用 SET 语句使变量与另一个游标关联。

USE pubs
GO
DECLARE @MyCursor CURSOR
SET @MyCursor = CURSOR LOCAL SCROLL FOR
SELECT * FROM titles

DEALLOCATE @MyCursor

SET @MyCursor = CURSOR LOCAL SCROLL FOR
SELECT * FROM sales
GO

不必显式释放游标变量。变量在离开作用域时被隐性释放。

权限

默认情况下，将 DEALLOCATE 权限授予任何有效用户。

示例

下面的脚本显示游标如何持续到最后的名称或持续到引用它们的变量已释放。

USE pubs
GO
-- Create and open a global named cursor that
-- is visible outside the batch.
DECLARE abc CURSOR GLOBAL SCROLL FOR
SELECT * FROM authors
OPEN abc
GO
-- Reference the named cursor with a cursor variable.
DECLARE @MyCrsrRef1 CURSOR
SET @MyCrsrRef1 = abc
-- Now deallocate the cursor reference.
DEALLOCATE @MyCrsrRef1
-- Cursor abc still exists.
FETCH NEXT FROM abc
GO
-- Reference the named cursor again.
DECLARE @MyCrsrRef2 CURSOR
SET @MyCrsrRef2 = abc
-- Now deallocate cursor name abc.
DEALLOCATE abc
-- Cursor still exists, referenced by @MyCrsrRef2.
FETCH NEXT FROM @MyCrsrRef2
-- Cursor finally is deallocated when last referencing
-- variable goes out of scope at the end of the batch.
GO
-- Create an unnamed cursor.
DECLARE @MyCursor CURSOR
SET @MyCursor = CURSOR LOCAL SCROLL FOR
SELECT * FROM titles
-- The following statement deallocates the cursor
-- because no other variables reference it.
DEALLOCATE @MyCursor
GO

请参见

CLOSE

游标

DECLARE @local_variable

FETCH

OPEN


decimal 和 numeric

带定点精度和小数位数的 numeric 数据类型。

decimal[(p[, s])] 和 numeric[(p[, s])]

定点精度和小数位数。使用最大精度时，有效值从 - 10^38 +1 到 10^38 - 1。decimal 的 SQL-92 同义词是 dec 和 dec(p, s)。

p（精度）

指定小数点左边和右边可以存储的十进制数字的最大个数。精度必须是从 1 到最大精度之间的值。最大精度为 38。

s（小数位数）

指定小数点右边可以存储的十进制数字的最大个数。小数位数必须是从 0 到 p 之间的值。默认小数位数是 0，因而 0 <= s <= p。最大存储大小基于精度而变化。

精度 | 存储字节数
1 - 9 | 5
10-19 | 9
20-28 | 13
29-38 | 17

请参见

ALTER TABLE

CAST 和 CONVERT

CREATE TABLE

数据类型转换

数据类型

DECLARE @local_variable

DELETE

INSERT

SET @local_variable

使用启动选项

UPDATE


DECLARE @local_variable

在批处理或过程的正文中用 DECLARE 语句声明变量，并用 SET 或 SELECT 语句给其指派值。游标变量可通过该语句声明，并且可用在其它与游标相关的语句中。所有变量在声明后均初始化为 NULL。

语法

DECLARE
{{ @local_variable data_type }
| { @cursor_variable_name CURSOR }
| { table_type_definition }
} [ ,...n]

< table_type_definition > ::=
TABLE ( { < column_definition > | < table_constraint > } [ ,...]
)

< column_definition > ::=
column_name scalar_data_type
[ COLLATE collation_ name ]
[ [ DEFAULT constant_expression ] | IDENTITY [ ( seed , increment ) ] ]
[ ROWGUIDCOL ]
[ < column_constraint > ]

< column_constraint > ::=
{ [ NULL | NOT NULL ]
| [ PRIMARY KEY | UNIQUE ]
| CHECK ( logical_expression )
}

< table_constraint > ::=
{ { PRIMARY KEY | UNIQUE } ( column_name [ ,...] )
| CHECK ( search_condition )
}

参数

@local_variable

是变量的名称。变量名必须以 at 符 (@) 开头。局部变量名必须符合标识符规则。有关更多信息，请参见使用标识符。

data_type

是任何由系统提供的或用户定义的数据类型。变量不能是 text、ntext 或 image 数据类型。有关系统数据类型的更多信息，请参见数据类型。有关用户定义数据类型的更多信息，请参见 sp_addtype。

@cursor_variable_name

是游标变量的名称。游标变量名必须以 at 符 (@) 开头并遵从标识符规则。

CURSOR

指定变量是局部游标变量。

table_type_definition

定义表数据类型。表声明包括列定义、名称、数据类型和约束。允许的约束类型只包括 PRIMARY KEY、UNIQUE KEY、NULL 和 CHECK。

table_type_definition 是在 CREATE TABLE 中用于定义表的信息子集。元素和基本定义都包含在该定义中；有关更多信息，请参见 CREATE TABLE。

n

是表示可以指定多个变量并对变量赋值的占位符。当声明表变量时，表变量必须是 DECLARE 语句中正在声明的唯一变量。

column_name

是表中的列名。

scalar_data_type

指定列是标量数据类型。

[COLLATE collation_name]

指定列的排序规则。collation_name 可以是 Windows 排序规则名称或 SQL 排序规则名称，且只适用于 char、varchar、text、nchar、nvarchar 和 ntext 数据类型的列。如果没有指定，则可给列指定用户定义数据类型的排序规则（如果列为用户定义数据类型）或数据库的默认排序规则。

有关 Windows 和 SQL 排序规则名称的更多信息，请参见 COLLATE。

DEFAULT

如果在插入过程中未显式提供值，则指定为列提供的值。DEFAULT 定义可适用于除定义为 timestamp 或带 IDENTITY 属性的列以外的任何列。除去表时，将删除 DEFAULT 定义。只有常量值（如字符串）、系统函数（如 SYSTEM_USER()）或 NULL 可用作默认参数。为保持与 SQL Server 早期版本的兼容，可以给 DEFAULT 指派约束名。

constant_expression

是用作列的默认值的常量、NULL 或系统函数。

IDENTITY

表示新列是标识列。在表中添加新行时，SQL Server 为列提供一个唯一的增量值。标识列通常与 PRIMARY KEY 约束一起用作表的唯一行标识符。可以将 IDENTITY 属性指派给 tinyint、smallint、int、decimal(p,0) 或 numeric(p,0) 列。对于每个表只能创建一个标识列。不能对标识列使用绑定默认值和 DEFAULT 约束。必须同时指定种子和增量，或者都不指定。如果二者都未指定，则取默认值 (1,1)。

seed

是装入表的第一行所使用的值。

increment

是添加到以前装载的列标识值的增量值。

ROWGUIDCOL

表示新列是行的全局唯一标识符列。对于每个表只能指派一个 uniqueidentifier 列作为 ROWGUIDCOL 列。ROWGUIDCOL 属性只能指派给 uniqueidentifier 列。

NULL | NOT NULL

是决定在列中是否允许空值的关键字。

PRIMARY KEY

是通过唯一索引对给定的一列或多列强制实体完整性的约束。对于每个表只能创建一个 PRIMARY KEY 约束。

UNIQUE

是通过唯一索引为给定的一列或多列提供实体完整性的约束。一个表可以有多个 UNIQUE 约束。

CHECK

是通过限制可输入到一列或多列中的可能值强制域完整性的约束。

logical_expression

是返回 TRUE 或 FALSE 的逻辑表达式。

注释

变量常用在批处理或过程中，作为 WHILE、LOOP 或 IF...ELSE 块的计数器。

变量只能用在表达式中，不能代替对象名或关键字。若要构造动态 SQL 语句，请使用 EXECUTE。

局部变量的作用域是在其中声明局部变量的批处理、存储过程或语句块。有关在语句块内使用局部变量的更多信息，请参见使用 BEGIN...END。

当前给其指派有游标的游标变量可在下列语句中作为源引用：

  • CLOSE 语句。

  • DEALLOCATE 语句。

  • FETCH 语句。

  • OPEN 语句。

  • 定位 DELETE 或 UPDATE 语句。

  • SET CURSOR 变量语句（在右侧）。

在所有这些语句中，如果引用的游标变量存在，但是不具有当前分配给它的游标，那么 Microsoft® SQL Server™ 会产生错误。如果引用的游标变量不存在，SQL Server 将产生对另外一类未声明变量所产生的相同错误。

游标变量：

  • 可以是游标类型或另一个游标变量的目标。有关更多信息，请参见 SET @local_variable。

  • 可以在 EXECUTE 语句中作为输出游标参数的目标引用（如果当前没有给游标变量指派游标）。

  • 应被看作是指向游标的指针。有关游标变量的更多信息，请参见 Transact-SQL 游标。
示例
A. 使用 DECLARE

下例使用名为 @find 的局部变量检索所有姓以 Ring 开头的作者信息。

USE pubs
DECLARE @find varchar(30)
SET @find = 'Ring%'
SELECT au_lname, au_fname, phone
FROM authors
WHERE au_lname LIKE @find

下面是结果集：

au_lname                               au_fname             phone
-------------------------------------- -------------------- ------------
Ringer                                 Anne                 801 826-0752
Ringer                                 Albert               801 826-0752

(2 row(s) affected)
B. 在 DECLARE 中使用两个变量

下例从 Binnet & Hardley (pub_id = 0877) 的雇员中检索从 1993 年 1 月 1 日起所雇佣的雇员名称。

USE pubs
SET NOCOUNT ON
GO
DECLARE @pub_id char(4), @hire_date datetime
SET @pub_id = '0877'
SET @hire_date = '1/01/93'
-- Here is the SELECT statement syntax to assign values to two local
-- variables.
-- SELECT @pub_id = '0877', @hire_date = '1/01/93'
SET NOCOUNT OFF
SELECT fname, lname
FROM employee
WHERE pub_id = @pub_id and hire_date >= @hire_date

下面是结果集：

fname                lname
-------------------- ------------------------------
Anabela              Domingues
Paul                 Henriot

(2 row(s) affected)

请参见

EXECUTE

函数

SELECT

table


DECLARE CURSOR

定义 Transact-SQL 服务器游标的特性，例如游标的滚动行为和用于生成游标对其进行操作的结果集的查询。DECLARE CURSOR 接受基于 SQL-92 标准的语法和使用一组 Transact-SQL 扩展的语法。

SQL-92 语法

DECLARE cursor_name [ INSENSITIVE ] [ SCROLL ] CURSOR
FOR select_statement
[ FOR { READ ONLY | UPDATE [ OF column_name [ ,...n ] ] } ]

Transact-SQL 扩展语法

DECLARE cursor_name CURSOR
[ LOCAL | GLOBAL ]
[ FORWARD_ONLY | SCROLL ]
[ STATIC | KEYSET | DYNAMIC | FAST_FORWARD ]
[ READ_ONLY | SCROLL_LOCKS | OPTIMISTIC ]
[ TYPE_WARNING ]
FOR select_statement
[ FOR UPDATE [ OF column_name [ ,...n ] ] ]

SQL-92 参数

cursor_name

是所定义的 Transact-SQL 服务器游标名称。cursor_name 必须遵从标识符规则。有关标识符规则的更多信息，请参见使用标识符。

INSENSITIVE

定义一个游标，以创建将由该游标使用的数据的临时复本。对游标的所有请求都从 tempdb 中的该临时表中得到应答；因此，在对该游标进行提取操作时返回的数据中不反映对基表所做的修改，并且该游标不允许修改。使用 SQL-92 语法时，如果省略 INSENSITIVE，（任何用户）对基表提交的删除和更新都反映在后面的提取中。

SCROLL

指定所有的提取选项（FIRST、LAST、PRIOR、NEXT、RELATIVE、ABSOLUTE）均可用。如果在 SQL-92 DECLARE CURSOR 中未指定 SCROLL，则 NEXT 是唯一支持的提取选项。如果指定 SCROLL，则不能也指定 FAST_FORWARD。

select_statement

是定义游标结果集的标准 SELECT 语句。在游标声明的 select_statement 内不允许使用关键字 COMPUTE、COMPUTE BY、FOR BROWSE 和 INTO。

如果 select_statement 中的子句与所请求的游标类型的功能发生冲突，则 Microsoft® SQL Server™ 隐性地将游标转换为另一种类型。有关更多信息，请参见隐性游标转换。

READ ONLY

Prevents updates made through this cursor.在 UPDATE 或 DELETE 语句的 WHERE CURRENT OF 子句中不能引用游标。该选项替代要更新的游标的默认功能。

UPDATE [OF column_name [,...n]]

定义游标内可更新的列。如果指定 OF column_name [,...n] 参数，则只允许修改所列出的列。如果在 UPDATE 中未指定列的列表，则可以更新所有列。

Transact-SQL 扩展参数

cursor_name

是所定义的 Transact-SQL 服务器游标名称。cursor_name 必须遵从标识符规则。有关标识符规则的更多信息，请参见使用标识符。

LOCAL

指定该游标的作用域对在其中创建它的批处理、存储过程或触发器是局部的。该游标名称仅在这个作用域内有效。在批处理、存储过程、触发器或存储过程 OUTPUT 参数中，该游标可由局部游标变量引用。OUTPUT 参数用于将局部游标传递回调用批处理、存储过程或触发器，它们可在存储过程终止后给游标变量指派参数使其引用游标。除非 OUTPUT 参数将游标传递回来，否则游标将在批处理、存储过程或触发器终止时隐性释放。如果 OUTPUT 参数将游标传递回来，游标在最后引用它的变量释放或离开作用域时释放。

GLOBAL

指定该游标的作用域对连接是全局的。在由连接执行的任何存储过程或批处理中，都可以引用该游标名称。该游标仅在脱接时隐性释放。

说明 如果 GLOBAL 和 LOCAL 参数都未指定，则默认值由 default to local cursor 数据库选项的设置控制。在 SQL Server 7.0 版中，该选项默认为 FALSE 以与 SQL Server 早期版本相匹配，在 SQL Server 早期版本中所有游标都是全局的。该选项的默认值在以后的 SQL Server 版本中可能会更改。有关更多信息，请参见设置数据库选项。

FORWARD_ONLY

指定游标只能从第一行滚动到最后一行。FETCH NEXT 是唯一受支持的提取选项。如果在指定 FORWARD_ONLY 时不指定 STATIC、KEYSET 和 DYNAMIC 关键字，则游标作为 DYNAMIC 游标进行操作。如果 FORWARD_ONLY 和 SCROLL 均未指定，除非指定 STATIC、KEYSET 或 DYNAMIC 关键字，否则默认为 FORWARD_ONLY。STATIC、KEYSET 和 DYNAMIC 游标默认为 SCROLL。与 ODBC 和 ADO这类数据库 API 不同，STATIC、KEYSET 和 DYNAMIC Transact-SQL 游标支持 FORWARD_ONLY。FAST_FORWARD 和 FORWARD_ONLY 是互斥的；如果指定一个，则不能指定另一个。

STATIC

定义一个游标，以创建将由该游标使用的数据的临时复本。对游标的所有请求都从 tempdb 中的该临时表中得到应答；因此，在对该游标进行提取操作时返回的数据中不反映对基表所做的修改，并且该游标不允许修改。

KEYSET

指定当游标打开时，游标中行的成员资格和顺序已经固定。对行进行唯一标识的键集内置在 tempdb 内一个称为 keyset 的表中。对基表中的非键值所做的更改（由游标所有者更改或由其它用户提交）在用户滚动游标时是可视的。其他用户进行的插入是不可视的（不能通过 Transact-SQL 服务器游标进行插入）。如果某行已删除，则对该行的提取操作将返回 @@FETCH_STATUS 值 -2。从游标外更新键值类似于删除旧行后接着插入新行的操作。含有新值的行不可视，对含有旧值的行的提取操作将返回 @@FETCH_STATUS 值 -2。如果通过指定 WHERE CURRENT OF 子句用游标完成更新，则新值可视。

DYNAMIC

定义一个游标，以反映在滚动游标时对结果集内的行所做的所有数据更改。行的数据值、顺序和成员在每次提取时都会更改。动态游标不支持 ABSOLUTE 提取选项。

FAST_FORWARD

指定启用了性能优化的 FORWARD_ONLY、READ_ONLY 游标。如果指定 FAST_FORWARD，则不能也指定 SCROLL 或 FOR_UPDATE。FAST_FORWARD 和 FORWARD_ONLY 是互斥的；如果指定一个，则不能指定另一个。

READ_ONLY

禁止通过该游标进行更新。在 UPDATE 或 DELETE 语句的 WHERE CURRENT OF 子句中不能引用游标。该选项替代要更新的游标的默认功能。

SCROLL_LOCKS

指定确保通过游标完成的定位更新或定位删除可以成功。当将行读入游标以确保它们可用于以后的修改时，Microsoft® SQL Server™ 会锁定这些行。如果还指定了 FAST_FORWARD，则不能指定 SCROLL_LOCKS。

OPTIMISTIC

指定如果行自从被读入游标以来已得到更新，则通过游标进行的定位更新或定位删除不成功。当将行读入游标时 SQL Server 不锁定行。相反，SQL Server 使用 timestamp 列值的比较，或者如果表没有 timestamp 列则使用校验值，以确定将行读入游标后是否已修改该行。如果已修改该行，尝试进行的定位更新或定位删除将失败。如果还指定了 FAST_FORWARD，则不能指定 OPTIMISTIC。

TYPE_WARNING

指定如果游标从所请求的类型隐性转换为另一种类型，则给客户端发送警告消息。

select_statement

是定义游标结果集的标准 SELECT 语句。在游标声明的 select_statement 内不允许使用关键字 COMPUTE、COMPUTE BY、FOR BROWSE 和 INTO。

如果 select_statement 内的子句与所请求的游标类型冲突，SQL Server 将游标隐性转换成另一种类型。有关更多信息，请参见隐性游标转换。

UPDATE [OF column_name [,...n]]

定义游标内可更新的列。如果提供了 OF column_name [,...n]，则只允许修改列出的列。如果在 UPDATE 中未指定列的列表，除非指定了 READ_ONLY 并发选项，否则所有列均可更新。

注释

DECLARE CURSOR 定义 Transact-SQL 服务器游标的特性，例如游标的滚动行为和用于生成游标对其进行操作的结果集的查询。OPEN 语句填充结果集，FETCH 从结果集返回行。CLOSE 语句释放与游标关联的当前结果集。DEALLOCATE 语句释放游标所使用的资源。

DECLARE CURSOR 语句的第一种格式使用 SQL-92 语法声明游标行为。DECLARE CURSOR 的第二种格式使用 Transact-SQL 扩展，使您得以使用在 ODBC、ADO 和 DB-Library的数据库 API 游标函数中的相同游标类型定义游标。

不能混淆这两种格式。如果在 CURSOR 关键字的前面指定 SCROLL 或 INSENSITIVE 关键字，则不能在 CURSOR 和 FOR select_statement 关键字之间使用任何关键字。如果在 CURSOR 和 FOR select_statement 关键字之间指定任何关键字，则不能在 CURSOR 关键字的前面指定 SCROLL 或 INSENSITIVE。

如果使用 Transact-SQL 语法的 DECLARE CURSOR 不指定 READ_ONLY、OPTIMISTIC 或 SCROLL_LOCKS，则默认设置如下：

  • 如果 SELECT 语句不支持更新（权限不够，访问的远程表不支持更新，等等），则游标是 READ_ONLY。

  • STATIC 和FAST_FORWARD 游标默认为 READ_ONLY。

  • DYNAMIC 和 KEYSET 游标默认为 OPTIMISTIC。

游标名称只能由其它 Transact-SQL 语句引用，不能由数据库 API 函数引用。例如，在声明游标后，不能从 OLE DB、ODBC、ADO 或 DB-Library 函数或方法引用游标名称。游标行不能通过 API 提取函数或方法提取，而只能由 Transact-SQL FETCH 语句提取。

在声明游标后，可使用下列系统存储过程确定游标的特性。

系统存储过程 | 描述
sp_cursor_list | 返回当前在连接上可视的游标列表及其特性。
sp_describe_cursor | 描述游标特性，比如是只进游标还是滚动游标。
sp_describe_cursor_columns | 描述游标结果集中的列的特性。
sp_describe_cursor_tables | 描述游标所访问的基表。

变量可作为声明游标的 select_statement 的一部分使用。然而，在游标声明之后对那些变量的更改将不会对游标的操作产生影响。

权限

默认情况下，将 DECLARE CURSOR 权限授予对游标中所使用的视图、表和列有 SELECT 权限的任何用户。

示例
A. 使用简单游标和语法

打开该游标时所生成的结果集包括 pubs 数据库的 authors 表中的所有行和列。可以更新该游标，对该游标所做的所有更新和删除均在提取中表现出来。因为没指定 SCROLL 选项，FETCH NEXT 是唯一可用的提取选项。

DECLARE authors_cursor CURSOR
   FOR SELECT * FROM authors
OPEN authors_cursor
FETCH NEXT FROM authors_cursor
B. 使用嵌套游标生成报表输出

下例显示如何嵌套游标以生成复杂的报表。为每个作者声明内部游标。

SET NOCOUNT ON

DECLARE @au_id varchar(11), @au_fname varchar(20), @au_lname varchar(40),
   @message varchar(80), @title varchar(80)

PRINT "-------- Utah Authors report --------"

DECLARE authors_cursor CURSOR FOR
SELECT au_id, au_fname, au_lname
FROM authors
WHERE state = "UT"
ORDER BY au_id

OPEN authors_cursor

FETCH NEXT FROM authors_cursor
INTO @au_id, @au_fname, @au_lname

WHILE @@FETCH_STATUS = 0
BEGIN
   PRINT " "
   SELECT @message = "----- Books by Author: " +
      @au_fname + " " + @au_lname

   PRINT @message

   -- Declare an inner cursor based
   -- on au_id from the outer cursor.

   DECLARE titles_cursor CURSOR FOR
   SELECT t.title
   FROM titleauthor ta, titles t
   WHERE ta.title_id = t.title_id AND
   ta.au_id = @au_id   -- Variable value from the outer cursor

   OPEN titles_cursor
   FETCH NEXT FROM titles_cursor INTO @title

   IF @@FETCH_STATUS <> 0
      PRINT "         <<No Books>>"

   WHILE @@FETCH_STATUS = 0
   BEGIN

      SELECT @message = "         " + @title
      PRINT @message
      FETCH NEXT FROM titles_cursor INTO @title

   END

   CLOSE titles_cursor
   DEALLOCATE titles_cursor

   -- Get the next author.
   FETCH NEXT FROM authors_cursor
   INTO @au_id, @au_fname, @au_lname
END

CLOSE authors_cursor
DEALLOCATE authors_cursor
GO

-------- Utah Authors report --------

----- Books by Author: Anne Ringer
         The Gourmet Microwave
         Is Anger the Enemy?

----- Books by Author: Albert Ringer
         Is Anger the Enemy?
         Life Without Fear

请参见

@@FETCH_STATUS

CLOSE

游标

DEALLOCATE

FETCH

OPEN

SELECT

sp_configure


DEGREES

当给出以弧度为单位的角度时，返回相应的以度数为单位的角度。

语法

DEGREES ( numeric_expression )

参数

numeric_expression

精确数字或近似数字数据类型类别的表达式（bit 数据类型除外）。

返回代码值

返回与 numeric_expression 相同的类型。

示例

下例以 PI/2 弧度的角度返回度数。

SELECT 'The number of degrees in PI/2 radians is: ' +
CONVERT(varchar, DEGREES((PI()/2)))
GO

下面是结果集：

The number of degrees in PI/2 radians is 90

(1 row(s) affected)

请参见

数学函数


DELETE

从表中删除行。

语法

DELETE
[ FROM ]
{ table_name WITH ( < table_hint_limited > [ ...n ] )
| view_name
 | rowset_function_limited
}

[ FROM { < table_source > } [ ,...n ] ]

[ WHERE
{ < search_condition >
| { [ CURRENT OF
{ { [ GLOBAL ] cursor_name }
| cursor_variable_name
}
] }
}
]
[ OPTION ( < query_hint > [ ,...n ] ) ]

< table_source > ::=
 table_name [ [ AS ] table_alias ] [ WITH ( < table_hint > [ ,...n ] ) ]
| view_name [ [ AS ] table_alias ]
| rowset_function [ [ AS ] table_alias ]
| derived_table [ AS ] table_alias [ ( column_alias [ ,...n ] ) ]
| < joined_table >

< joined_table > ::=
< table_source > < join_type > < table_source > ON < search_condition >
| < table_source > CROSS JOIN < table_source >
| < joined_table >

< join_type > ::=
[ INNER | { { LEFT | RIGHT | FULL } [OUTER] } ]
[ < join_hint > ]
JOIN

< table_hint_limited > ::=
{ FASTFIRSTROW
| HOLDLOCK
| PAGLOCK
| READCOMMITTED
| REPEATABLEREAD
| ROWLOCK
| SERIALIZABLE
| TABLOCK
| TABLOCKX
| UPDLOCK
}

< table_hint > ::=
{ INDEX ( index_val [ ,...n ] )
| FASTFIRSTROW
| HOLDLOCK
| NOLOCK
| PAGLOCK
| READCOMMITTED
| READPAST
| READUNCOMMITTED
| REPEATABLEREAD
| ROWLOCK
| SERIALIZABLE
| TABLOCK
| TABLOCKX
| UPDLOCK
}

< query_hint > ::=
{ { HASH | ORDER } GROUP
| { CONCAT | HASH | MERGE } UNION
| FAST number_rows
| FORCE ORDER
| MAXDOP
| ROBUST PLAN
| KEEP PLAN
}

参数

FROM

是可选的关键字，可用在 DELETE 关键字与目标 table_name、view_name 或 rowset_function_limited 之间。

table_name

是要从其中删除行的表的名称。

在其作用域内的 table 变量、或是将 OPENDATASOURCE 函数作为服务器名称的由四部分组成的表名（或视图名称）还可以在 DELETE 语句中作为表源使用。

WITH (<table_hint_limited> [...n])

指定目标表所允许的一个或多个表提示。需要有 WITH 关键字和圆括号。不允许有 READPAST、NOLOCK 和 READUNCOMMITTED。有关表提示的更多信息，请参见 FROM。

view_name

是视图名称。在视图的 FROM 子句中，view_name 引用的视图必须可更新且正确引用一个基表。有关可更新视图的更多信息，请参见 CREATE VIEW。

说明 如果表或视图存在于另一个数据库内或有一个不同于当前用户的所有者，则使用格式为 server_name.database.[owner].object_name 的由四部分组成的合法名称。有关更多信息，请参见 Transact-SQL 语法规则。

rowset_function_limited

OPENQUERY 或 OPENROWSET 函数，视提供程序功能而定。有关提供程序所需功能的更多信息，请参见 OLE DB 提供程序的 UPDATE 和 DELETE 语句要求。有关行集函数的更多信息，请参见 OPENQUERY 和 OPENROWSET。

FROM < table_source >

指定附加的 FROM 子句。这个对 DELETE 的 Transact-SQL 扩展使您得以从 <table_sources> 指定数据，并从第一个 FROM 子句内的表中删除相应的行。

这个扩展指定联接，可在 WHERE 子句中取代子查询来标识要删除的行。

table_name [[AS] table_alias ]
是为删除操作提供标准值的表名。
view_name [ [ AS ] table_alias ]
是为删除操作提供标准值的视图名称。带 INSTEAD OF UPDATE 触发器的视图不能是含有 FROM 子句的 UPDATE 的目标。
WITH (<table_hint>
指定一个或更多表提示。有关表提示的更多信息，请参见 FROM。
rowset_function [ [AS] table_alias ]
是行集函数名和可选别名。有关行集函数列表的更多信息，请参见行集函数。
derived_table [AS] table_alias
是从数据库中检索行的子查询。derived_table 用作对外部查询的输入。
column_alias
替换结果集内列名的可选别名。在选择列表中放入每个列的一个别名，并将整个列别名列表用圆括号括起来。

<joined_table>

由两个或更多表的积组成的结果集，例如：

SELECT *
FROM tab1 LEFT OUTER JOIN tab2 ON tab1.c3 = tab2.c3
    RIGHT OUTER JOIN tab3 LEFT OUTER JOIN tab4
        ON tab3.c1 = tab4.c1
        ON tab2.c3 = tab4.c3

对于多个 CROSS 联接，请使用圆括号来更改联接的自然顺序。

<join_type>

指定联接操作的类型。

INNER
指定返回每对匹配的行。废弃两个表中不匹配的行。如果未指定联接类型，则这是默认设置。
LEFT [OUTER]
指定在结果集内包含左表中所有不满足指定条件的行，并将右表中的输出列设置为 NULL 以作为对内联接所返回的所有行的补充。
RIGHT [OUTER]
指定在结果集内包含右表中所有不满足指定条件的行，并将左表中的输出列设置为 NULL 以作为对内联接所返回的所有行的补充。
FULL [OUTER]
如果来自左表或右表的某行与选择准则不匹配，则指定在结果集内包含该行，并且将与另一个表对应的输出列设置为 NULL。除此之外，结果集中还包含通常由内联接返回的所有行。
JOIN
是表示在删除操作中使用 SQL-92 式联接的关键字。

ON <search_condition>

指定联接所基于的条件。尽管经常使用列和比较运算符，但此条件可指定任何谓词，例如：

FROM Suppliers JOIN Products
    ON (Suppliers.SupplierID = Products.SupplierID)

当条件指定列时，列不必具有相同的名称或数据类型；但是，如果数据类型不一致，则这些列必须相互兼容或是 Microsoft® SQL Server™ 能够隐性转换的类型。如果数据类型不能隐性转换，则条件必须使用 CAST 函数显式转换数据类型。

有关搜索条件和谓词的更多信息，请参见搜索条件。

CROSS JOIN

指定两个表的矢量积。这将返回相同的行，就好像在旧式的非 SQL-92 式联接中并没有指定 WHERE 子句。

WHERE

指定用于限制删除行数的条件。如果没有提供 WHERE 子句，则 DELETE 删除表中的所有行。基于 WHERE 子句中所指定的条件，有两种形式的删除操作。

  • 搜索删除指定搜索条件限定删除的行。

  • 定位删除使用 CURRENT OF 子句指定游标。删除操作在游标的当前位置发生。这比使用 WHERE search_condition 子句限定删除的行的搜索 DELETE 精确。如果搜索条件不唯一标识单行，则搜索 DELETE 删除多行。
<search_condition>
指定删除行的限定条件。对搜索条件中可以包含的谓词数量没有限制。有关更多信息，请参见搜索条件。
CURRENT OF
指定在指定游标的当前位置完成 DELETE。
GLOBAL
指定 cursor_name 指的是全局游标。
cursor_name
是从其中进行提取的打开游标的名称。当全局和局部游标都以 cursor_name 作为它们的名称存在时，如果指定 GLOBAL，则 cursor_name 引用全局游标，如果未指定 GLOBAL，则 cursor_name 引用局部游标。游标必须允许更新。
cursor_variable_name
是游标变量的名称。游标变量必须引用允许更新的游标。

OPTION (<query_hint> [,...n] )

是表示使用优化程序提示自定义 SQL Server 的语句处理的关键字。

{HASH | ORDER} GROUP
指定在查询的 GROUP BY 或 COMPUTE 子句中指定的聚合使用哈希或排列。
{MERGE | HASH | CONCAT} UNION
指定所有的 UNION 操作通过合并、哈希或串联 UNION 集合来完成。如果指定了不止一个 UNION 提示，查询优化器就会从这些指定的提示中选择开销最少的策略。

说明 如果还为 FROM 子句中的某对链接表指定了 <joint_hint>，则这个提示优先于 OPTION 子句中所指定的任何 <join_hint>。

FAST number_rows
指定对查询进行优化，以便快速检索第一个 number_rows（非负整数）。在第一个 number_rows 返回后，查询继续进行并生成完整的结果集。
FORCE ORDER
指定在查询优化过程中保持由查询语法表示的联接顺序。
MAXDOP number
只对指定了 sp_configure 的 max degree of parallelism 配置选项的查询替代该选项。当使用 MAXDOP 查询提示时，所有和 max degree of parallelism 配置选项一起使用的语义规则均适用。有关更多信息，请参见 max degree of parallelism 选项。
ROBUST PLAN
强制查询优化器尝试执行一个计划，该计划以性能为代价获得最大可能的行大小。如果不能使用这样的计划，查询优化器将返回错误而不是延迟对查询执行的错误检测。行可以包含可变长度列；SQL Server 允许将行大小定义为超过 SQL Server 处理能力的最大可能的大小。通常，应用程序存储实际大小在 SQL Server 处理能力范围内的行，而不管最大可能大小。如果 SQL Server 遇到过长的行，则返回执行错误。

KEEP PLAN

强制查询优化器对查询放宽估计的重新编译阈值。当对表中索引列的更改（更新、删除或插入）达到估计数目时查询会自动重新编译，该估计数目即为重新编译阈值。指定 KEEP PLAN 将确保当表有多个更新时不会频繁地对查询进行重新编译。

注释

如果所修改的对象是 table 变量，则 DELETE 可用在用户定义函数的正文中。

对于由四部分组成的表名（或视图名称），若其中的服务器名称使用的是 OPENDATASOURCE 函数，则该表名可以在表名能够出现的任何位置作为表源使用。

如果 DELETE 语句违反了触发器，或试图删除另一个有 FOREIGN KEY 约束的表内的数据所引用的行，则可能会失败。如果 DELETE 删除了多行，而在删除的行中有任何一行违反触发器或约束，则将取消该语句，返回错误且不删除任何行。

如果在对表或视图的 DELETE 操作上定义了 INSTEAD-OF 触发器，该触发器将执行 instead of DELETE 语句。SQL Server 的早期版本只支持 DELETE 上的 AFTER 触发器和其它修改语句。

当 DELETE 语句遇到在表达式评估过程中发生的算术错误（溢出、被零除或域错误）时，SQL Server 将处理这些错误，就好象 SET ARITHABORT 打开一样。将取消批处理中的其余部分并返回错误信息。

对远程表和本地及远程分区视图上的 DELETE 语句将忽略 SET ROWCOUNT 选项的设置。

如果要删除在表中的所有行，则 TRUNCATE TABLE 比 DELETE 快。DELETE 以物理方式一次删除一行，并在事务日志中记录每个删除的行。TRUNCATE TABLE 则释放所有与表关联的页。因此，TRUNCATE TABLE 比 DELETE 快且需要的事务日志空间更少。TRUNCATE TABLE 在功能上与不带 WHERE 子句的 DELETE 相当，但是 TRUNCATE TABLE 不能用于由外键引用的表。DELETE 和 TRUNCATE TABLE 都使删除的行所占用的空间可用于存储新数据。

权限

默认情况下，将 DELETE 权限授予 sysadmin 固定服务器角色成员、db_owner 和 db_datawriter 固定数据库角色成员以及表所有者。sysadmin、db_owner 和 db_securityadmin 角色成员和表所有者可以将权限转让给其他用户。

如果语句包含 WHERE 子句，则还必须有 SELECT 权限。

示例
A. 不带参数使用 DELETE

下例从 authors表中删除所有行。

USE pubs
DELETE authors
B. 在行集上使用 DELETE

因为 au_lname 可能不是唯一的，下例删除其中的 au_lname 是 McBadden 的所有行。

USE pubs
DELETE FROM authors
WHERE au_lname = 'McBadden'
C. 在游标的当前行上使用 DELETE

下例显示在名为 complex_join_cursor 的游标上所做的删除。它只影响当前从游标提取的单行。

USE pubs
DELETE FROM authors
WHERE CURRENT OF complex_join_cursor
D. 基于子查询使用 DELETE 或使用 Transact-SQL 扩展

下例显示基于联接或相关子查询从基表中删除记录的 Transact-SQL 扩展。第一个 DELETE 显示与 SQL-92 兼容的子查询解决方法，第二个 DELETE 显示 Transact-SQL 扩展。两个查询都基于存储在 titles 表中的标题从 titleauthors 表中删除行。

/* SQL-92-Standard subquery */
USE pubs
DELETE FROM titleauthor
WHERE title_id IN
   (SELECT title_id
   FROM titles
   WHERE title LIKE '%computers%')

/* Transact-SQL extension */
USE pubs
DELETE titleauthor
FROM titleauthor INNER JOIN titles
   ON titleauthor.title_id = titles.title_id
WHERE titles.title LIKE '%computers%'
E. 在 DELETE 和 SELECT 中使用 TOP 子句

由于可以在 DELETE 语句中指定 SELECT 语句，因此还可以在 SELECT 语句中使用 TOP 子句。例如，下例从 authors 表中删除前 10 个作者。

DELETE authors
FROM (SELECT TOP 10 * FROM authors) AS t1
WHERE authors.au_id = t1.au_id

请参见

CREATE TABLE

CREATE TRIGGER

游标

DROP TABLE

INSERT

SELECT

TRUNCATE TABLE

UPDATE


DENY

在安全系统中创建一项，以拒绝给当前数据库内的安全帐户授予权限并防止安全帐户通过其组或角色成员资格继承权限。

语法

语句权限：

DENY { ALL | statement [ ,...n ] }
TO security_account [ ,...n ]

对象权限：

DENY
{ ALL [ PRIVILEGES ] | permission [ ,...n ] }
{
[ ( column [ ,...n ] ) ] ON { table | view }
| ON { table | view } [ ( column [ ,...n ] ) ]
| ON { stored_procedure | extended_procedure }
| ON { user_defined_function }
}
TO security_account [ ,...n ]
[ CASCADE ]

参数

ALL

指定拒绝所有适用的权限。对于语句权限，只有 sysadmin 角色成员可以使用 ALL。对于对象权限，sysadmin 和 db_owner 角色成员和数据库对象所有者都可以使用 ALL。

statement

是被拒绝权限的语句。语句列表可以包括：

  • CREATE DATABASE

  • CREATE DEFAULT

  • CREATE FUNCTION

  • CREATE PROCEDURE

  • CREATE RULE

  • CREATE TABLE

  • CREATE VIEW

  • BACKUP DATABASE

  • BACKUP LOG

n

是一个占位符，表示在以逗号分隔的列表中可以有重复的项目。

TO

指定安全帐户列表。

security_account

是当前数据库内受拒绝权限影响的安全帐户名称。安全帐户可以是：

  • Microsoft® SQL Server™ 用户。

  • SQL Server 角色。

  • Microsoft Windows NT® 用户。

  • Windows NT 组。

拒绝来自 SQL Server 用户或 Windows NT 用户帐户的权限时，受权限影响的唯一帐户是指定的 security_account。如果拒绝来自某个 SQL Server 角色或 Windows NT 组的权限，拒绝的权限将影响当前数据库内所有是该组或角色成员的用户，与已授予该组或角色成员的权限无关。如果组或角色与其成员的权限发生冲突，限制性最强的权限 (DENY) 优先。

DENY 可用于两种特殊的安全帐户。在 public 角色上拒绝的权限适用于数据库中的所有用户。在 guest 用户上拒绝的权限将由数据库内所有没有用户帐户的用户使用。

对 Windows NT 本地组或全局组拒绝权限时，指定在该组上定义的域名或计算机名，后面跟一个反斜线，然后是组名。但是，若要对 Windows NT 内置的本地组拒绝权限，请指定 BUILTIN 而不是域名或计算机名。

PRIVILEGES

是可以包含在符合 SQL-92 标准的语句中的可选关键字。

permission

是被拒绝的对象权限。在表或视图上拒绝权限时，权限列表可以包括一个或多个这些语句：SELECT、INSERT、DELETE 或 UPDATE。

在表上拒绝的对象权限还可以包括 REFERENCES，在存储过程或扩展存储过程上拒绝的对象权限可以包括 EXECUTE。在列上拒绝权限时，权限列表可以包括 SELECT 或 UPDATE。

column

是当前数据库内要被拒绝权限的列名。

table

是当前数据库内要被拒绝权限的表名。

view

是当前数据库内要被拒绝权限的视图名称。

stored_procedure

是当前数据库内要被拒绝权限的存储过程名称。

extended_procedure

是要被拒绝权限的扩展存储过程名称。

user_defined_function

是拒绝权限的用户定义函数名。

CASCADE

指定拒绝来自 security_account 的权限时，也将拒绝由 security_account 授权的任何其它安全帐户。拒绝可授予的权限时使用 CASCADE。如果没有指定 CASCADE，将给指定的用户授予 WITH GRANT OPTION 权限并返回错误。

注释

如果使用 DENY 语句禁止用户获得某个权限，那么以后将该用户添加到已得到该权限的组或角色时，该用户不能访问这个权限。

如果用户激活一个应用程序角色，DENY 对用户使用该应用程序角色访问的任何对象没有任何作用。虽然用户可能被拒绝访问当前数据库内的特定对象，但如果应用程序角色能够访问该对象，则当应用程序角色激活时，用户仍可以访问该对象。

使用 REVOKE 语句可从用户帐户中删除拒绝的权限。安全帐户不能访问删除的权限，除非将该权限授予了用户所在的组或角色。使用 GRANT 语句可删除拒绝的权限并将权限显式应用于安全帐户。

说明 在 SQL Server 6.x 版兼容模式中 DENY 是一个新关键字。DENY 专门用于拒绝来自用户帐户的权限，因为在 SQL Server 7.0 版中 REVOKE 只删除以前授予或拒绝的权限。使用 REVOKE 的现有 SQL Server 6.x 脚本可能必须改用 DENY 维护行为。

权限

默认情况下，将 DENY 权限授予 sysadmin、db_owner 或 db_securityadmin 角色成员和数据库对象所有者。

示例
A. 拒绝语句权限

下例对多个用户拒绝多个语句权限。用户不能使用 CREATE DATABASE 和 CREATE TABLE 语句，除非给他们显式授予权限。

DENY CREATE DATABASE, CREATE TABLE
TO Mary, John, [Corporate\BobJ]
B. 在权限层次结构内拒绝对象权限

下例显示权限的优先顺序。首先，给 public 角色授予 SELECT 权限。然后，拒绝用户 Mary、John 和 Tom 的特定权限。这样，这些用户就没有对 authors 表的权限。

USE pubs
GO

GRANT SELECT
ON authors
TO public
GO

DENY SELECT, INSERT, UPDATE, DELETE
ON authors
TO Mary, John, Tom
C. 对 SQL Server 角色拒绝权限

下例对所有 Accouting 角色成员拒绝 CREATE TABLE 权限。即使已给现有的 Accouting 用户显式授予了 CREATE TABLE 权限，DENY 仍替代该权限。

DENY CREATE TABLE TO Accounting

请参见

向后兼容性

GRANT

拒绝权限

REVOKE

sp_helprotect


DIFFERENCE

以整数返回两个字符表达式的 SOUNDEX 值之差。

语法

DIFFERENCE ( character_expression , character_expression )

参数

character_expression

是类型 char 或 varchar 的表达式。

返回类型

int

注释

返回的整数是 SOUNDEX 值中相同字符的个数。返回的值从 0 到 4 不等，4 表示 SOUNDEX 值相同。

示例

在下例的第一部分，比较两个相差很小的字符串的 SOUNDEX 值，DIFFERENCE 返回的值是 4。在下例的第二部分，比较两个相差很大的字符串的 SOUNDEX 值，DIFFERENCE 返回的值是 0。

USE pubs
GO
-- Returns a DIFFERENCE value of 4, the least possible difference.
SELECT SOUNDEX('Green'),
  SOUNDEX('Greene'), DIFFERENCE('Green','Greene')
GO
-- Returns a DIFFERENCE value of 0, the highest possible difference.
SELECT SOUNDEX('Blotchet-Halls'),
  SOUNDEX('Greene'), DIFFERENCE('Blotchet-Halls', 'Greene')
GO

下面是结果集：

----- ----- -----------
G650  G650  4

(1 row(s) affected)

----- ----- -----------
B432  G650  0

(1 row(s) affected)

请参见

SOUNDEX

字符串函数


DROP DATABASE

从 Microsoft® SQL Server™ 删除一个或多个数据库。删除数据库将删除数据库所使用的数据库文件和磁盘文件。

语法

DROP DATABASE database_name [ ,...n ]

参数

database_name

指定要删除的数据库名称。从 master 数据库中执行 sp_helpdb 以查看数据库列表。

注释

若要使用 DROP DATABASE，连接的数据库上下文必须在 master 数据库中。

DROP DATABASE 删除标记为置疑的已损坏数据库并删除指定的数据库。在除去用于复制的数据库之前，首先删除复制。不能除去为事务复制发布的任何数据库，也不能除去发布到或订阅到合并复制的任何数据库。有关更多信息，请参见管理和监视复制。如果数据库已损坏且无法首先删除复制，则大多数情况下仍然可通过将数据库标记为脱机数据库而将其除去。

只有通过还原备份才能重新创建已除去的数据库。不能除去当前正在使用（正打开供用户读写）的数据库。任何时候除去数据库，都应备份 master 数据库。

无法除去系统数据库（msdb、model、master、tempdb）。

权限

默认情况下，将 DROP DATABASE 权限授予数据库所有者以及 sysadmin 和 dbcreator 固定服务器角色成员，该权限不可转让。

示例
A. 除去单个数据库

下例从系统表中删除 publishing 数据库的所有引用。

DROP DATABASE publishing
B. 除去多个数据库

下例从系统表中删除每个列出的数据库的所有引用。

DROP DATABASE pubs, newpubs

请参见

ALTER DATABASE

CREATE DATABASE

sp_dropdevice

sp_helpdb

sp_renamedb

USE


DROP DEFAULT

从当前数据库中删除一个或多个用户定义的默认值。

DROP DEFAULT 语句不适用于 DEFAULT 约束。有关除去 DEFAULT 约束（通过使用 CREATE TABLE 或 ALTER TABLE 语句的 DEFAULT 选项所创建）的更多信息，请参见本卷中的"ALTER TABLE"。

语法

DROP DEFAULT { default } [ ,...n ]

参数

default

是现有默认值的名称。若要查看现有默认值的列表，请执行 sp_help。默认值必须符合标识符规则。有关更多信息，请参见使用标识符。可以选择是否指定默认值所有者名称。

n

是表示可以指定多个默认值的占位符。

注释

除去默认之前，通过执行 sp_unbindefault 解除绑定默认值（如果默认值当前绑定到列或用户定义的数据类型）。

从允许空值的列中除去默认值后，当添加行且没有显式提供值时，将在那个位置插入 NULL。从 NOT NULL 列中除去默认值后，当添加行且没有显式提供值时，将返回错误信息。这些行以后作为标准 INSERT 语句行为的一部分添加。

权限

默认情况下，将 DROP DEFAULT 权限授予默认值所有者，该权限不可转让。然而，db_owner 和 db_ddladmin 固定数据库角色成员以及 sysadmin 固定服务器角色成员可以通过在 DROP DEFAULT 中指定所有者除去任何默认对象。

示例
A. 除去默认值

如果默认值没有绑定到列或用户定义的数据类型，可以很容易地使用 DROP DEFAULT 将其除去。下例删除用户创建的名为 datedflt 的默认值。

USE pubs
IF EXISTS (SELECT name FROM sysobjects
         WHERE name = 'datedflt'
            AND type = 'D')
   DROP DEFAULT datedflt
GO
B. 除去绑定到列的默认值

下例解除绑定与 authors 表的 phone 列关联的默认值，然后除去名为 phonedflt 的默认值。

USE pubs
IF EXISTS (SELECT name FROM sysobjects
         WHERE name = 'phonedflt'
            AND type = 'D')
   BEGIN
      EXEC sp_unbindefault 'authors.phone'
      DROP DEFAULT phonedflt
   END
GO

请参见

CREATE DEFAULT

sp_helptext

sp_help

sp_unbindefault


DROP FUNCTION

从当前数据库中删除一个或多个用户定义的函数。用户定义的函数通过 CREATE FUNCTION 创建，通过 ALTER FUNCTION 修改。

语法

DROP FUNCTION { [ owner_name .] function_name } [ ,...n ]

参数

function_name

是要删除的用户定义的函数名称。可以选择是否指定所有者名称，但不能指定服务器名称和数据库名称。

n

是表示可以指定多个用户定义的函数的占位符。

权限

默认情况下，将 DROP FUNCTION 权限授予函数所有者，该权限不可转让。不过，sysadmin 固定服务器角色和 db_owner 及 db_ddladmin 固定数据库角色的成员可通过在 DROP FUNCTION 中指定所有者来除去任何对象。

请参见

ALTER FUNCTION

CREATE FUNCTION

用户定义函数


DROP INDEX

从当前数据库中删除一个或多个索引。

DROP INDEX 语句不适用于通过定义 PRIMARY KEY 或 UNIQUE 约束创建的索引（通过分别使用 CREATE TABLE 或 ALTER TABLE 语句的 PRIMARY KEY 或 UNIQUE 选项创建）。有关 PRIMARY 或 UNIQUE KEY 约束的更多信息，请参见本卷中的"CREATE TABLE"或"ALTER TABLE"。

语法

DROP INDEX 'table.index | view.index' [ ,...n ]

参数

table | view

是索引列所在的表或索引视图。若要查看在表或视图上存在的索引列表，请使用 sp_helpindex 并指定表名或视图名称。表名和视图名称必须符合标识符规则。有关更多信息，请参见使用标识符。可以选择是否指定表或视图所有者名称。

index

是要除去的索引名称。索引名必须符合标识符的规则。

n

是表示可以指定多个索引的占位符。

注释

执行 DROP INDEX 后，将重新获得以前由索引占用的空间。此后可将该空间用于任何数据库对象。

在系统表的索引上不能指定 DROP INDEX。

若要除去为实现 PRIMARY KEY 或 UNIQUE 约束而创建的索引，必须除去约束。有关除去约束的更多信息，请参见本卷中的"ALTER TABLE"。

根据是否为表定义了聚集索引，非聚集索引有指向数据行的不同指针。如果有聚集索引，非聚集索引的叶行将使用聚集索引键指向数据行。如果表是堆集，非聚集索引的叶行将使用行指针。如果在有非聚集索引的表上除去聚集索引，将重建所有非聚集索引以用行指针替换聚集索引键。

同样，除去索引视图的聚集索引时，将自动除去同一视图上的所有非聚集索引。

有时，除去并重新创建索引以重新组织索引，例如在大容量装载之后应用新的填充因子或重新组织数据。使用 CREATE INDEX 和 WITH DROP_EXISTING 子句完成这项工作会更有效，尤其对于聚集索引。除去聚集索引将导致重建所有非聚集索引。如果此后重新创建聚集索引，将再次重建非聚集索引以用聚集索引键替换行指针。CREATE INDEX 的 WITH DROP_EXISTING 子句可以对重建进行优化，以避免重建两次非聚集索引的开销。还可以使用 DBCC DBREINDEX，它具有不需要知道索引结构的优点。

权限

默认情况下，将 DROP INDEX 权限授予表所有者，该权限不可转让。然而，db_owner 和 db_ddladmin 固定数据库角色成员或 sysadmin 固定服务器角色成员可以通过在 DROP INDEX 内指定所有者除去任何对象。

示例

下例删除 authors 表内名为 au_id_ind 的索引。

USE pubs
IF EXISTS (SELECT name FROM sysindexes
         WHERE name = 'au_id_ind')
   DROP INDEX authors.au_id_ind
GO

请参见

CREATE INDEX

DBCC DBREINDEX

sp_helpindex

sp_spaceused


DROP PROCEDURE

从当前数据库中删除一个或多个存储过程或过程组。

语法

DROP PROCEDURE { procedure } [ ,...n ]

参数

procedure

是要删除的存储过程或存储过程组的名称。过程名称必须符合标识符规则。有关更多信息，请参见使用标识符。可以选择是否指定过程所有者名称，但不能指定服务器名称和数据库名称。

n

是表示可以指定多个过程的占位符。

注释

若要查看过程名称列表，请使用 sp_help。若要显示过程定义（存储在 syscomments 系统表内），请使用 sp_helptext。除去某个存储过程时，将从 sysobjects 和 syscomments 系统表中删除有关该过程的信息。

不能除去组内的个别过程，必须除去整个过程组。

不论用户定义的系统过程（以 sp_ 为前缀）是否为当前数据库，都将其从 master 数据库中除去。如果在当前的数据库未找到系统过程，则 Microsoft® SQL Server™ 尝试将其从 master 数据库除去。

权限

默认情况下，将 DROP PROCEDURE 权限授予过程所有者，该权限不可转让。然而，db_owner 和 db_ddladmin 固定数据库角色成员和 sysadmin 固定服务器角色成员可以通过在 DROP PROCEDURE 内指定所有者除去任何对象。

示例

下例删除 byroyalty 存储过程（在当前数据库内）。

DROP PROCEDURE byroyalty
GO

请参见

ALTER PROCEDURE

CREATE PROCEDURE

sp_depends

sp_helptext

sp_rename

syscomments

sysobjects

USE


DROP RULE

从当前数据库中删除一个或多个用户定义的规则。

语法

DROP RULE { rule } [ ,...n ]

参数

rule

是要删除的规则。规则名称必须符合标识符规则。有关标识符规则的更多信息，请参见使用标识符。可以选择是否指定规则所有者的名称。

n

是表示可以指定多个规则的占位符。

注释

如果规则当前绑定到列或用户定义的数据类型，若要除去规则，首先需解除绑定。使用 sp_unbindrule 解除绑定规则。如果在试图除去规则时规则是绑定的，将显示错误信息并取消 DROP RULE 语句。

除去规则后，可以在以前受规则约束的列中输入新数据而不受规则的约束。现有数据不受任何影响。

DROP RULE 语句不适用于 CHECK 约束。有关除去 CHECK 约束的更多信息，请参见本卷中的"ALTER TABLE"。

权限

默认情况下，将 DROP RULE 权限授予规则所有者，该权限不可转让。然而，db_owner 和 db_ddladmin 固定数据库角色成员和 sysadmin 固定服务器角色成员可以通过在 DROP RULE 内指定所有者除去任何对象。

示例

下例解除绑定名为 pub_id_rule 的规则并将其除去。

USE pubs
IF EXISTS (SELECT name FROM sysobjects
         WHERE name = 'pub_id_rule'
            AND type = 'R')
   BEGIN
      EXEC sp_unbindrule 'publishers.pub_id'
      DROP RULE pub_id_rule
   END
GO

请参见

CREATE RULE

sp_bindrule

sp_help

sp_helptext

sp_unbindrule

USE


DROP STATISTICS

除去指定表内的多个集合的统计（在当前数据库内）。

语法

DROP STATISTICS table.statistics_name | view.statistics_name [ ,...n ]

参数

table | view

是要为其除去统计的目标表或索引视图的名称。表名和视图名称必须符合标识符规则。有关更多信息，请参见使用标识符。可以选择是否指定表或视图所有者名称。

statistics_name

是要除去的统计组名称。统计名称必须符合标识符规则。

n

是表示可以指定多个 statistics_name 组（集合）的占位符。

注释

除去统计时要小心，因为除去统计可能影响查询优化器所选择的计划。

有关显示统计的更多信息，请参见本卷中的"DBCC SHOW_STATISTICS"。有关更新统计的更多信息，请参见本卷中的"UPDATE STATISTICS"和"sp_dboption"的 auto update statistics 选项。有关创建统计的更多信息，请参见本卷中的"CREATE STATISTICS"、"CREATE INDEX"和"sp_dboption"的 auto create statistics 选项。

权限

默认情况下，将 DROP STATISTICS 权限授予表或视图的所有者，该权限不可转让。然而，db_owner 和 db_ddladmin 固定数据库角色成员和 sysadmin 固定服务器角色成员可以通过在 DROP STATISTICS 内指定所有者除去任何对象。

示例

下例除去 authors 表的 anames 统计组（集合）和 titles 表的 tnames 统计（集合）。

-- Create the statistics groups.
CREATE STATISTICS anames
   ON authors (au_lname, au_fname)
   WITH SAMPLE 50 PERCENT
GO
CREATE STATISTICS tnames
   ON titles (title_id)
   WITH FULLSCAN
GO
DROP STATISTICS authors.anames, titles.tnames
GO

请参见

CREATE INDEX

CREATE STATISTICS

DBCC SHOW_STATISTICS

sp_autostats

sp_createstats

sp_dboption

UPDATE STATISTICS

USE


DROP TABLE

删除表定义及该表的所有数据、索引、触发器、约束和权限规范。任何引用已除去表的视图或存储过程必须通过 DROP VIEW 或 DROP PROCEDURE 语句显式除去。

语法

DROP TABLE table_name

参数

table_name

是要删除的表名。

注释

DROP TABLE 不能用于除去由 FOREIGN KEY 约束引用的表。必须先除去引用的 FOREIGN KEY 约束或引用的表。

表所有者可以除去任何数据库内的表。除去表时，表上的规则或默认值将解除绑定，任何与表关联的约束或触发器将自动除去。如果重新创建表，必须重新绑定适当的规则和默认值，重新创建任何触发器并添加必要的约束。

在系统表上不能使用 DROP TABLE 语句。

如果删除表内的所有行 (DELETE tablename) 或使用 TRUNCATE TABLE 语句，则表将一直存在到被除去。

权限

默认情况下，将 DROP TABLE 权限授予表所有者，该权限不可转让。然而，sysadmin 固定服务器角色成员或 db_owner 和 db_ddladmin 固定数据库角色成员可以通过在 DROP TABLE 内指定所有者除去任何对象。

示例
A. 除去当前数据库内的表

下例从当前数据库中删除 titles1 表及其数据和索引。

DROP TABLE titles1
B. 除去另外一个数据库内的表

下例除去 pubs 数据库内的 authors2 表。可以在任何数据库内执行此操作。

DROP TABLE pubs.dbo.authors2

请参见

ALTER TABLE

CREATE TABLE

DELETE

sp_depends

sp_help

sp_spaceused

TRUNCATE TABLE


DROP TRIGGER

从当前数据库中删除一个或多个触发器。

语法

DROP TRIGGER { trigger } [ ,...n ]

参数

trigger

是要删除的触发器名称。触发器名称必须符合标识符规则。有关标识符规则的更多信息，请参见使用标识符。可以选择是否指定触发器所有者名称。若要查看当前创建的触发器列表，请使用 sp_helptrigger。

n

是表示可以指定多个触发器的占位符。

注释

可以通过除去触发器或除去触发器表删除触发器。除去表时，也将除去所有与表关联的触发器。除去触发器时，将从 sysobjects 和 syscomments 系统表中删除有关触发器的信息。

使用 DROP TRIGGER 和 CREATE TRIGGER 重命名触发器。使用 ALTER TRIGGER 更改触发器的定义。

有关确定特定触发器相关性的更多信息，请参见本卷中的"sp_depends"。

有关查看触发器文本的更多信息，请参见本卷中的"sp_helptext"。

有关查看现有触发器列表的更多信息，请参见本卷中的"sp_helptrigger"。

权限

默认情况下，将 DROP TRIGGER 权限授予触发器表的所有者，该权限不可转让。然而，db_owner 和 db_dlladmin 固定数据库角色成员或 sysadmin 固定服务器角色成员可以通过在 DROP TRIGGER 语句内显式指定所有者除去任何对象。

示例

下例除去 employee_insupd 触发器。

USE pubs
IF EXISTS (SELECT name FROM sysobjects
      WHERE name = 'employee_insupd' AND type = 'TR')
   DROP TRIGGER employee_insupd
GO

请参见

ALTER TRIGGER

CREATE TRIGGER

sp_help

syscomments

sysobjects


DROP VIEW

从当前数据库中删除一个或多个视图。可对索引视图执行 DROP VIEW。

语法

DROP VIEW { view } [ ,...n ]

参数

view

是要删除的视图名称。视图名称必须符合标识符规则。有关更多信息，请参见使用标识符。可以选择是否指定视图所有者名称。若要查看当前创建的视图列表，请使用 sp_help。

n

是表示可以指定多个视图的占位符。

注释

除去视图时，将从 sysobjects、syscolumns、syscomments、sysdepends 和 sysprotects 系统表中删除视图的定义及其它有关视图的信息。还将删除视图的所有权限。

已除去的表（使用 DROP TABLE 语句除去）上的任何视图必须通过使用 DROP VIEW 显式除去。

对索引视图执行 DROP VIEW 时，将自动除去视图上的所有索引。使用 sp_helpindex 可显示视图上的所有索引。

通过视图进行查询时，Microsoft® SQL Server™ 将检查以确定语句中任意位置引用的所有数据库对象是否都存在，这些对象在语句的上下文中是否有效，以及数据修改语句是否没有违反任何数据完整性规则。如果检查失败，将返回错误信息。如果检查成功，则将操作转换成对基础表的操作。

如果基础表或视图自最初创建视图后已更改，则除去并重新创建视图可能很有用。

有关确定特定视图相关性的更多信息，请参见 sp_depends。

有关查看视图文本的更多信息，请参见 sp_helptext。

权限

默认情况下，将 DROP VIEW 权限授予视图所有者，该权限不可转让。然而，db_owner 和 db_ddladmin 固定数据库角色成员和 sysadmin 固定服务器角色成员可以通过在 DROP VIEW 内显式指定所有者除去任何对象。

示例

下例删除 titles_view 视图。

USE pubs
IF EXISTS (SELECT TABLE_NAME FROM INFORMATION_SCHEMA.VIEWS
         WHERE TABLE_NAME = 'titles_view')
   DROP VIEW titles_view
GO

请参见

ALTER VIEW

CREATE VIEW

syscolumns

syscomments

sysdepends

sysobjects

sysprotects

USE


DUMP

备份数据库 (DUMP DATABASE) 或以可使用 BACKUP 或 LOAD 语句读入 Microsoft® SQL Server™ 的形式复制事务日志 (DUMP TRANSACTION)。

重要 在 SQL Server 2000 版中包括 DUMP 语句是为了向后兼容性。建议使用 BACKUP 语句取代 DUMP 语句。在以后的 SQL 版本中将不再支持 DUMP。

请参见

BACKUP

LOAD

sp_addumpdevice

sp_dropdevice

sp_helpdb

sp_helpdevice

sp_spaceused


ELSE (IF...ELSE)

在执行 Transact-SQL 语句时强加条件。如果 Boolean_expression 取值为 TRUE，则执行 Boolean_expression 后的 Transact-SQL 语句 (sql_statement)。当 Boolean_expression 取值为 FALSE 或 NULL时，则可选 ELSE 关键字为要执行的 Transact-SQL 语句。

语法

IF Boolean_expression { sql_statement | statement_block }
[
    ELSE
{ sql_statement | statement_block } ]

参数

Boolean_expression

返回 TRUE 或 FALSE 的表达式。如果布尔表达式中含有 SELECT 语句，必须用圆括号将 SELECT 语句括起来。

{sql_statement | statement_block}

是任何有效的 Transact-SQL 语句或以语句块定义的语句分组。若要定义语句块（批处理），采用控制流语言关键字 BEGIN 和 END。虽然所有的 Transact-SQL 语句在 BEGIN...END 块内都有效，但有些 Transact-SQL 语句不应组合在同一个批处理（语句块）中。

结果类型

Boolean

示例

当至少一本书满足这些条件时，这个示例会给出价格在 $10 与 $20 之间的传统烹调书的列表。否则，SQL Server 会给出一条信息，说明没有书满足这个条件，并生成价格低于 $10 的传统烹调书的列表。

USE pubs
GO
DECLARE @msg varchar(255)
IF (SELECT COUNT(price)
   FROM titles
   WHERE title_id LIKE 'TC%' AND price BETWEEN 10 AND 20) > 0

   BEGIN
     SET NOCOUNT ON
     SET @msg = 'There are several books that are a good value between $10 and $20. These books are: '
         PRINT @msg
      SELECT title
     FROM titles
     WHERE title_id LIKE 'TC%' AND price BETWEEN 10 AND 20
   END
ELSE
   BEGIN
     SET NOCOUNT ON
     SET @msg = 'There are no books between $10 and $20. You might consider the following books that are under $10.'
         PRINT @msg
     SELECT title
     FROM titles
     WHERE title_id LIKE 'TC%' AND price < 10
   END

下面是结果集：

There are several books that are a good value between $10 and $20. These books are:
title
------------------------------------------------------------------------
Fifty Years in Buckingham Palace Kitchens
Sushi, Anyone?

(2 row(s) affected)

请参见

ALTER TRIGGER

批处理

控制流语言

CREATE TRIGGER

IF...ELSE


END (BEGIN...END)

包含一系列 Transact-SQL 语句，这些语句作为一个组同时执行。BEGIN...END 语句块允许嵌套。

语法

BEGIN
{ sql_statement | statement_block }
END

参数

{sql_statement | statement_block}

是任何有效的 Transact-SQL 语句或以语句块定义的语句分组。若要定义语句块（批处理），采用控制流语言关键字 BEGIN 和 END。虽然所有的 Transact-SQL 语句在 BEGIN...END 块内都有效，但有些 Transact-SQL 语句不应组合在同一个批处理（语句块）中。

结果类型

Boolean

示例

当一本或更多的书满足这些条件时，这个示例会给出价格低于 $20 的商业书籍的列表。否则，SQL Server 会给出一条信息，说明没有书满足这个条件，并给出价格低于 ＄20 的所有书的列表。

SET NOCOUNT OFF
GO
USE pubs
GO
SET NOCOUNT ON
GO
DECLARE @msg varchar(255)
IF (SELECT COUNT(price)
   FROM titles
   WHERE title_id LIKE 'BU%' AND price < 20) > 0

   BEGIN
     SET @msg = 'There are several books that are a good value at under $20. These books are: '
         PRINT @msg
     SET NOCOUNT OFF
      SELECT title
      FROM titles
      WHERE price < 20
   END
ELSE
   BEGIN
     SET @msg = 'There are no books under $20. '
         PRINT @msg
     SELECT title
     FROM titles
     WHERE title_id
     LIKE 'BU%'
     AND
     PRICE <10
   END

下面是结果集：

There are several books that are a good value at under $20. These books are:
title
------------------------------------------------------------------------
The Busy Executive's Database Guide
Cooking with Computers: Surreptitious Balance Sheets
You Can Combat Computer Stress!
Straight Talk About Computers
Silicon Valley Gastronomic Treats
The Gourmet Microwave
Is Anger the Enemy?
Life Without Fear
Prolonged Data Deprivation: Four Case Studies
Emotional Security: A New Algorithm
Fifty Years in Buckingham Palace Kitchens
Sushi, Anyone?

(12 row(s) affected)

请参见

ALTER TRIGGER

批处理

BEGIN...END

控制流语言

CREATE TRIGGER

ELSE (IF...ELSE)

IF...ELSE

WHILE


EXECUTE

执行标量值的用户定义函数、系统过程、用户定义存储过程或扩展存储过程。同时支持 Transact-SQL 批处理内的字符串的执行

若要唤醒调用函数，请使用 EXECUTE stored_procedure 中描述的语法。

语法

执行存储过程：

[ [ EXEC [ UTE ] ]
{
        [ @return_status = ]
{ procedure_name [ ;number ] | @procedure_name_var
}
    [ [ @parameter = ] { value | @variable [ OUTPUT ] | [ DEFAULT ] ]
[ ,...n ]
[ WITH RECOMPILE ]

执行字符串：

EXEC [ UTE ] ( { @string_variable | [ N ] 'tsql_string' } [ + ...n ] )

参数

@return_status

是一个可选的整型变量，保存存储过程的返回状态。这个变量在用于 EXECUTE 语句前，必须在批处理、存储过程或函数中声明过。

在用于唤醒调用标量值用户定义函数时，@return_status 变量可以是任何标量数据类型。

procedure_name

是拟调用的存储过程的完全合法或者不完全合法的名称。过程名称必须符合标识符规则。有关更多信息，请参见使用标识符。无论服务器的代码页或排序方式如何，扩展存储过程的名称总是区分大小写。

用户可以执行在另一数据库中创建的过程，只要该用户拥有此过程或有在该数据库中执行它的适当的权限。用户可以在另一台运行 Microsoft® SQL Server™ 的服务器上执行过程，只要该用户有适当的权限使用该服务器（远程访问），并能在数据库中执行该过程。如果指定了服务器名称但没有指定数据库名称，SQL Server 会在用户默认的数据库中寻找该过程。

;number

是可选的整数，用于将相同名称的过程进行组合，使得它们可以用一句 DROP PROCEDURE 语句除去。该参数不能用于扩展存储过程。

在同一应用程序中使用的过程一般都以该方式组合。例如，在订购应用程序中使用的过程可以 orderproc;1、orderproc;2 等来命名。DROP PROCEDURE orderproc 语句将除去整个组。在对过程分组后，不能除去组中的单个过程。例如，DROP PROCEDURE orderproc;2 是不允许的。有关过程组的更多信息，请参见 CREATE PROCEDURE。

@procedure_name_var

是局部定义变量名，代表存储过程名称。

@parameter

是过程参数，在 CREATE PROCEDURE 语句中定义。参数名称前必须加上符号 (@)。在以 @parameter_name = value 格式使用时，参数名称和常量不一定按照 CREATE PROCEDURE 语句中定义的顺序出现。但是，如果有一个参数使用 @parameter_name = value 格式，则其它所有参数都必须使用这种格式。

默认情况下，参数可为空。如果传递 NULL 参数值，且该参数用于 CREATE 或 ALTER TABLE 语句中不允许为 NULL 的列（例如，插入至不允许为 NULL 的列），SQL Server 就会报错。为避免将 NULL 参数值传递给不允许为 NULL 的列，可以在过程中添加程序设计逻辑或采用默认值（使用 CREATE 或 ALTER TABLE 语句中的 DEFAULT 关键字）。

value

是过程中参数的值。如果参数名称没有指定，参数值必须以 CREATE PROCEDURE 语句中定义的顺序给出。

如果参数值是一个对象名称、字符串或通过数据库名称或所有者名称进行限制，则整个名称必须用单引号括起来。如果参数值是一个关键字，则该关键字必须用双引号括起来。

如果在 CREATE PROCEDURE 语句中定义了默认值，用户执行该过程时可以不必指定参数。如果该过程使用了带 LIKE 关键字的参数名称，则默认值必须是常量，并且可以包含 %、_、[ ] 及 [^] 通配符。

默认值也可以为 NULL。通常，过程定义会指定当参数值为 NULL 时应该执行的操作。

@variable

是用来保存参数或者返回参数的变量。

OUTPUT

指定存储过程必须返回一个参数。该存储过程的匹配参数也必须由关键字 OUTPUT 创建。使用游标变量作参数时使用该关键字。

如果使用 OUTPUT 参数，目的是在调用批处理或过程的其它语句中使用其返回值，则参数值必须作为变量传递（即 @parameter = @variable）。如果一个参数在 CREATE PROCEDURE 语句中不是定义为 OUTPUT 参数，则对该参数指定 OUTPUT 的过程不能执行。不能使用 OUTPUT 将常量传递给存储过程；返回参数需要变量名称。在执行过程之前，必须声明变量的数据类型并赋值。返回参数可以是 text 或 image 数据类型以外的任意数据类型。

DEFAULT

根据过程的定义，提供参数的默认值。当过程需要的参数值没有事先定义好的默认值，或缺少参数，或指定了 DEFAULT 关键字，就会出错。

n

是占位符，表示在它前面的项目可以多次重复执行。例如，EXECUTE 语句可以指定一个或者多个 @parameter、value 或 @variable。

WITH RECOMPILE

强制编译新的计划。如果所提供的参数为非典型参数或者数据有很大的改变，使用该选项。在以后的程序执行中使用更改过的计划。该选项不能用于扩展存储过程。建议尽量少使用该选项，因为它消耗较多系统资源。

@string_variable

是局部变量的名称。@string_variable 可以是 char、varchar、nchar 或 nvarchar 数据类型，最大值为服务器的可用内存。如果字符串长度超过 4,000 个字符，则把多个局部变量串联起来用于 EXECUTE 字符串。有关系统提供的 SQL Server 数据类型更多的信息，请参见数据类型。

[N]'tsql_string'

是一个常量，tsql_string 可以是 nvarchar 或 varchar 数据类型。如果包含 N，则该字符串将解释为 nvarchar 数据类型，最大值为服务器的可用内存。如果字符串长度超过 4,000 个字符，则把多个局部变量串联起来用于 EXECUTE 字符串。

注释

如果过程名称的前三个字符为 sp_，SQL Server 会在 Master 数据库中寻找该过程。如果没能找到合法的过程名称，SQL Server 会寻找所有者名称为 dbo 的过程。若要将存储过程名称解析为与系统存储过程同名的用户定义存储过程，请提供一个完全合法的过程名称。

参数可以通过利用 value 或 @parameter_name = value 来提供。参数不是事务的一个部分；因而如果事务中的参数值更改，且该事务在以后回滚，该参数值不会退回到以前的值。返回给调用方的值总是过程返回时的值。

当一个存储过程调用另一个存储过程时，会产生嵌套。当调用的过程开始执行时，嵌套级会增加，当调用过程执行结束时，嵌套级则会减少。嵌套级最高为32级，超过32级时，会导致整个调用过程链失败。当前的嵌套级存储在 @@NESTLEVEL 函数中。

SQL Server 目前使用返回值 0 到 -14 来表示存储过程的执行状态。值 –15 到 -99 留作后用。有关保留的返回状态值的列表的更多信息，请参见 RETURN。

因为远程存储过程和扩展存储过程不在事务的作用域中（除非在 BEGIN DISTRIBUTED TRANSACTION 语句中发出或者是和不同的配置选项一起使用），所以通过调用执行的命令不能回滚。有关更多信息，请参见系统存储过程和 BEGIN DISTRIBUTED TRANSACTION。

当使用游标变量时，如果执行的过程传递一个分配有游标的游标变量，就会出错。

在执行存储过程时，如果语句是批处理中的第一个语句，则不一定要指定 EXECUTE 关键字。

使用带字符串的 EXECUTE 命令

使用字符串串联运算符 (+) 为动态执行创建长字符串。每个字符串表达式可以是 Unicode 与 non-Unicode 数据类型的混合。

尽管每个 [N] 'tsql_string' 或 @string_variable 不得超过 8,000 个字节，SQL Server 语法分析器中对这种串联只进行逻辑处理而不占用物理内存。例如，该语句决不会生成长 16,000 个串联起来的字符串：

EXEC('name_of_8000_char_string' + 'another_name_of_8000_char_string')

在 EXECUTE 语句执行前，不会编译 EXECUTE 语句内的语句。

数据库环境的更改只在 EXECUTE 语句结束前有效。例如，在这个例子的 EXEC 后，数据库环境是 master：

USE master EXEC ("USE pubs") SELECT * FROM authors
权限

存储过程的 EXECUTE 权限默认给该存储过程的所有者，该所有者可以将此权限转让给其他用户。当遇到 EXECUTE 语句时，即使 EXECUTE 语句是在存储过程中，也会检查在 EXECUTE 字符串内使用该语句的权限。当运行一个执行字符串的存储过程时，系统会在执行该过程的用户环境中，而不是在创建该过程的用户环境中检查权限。但是，如果某用户拥有两个存储过程，并且第一个过程调用第二个过程，则在第二个过程中不进行 EXECUTE 权限检查。

示例
A. 使用 EXECUTE 传递单个参数

showind 存储过程需要参数 (@tabname)，它是一个表的名称。下面这个例子执行 showind 存储过程，以 titles 为参数值。

说明 showind 存储过程只是用来作为一个例子，pubs 数据库并没有此过程。

EXEC showind titles

在执行过程中变量可以显式命名：

EXEC showind @tabname = titles

如果这是 isql 脚本或批处理中第一个语句，则 EXEC 语句可以省略：

showind titles

-或-

showind @tabname = titles
B. 使用多个参数与一个输出参数

这个例子执行 roy_check 存储过程，传递三个参数。第三个参数 @pc 是输出参数。过程执行完后，返回变量可以从变量 @percent 得到。

说明 roy_check 存储过程只是用作举例，pubs 数据库中并没有此过程。

DECLARE @percent int
EXECUTE roy_check 'BU1032', 1050, @pc = @percent OUTPUT
SET Percent = @percent
C.使用带一个变量的 EXECUTE 'tsql_string' 语句

这个例子显示 EXECUTE 语句如何处理动态生成的、含有变量的字符串。这个例子创建 tables_cursor 游标来保存所有用户定义表 (type = U) 的列表。

说明 此例子只用作举例。

DECLARE tables_cursor CURSOR
   FOR
   SELECT name FROM sysobjects WHERE type = 'U'
OPEN tables_cursor
DECLARE @tablename sysname
FETCH NEXT FROM tables_cursor INTO @tablename
WHILE (@@FETCH_STATUS <> -1)
BEGIN
   /* A @@FETCH_STATUS of -2 means that the row has been deleted.
   There is no need to test for this because this loop drops all
   user-defined tables.   */.
   EXEC ('DROP TABLE ' + @tablename)
   FETCH NEXT FROM tables_cursor INTO @tablename
END
PRINT 'All user-defined tables have been dropped from the database.'
DEALLOCATE tables_cursor
D.使用带远程存储过程的 EXECUTE 语句

这个例子在远程服务器 SQLSERVER1 上执行 checkcontract 存储过程，在 @retstat 中保存返回状态，说明运行成功或失败。

DECLARE @retstat int
EXECUTE @retstat = SQLSERVER1.pubs.dbo.checkcontract '409-56-4008'
E. 使用带扩展存储过程的 EXECUTE 语句

下例使用 xp_cmdshell 扩展存储过程列出文件扩展名为 .exe 的所有文件的目录。

USE master
EXECUTE xp_cmdshell 'dir *.exe'
F. 使用带一个存储过程变量的 EXECUTE 语句

这个例子创建一个代表存储过程名称的变量。

DECLARE @proc_name varchar(30)
SET @proc_name = 'sp_who'
EXEC @proc_name
G. 使用带 DEFAULT 的 EXECUTE 语句

这个例子创建了一个存储过程，过程中第一个和第三个参数为默认值。当运行该过程时，如果调用时没有传递值或者指定了默认值，这些默认值就会赋给第一个和第三个参数。注意 DEFAULT 关键字有多种使用方法。

USE pubs
IF EXISTS (SELECT name FROM sysobjects
      WHERE name = 'proc_calculate_taxes' AND type = 'P')
   DROP PROCEDURE proc_calculate_taxes
GO
-- Create the stored procedure.
CREATE PROCEDURE proc_calculate_taxes (@p1 smallint = 42, @p2 char(1),
      @p3 varchar(8) = 'CAR')
    AS
   SELECT *
   FROM mytable

proc_calculate_taxes 存储过程可以以多种组合方式执行：

EXECUTE proc_calculate_taxes @p2 = 'A'
EXECUTE proc_calculate_taxes 69, 'B'
EXECUTE proc_calculate_taxes 69, 'C', 'House'
EXECUTE proc_calculate_taxes @p1 = DEFAULT, @p2 = 'D'
EXECUTE proc_calculate_taxes DEFAULT, @p3 = 'Local', @p2 = 'E'
EXECUTE proc_calculate_taxes 69, 'F', @p3 = DEFAULT
EXECUTE proc_calculate_taxes 95, 'G', DEFAULT
EXECUTE proc_calculate_taxes DEFAULT, 'H', DEFAULT
EXECUTE proc_calculate_taxes DEFAULT, 'I', @p3 = DEFAULT

请参见

+（字符串串联）

[ ]（通配符字符 - 需匹配的字符）

@@NESTLEVEL

ALTER PROCEDURE

DECLARE @local_variable

DROP PROCEDURE

函数

sp_depends

sp_helptext


EXISTS

指定一个子查询，检测行的存在。

语法

EXISTS subquery

参数

subquery

是一个受限的 SELECT 语句 (不允许有 COMPUTE 子句和 INTO 关键字)。有关更多信息，请参见 SELECT 中有关子查询的讨论。

结果类型

Boolean

结果值

如果子查询包含行，则返回 TRUE。

示例
A. 在子查询中使用 NULL 仍然返回结果集

这个例子在子查询中指定 NULL，并返回结果集，通过使用 EXISTS 仍取值为 TRUE。

USE Northwind
GO
SELECT CategoryName
FROM Categories
WHERE EXISTS (SELECT NULL)
ORDER BY CategoryName ASC
GO
B. 比较使用 EXISTS 和 IN 的查询

这个例子比较了两个语义类似的查询。第一个查询使用 EXISTS 而第二个查询使用 IN。注意两个查询返回相同的信息。

USE pubs
GO
SELECT DISTINCT pub_name
FROM publishers
WHERE EXISTS
   (SELECT *
   FROM titles
   WHERE pub_id = publishers.pub_id
   AND type = 'business')
GO

-- Or, using the IN clause:

USE pubs
GO
SELECT distinct pub_name
FROM publishers
WHERE pub_id IN
   (SELECT pub_id
   FROM titles
   WHERE type = 'business')
GO

下面是任一查询的结果集：

pub_name
----------------------------------------
Algodata Infosystems
New Moon Books

(2 row(s) affected)
C.比较使用 EXISTS 和 = ANY 的查询

本示例显示查找与出版商住在同一城市中的作者的两种查询方法：第一种方法使用 = ANY，第二种方法使用 EXISTS。注意这两种方法返回相同的信息。

USE pubs
GO
SELECT au_lname, au_fname
FROM authors
WHERE exists
   (SELECT *
   FROM publishers
   WHERE authors.city = publishers.city)
GO

-- Or, using = ANY

USE pubs
GO
SELECT au_lname, au_fname
FROM authors
WHERE city = ANY
   (SELECT city
   FROM publishers)
GO

下面是任一查询的结果集：

au_lname                                 au_fname
---------------------------------------- --------------------
Carson                                   Cheryl
Bennet                                   Abraham

(2 row(s) affected)
D.比较使用 EXISTS 和 IN 的查询

本示例所示查询查找由位于以字母 B 开头的城市中的任一出版商出版的书名：

USE pubs
GO
SELECT title
FROM titles
WHERE EXISTS
   (SELECT *
   FROM publishers
   WHERE pub_id = titles.pub_id
   AND city LIKE 'B%')
GO

-- Or, using IN:

USE pubs
GO
SELECT title
FROM titles
WHERE pub_id IN
   (SELECT pub_id
   FROM publishers
   WHERE city LIKE 'B%')
GO

下面是任一查询的结果集：

title
------------------------------------------------------------------------
The Busy Executive's Database Guide
Cooking with Computers: Surreptitious Balance Sheets
You Can Combat Computer Stress!
Straight Talk About Computers
But Is It User Friendly?
Secrets of Silicon Valley
Net Etiquette
Is Anger the Enemy?
Life Without Fear
Prolonged Data Deprivation: Four Case Studies
Emotional Security: A New Algorithm

(11 row(s) affected)
E. 使用 NOT EXISTS

NOT EXISTS 的作用与 EXISTS 正相反。如果子查询没有返回行，则满足 NOT EXISTS 中的 WHERE 子句。本示例查找不出版商业书籍的出版商的名称：

USE pubs
GO
SELECT pub_name
FROM publishers
WHERE NOT EXISTS
   (SELECT *
   FROM titles
   WHERE pub_id = publishers.pub_id
   AND type = 'business')
ORDER BY pub_name
GO

下面是结果集：

pub_name
----------------------------------------
Binnet & Hardley
Five Lakes Publishing
GGG&G
Lucerne Publishing
Ramona Publishers
Scootney Books

(6 row(s) affected)

请参见

表达式

函数

WHERE


EXP

返回所给的 float 表达式的指数值。

语法

EXP ( float_expression )

参数

float_expression

是 float 类型的表达式。

返回类型

float

示例

本示例声明一个变量，同时返回所给变量 (378.615345498) 的指数值，并附有文字说明。

DECLARE @var float
SET @var = 378.615345498
SELECT 'The EXP of the variable is: ' + CONVERT(varchar,EXP(@var))
GO

下面是结果集：

The EXP of the variable is: 2.69498e+164

(1 row(s) affected)

请参见

CAST 和 CONVERT

float 和 real

数学函数

money 和 smallmoney


FETCH

从 Transact-SQL 服务器游标中检索特定的一行。

语法

FETCH
[ [ NEXT | PRIOR | FIRST | LAST
| ABSOLUTE { n | @nvar }
| RELATIVE { n | @nvar }
]
FROM
]
{ { [ GLOBAL ] cursor_name } | @cursor_variable_name }
[ INTO @variable_name [ ,...n ] ]

参数

NEXT

返回紧跟当前行之后的结果行，并且当前行递增为结果行。如果 FETCH NEXT 为对游标的第一次提取操作，则返回结果集中的第一行。NEXT 为默认的游标提取选项。

PRIOR

返回紧临当前行前面的结果行，并且当前行递减为结果行。如果 FETCH PRIOR 为对游标的第一次提取操作，则没有行返回并且游标置于第一行之前。

FIRST

返回游标中的第一行并将其作为当前行。

LAST

返回游标中的最后一行并将其作为当前行。

ABSOLUTE {n | @nvar}

如果 n 或 @nvar 为正数，返回从游标头开始的第 n 行并将返回的行变成新的当前行。如果 n 或 @nvar 为负数，返回游标尾之前的第 n 行并将返回的行变成新的当前行。如果 n 或 @nvar 为 0，则没有行返回。n 必须为整型常量且 @nvar 必须为 smallint、tinyint 或 int。

RELATIVE {n | @nvar}

如果 n 或 @nvar 为正数，返回当前行之后的第 n 行并将返回的行变成新的当前行。如果 n 或 @nvar 为负数，返回当前行之前的第 n 行并将返回的行变成新的当前行。如果 n 或 @nvar 为 0，返回当前行。如果对游标的第一次提取操作时将 FETCH RELATIVE 的 n 或 @nvar 指定为负数或 0，则没有行返回。n 必须为整型常量且 @nvar 必须为 smallint、tinyint 或 int。

GLOBAL

指定 cursor_name 指的是全局游标。

cursor_name

要从中进行提取的开放游标的名称。如果同时有以 cursor_name 作为名称的全局和局部游标存在，若指定为 GLOBAL 则 cursor_name 对应于全局游标，未指定 GLOBAL 则对应于局部游标。

@cursor_variable_name

游标变量名，引用要进行提取操作的打开的游标。

INTO @variable_name[,...n]

允许将提取操作的列数据放到局部变量中。列表中的各个变量从左到右与游标结果集中的相应列相关联。各变量的数据类型必须与相应的结果列的数据类型匹配或是结果列数据类型所支持的隐性转换。变量的数目必须与游标选择列表中的列的数目一致。

注释

如果 SCROLL 选项未在 SQL-92 样式的 DECLARE CURSOR 语句中指定，则 NEXT 是唯一受支持的 FETCH 选项。如果在 SQL-92 样式的 DECLARE CURSOR 语句中指定了 SCROLL 选项，则支持所有的 FETCH 选项。

如果使用 Transact_SQL DECLARE 游标扩展，以下规则适用：

  • 如果指定了 FORWARD-ONLY 或 FAST_FORWARD，NEXT 是唯一受支持的 FETCH 选项。

  • 如果未指定 DYNAMIC、FORWARD-ONLY 或 FAST_FORWARD 选项，并且指定了 KEYSET、STATIC 或 SCROLL 中的某一个，则支持所有 FETCH 选项。

  • DYNAMIC SCROLL 支持除 ABSOLUTE 之外的所有 FETCH 选项。

@@FETCH_STATUS 函数报告上一个 FETCH 语句的状态。相同的信息记录于由 sp_describe_cursor 返回的游标中的 fetch_status 列中。这些状态信息应该用于在对由 FETCH 语句返回的数据进行任何操作之前，以确定这些数据的有效性。有关更多信息，请参见 @@FETCH_STATUS。

权限

FETCH 的默认权限为任何合法用户。

示例
A. 在简单的游标中使用 FETCH

下例为 authors 表中姓以字母 B 开头的行声明了一个简单的游标，并使用 FETCH NEXT 逐个提取这些行。FETCH 语句以单行结果集形式返回由 DECLARE CURSOR 指定的列的值。

USE pubs
GO
DECLARE authors_cursor CURSOR FOR
SELECT au_lname FROM authors
WHERE au_lname LIKE "B%"
ORDER BY au_lname

OPEN authors_cursor

-- Perform the first fetch.
FETCH NEXT FROM authors_cursor

-- Check @@FETCH_STATUS to see if there are any more rows to fetch.
WHILE @@FETCH_STATUS = 0
BEGIN
   -- This is executed as long as the previous fetch succeeds.
   FETCH NEXT FROM authors_cursor
END

CLOSE authors_cursor
DEALLOCATE authors_cursor
GO

au_lname
----------------------------------------
Bennet
au_lname
----------------------------------------
Blotchet-Halls
au_lname
----------------------------------------
B. 使用 FETCH 将值存入变量

下例与上例相似，但 FETCH 语句的输出存储于局部变量而不是直接返回给客户端。PRINT 语句将变量组合成单一字符串并将其返回到客户端。

USE pubs
GO

-- Declare the variables to store the values returned by FETCH.
DECLARE @au_lname varchar(40), @au_fname varchar(20)

DECLARE authors_cursor CURSOR FOR
SELECT au_lname, au_fname FROM authors
WHERE au_lname LIKE "B%"
ORDER BY au_lname, au_fname

OPEN authors_cursor

-- Perform the first fetch and store the values in variables.
-- Note: The variables are in the same order as the columns
-- in the SELECT statement.

FETCH NEXT FROM authors_cursor
INTO @au_lname, @au_fname

-- Check @@FETCH_STATUS to see if there are any more rows to fetch.
WHILE @@FETCH_STATUS = 0
BEGIN

   -- Concatenate and display the current values in the variables.
   PRINT "Author: " + @au_fname + " " +  @au_lname

   -- This is executed as long as the previous fetch succeeds.
   FETCH NEXT FROM authors_cursor
   INTO @au_lname, @au_fname
END

CLOSE authors_cursor
DEALLOCATE authors_cursor
GO

Author: Abraham Bennet
Author: Reginald Blotchet-Halls
C. 声明 SCROLL 游标并使用其它 FETCH 选项

下例创建一个 SCROLL 游标，使其通过 LAST、PRIOR、RELATIVE 和 ABSOLUTE 选项支持所有滚动能力。

USE pubs
GO

-- Execute the SELECT statement alone to show the
-- full result set that is used by the cursor.
SELECT au_lname, au_fname FROM authors
ORDER BY au_lname, au_fname

-- Declare the cursor.
DECLARE authors_cursor SCROLL CURSOR FOR
SELECT au_lname, au_fname FROM authors
ORDER BY au_lname, au_fname

OPEN authors_cursor

-- Fetch the last row in the cursor.
FETCH LAST FROM authors_cursor

-- Fetch the row immediately prior to the current row in the cursor.
FETCH PRIOR FROM authors_cursor

-- Fetch the second row in the cursor.
FETCH ABSOLUTE 2 FROM authors_cursor

-- Fetch the row that is three rows after the current row.
FETCH RELATIVE 3 FROM authors_cursor

-- Fetch the row that is two rows prior to the current row.
FETCH RELATIVE -2 FROM authors_cursor

CLOSE authors_cursor
DEALLOCATE authors_cursor
GO

au_lname                                 au_fname
---------------------------------------- --------------------
Bennet                                   Abraham
Blotchet-Halls                           Reginald
Carson                                   Cheryl
DeFrance                                 Michel
del Castillo                             Innes
Dull                                     Ann
Green                                    Marjorie
Greene                                   Morningstar
Gringlesby                               Burt
Hunter                                   Sheryl
Karsen                                   Livia
Locksley                                 Charlene
MacFeather                               Stearns
McBadden                                 Heather
O'Leary                                  Michael
Panteley                                 Sylvia
Ringer                                   Albert
Ringer                                   Anne
Smith                                    Meander
Straight                                 Dean
Stringer                                 Dirk
White                                    Johnson
Yokomoto                                 Akiko

au_lname                                 au_fname
---------------------------------------- --------------------
Yokomoto                                 Akiko
au_lname                                 au_fname
---------------------------------------- --------------------
White                                    Johnson
au_lname                                 au_fname
---------------------------------------- --------------------
Blotchet-Halls                           Reginald
au_lname                                 au_fname
---------------------------------------- --------------------
del Castillo                             Innes
au_lname                                 au_fname
---------------------------------------- --------------------
Carson                                   Cheryl

请参见

CLOSE

游标

DEALLOCATE

DECLARE CURSOR

OPEN


FILE_ID

返回当前数据库中给定逻辑文件名的文件标识 (ID) 号。

语法

FILE_ID ( 'file_name' )

参数

'file_name'

要返回其文件 ID 的文件的名称。file_name 为 nchar(128)。

返回类型

smallint

注释

file_name 对应于 sysfiles 中的 name 列。

示例

下例返回 master 数据库的文件 ID (1)。

USE master
SELECT FILE_ID('master')

请参见

控制流语言

DELETE

INSERT

元数据函数

SELECT

UPDATE

WHERE


FILE_NAME

返回给定文件标识 (ID) 号的逻辑文件名。

语法

FILE_NAME ( file_id )

参数

file_id

要返回其对应文件名的文件标识号。file_id 为 smallint。

返回类型

nvarchar(128)

注释

file_ID 对应于 sysfiles 中的 fileid 列。

示例

下例返回 file_ID 为 1 的文件名（master 数据库文件）。

USE master
SELECT FILE_NAME(1)

请参见

控制流语言

DELETE

INSERT

元数据函数

SELECT

UPDATE

WHERE


FILEGROUP_ID

返回给定文件组名称的文件组标识 (ID) 号。

语法

FILEGROUP_ID ( 'filegroup_name' )

参数

'filegroup_name'

要返回其文件组 ID 的文件组名。filegroup_name 为 nvarchar(128)。

返回类型

smallint

注释

filegroup_name 对应于 sysfilegroups 中的 groupname 列。

示例

下例返回名为 default 的文件组的文件组 ID。

USE master
SELECT FILEGROUP_ID('default')

请参见

控制流语言

DELETE

INSERT

元数据函数

SELECT

UPDATE

WHERE


FILEGROUP_NAME

返回给定文件组标识 (ID) 号的文件组名。

语法

FILEGROUP_NAME ( filegroup_id )

参数

filegroup_id

为其返回文件组名的文件组 ID 号。filegroup_id 为 smallint。

返回类型

nvarchar(128)

注释

filegroup_id 对应于 sysfilegroups 中的 groupid 列。

示例

下例返回文件组 ID 为 1（默认值）的文件组名。

USE master
SELECT FILEGROUP_NAME(1)

请参见

控制流语言

DELETE

INSERT

元数据函数

SELECT

UPDATE

WHERE


FILEGROUPPROPERTY

给定文件组和属性名时，返回指定的文件组属性值。

语法

FILEGROUPPROPERTY ( filegroup_name , property )

参数

filegroup_name

包含文件组名称的表达式，将为该文件组返回指定的属性信息。filegroup_name 为 nvarchar(128)。

property

包含要返回的文件组属性名称的表达式。property 为 varchar(128)，并且可为以下值之一。

Value | 描述 | 返回的值
IsReadOnly | 文件组名为只读。 | 1 = True 0 = False NULL = 无效的输入
IsUserDefinedFG | 文件组名为用户定义的文件组。 | 1 = True 0 = False NULL = 无效的输入
IsDefault | 文件组名为默认的文件组。 | 1 = True 0 = False NULL = 无效的输入

返回类型

int

示例

此示例返回主文件组的 IsUserDefinedFG 属性设置。

USE master
SELECT FILEGROUPPROPERTY('primary', 'IsUserDefinedFG')

请参见

控制流语言

DELETE

INSERT

元数据函数

SELECT

UPDATE

WHERE


FILEPROPERTY

给定文件名和属性名时，返回指定的文件名属性值。

语法

FILEPROPERTY ( file_name , property )

参数

file_name

含有与当前数据库关联的文件名的表达式，将为该数据库返回属性信息。file_name 为 nchar(128)。

property

含有要返回的文件属性名称的表达式。property 为 varchar(128)，并且可为以下值之一。

Value | 描述 | 返回的值
IsReadOnly | 文件为只读。 | 1 = True 0 = False NULL = 无效的输入
IsPrimaryFile | 文件为主文件。 | 1 = True 0 = False NULL = 无效的输入
IsLogFile | 文件为日志文件。 | 1 = True 0 = False NULL = 无效的输入
SpaceUsed | 指定的文件所占用的空间数目。 | 文件中所分配的页数

返回类型

int

示例

此示例返回 master 数据库主文件名的 IsPrimaryFile 属性设置。

USE master
SELECT FILEPROPERTY('master', 'IsPrimaryFile')

请参见

控制流语言

DELETE

INSERT

元数据函数

SELECT

UPDATE

WHERE


float 和 real

用于表示浮点数字数据的近似数字数据类型。浮点数据为近似值；并非数据类型范围内的所有数据都能精确地表示。

语法

float [ ( n ) ]

从 - 1.79E + 308 到 1.79E + 308 之间的浮点数字数据。n 为用于存储科学记数法 float 数尾数的位数，同时指示其精度和存储大小。n 必须为从 1 到 53 之间的值。

n 所在范围 | 精度 | 存储大小
1-24 | 7 位数 | 4 字节
25-53 | 15 位数 | 8 字节

Microsoft® SQL Server™ float[(n)] 数据类型对于从 1 到 53 之间的所有 n 值均符合 SQL-92 标准。double precision 的同义词为 float(53)。

real

从 ?3.40E + 38 到 3.40E + 38 之间的浮点数字数据。存储大小为 4 字节。在 SQL Server 中，real 的同义词为 float(24)。

请参见

ALTER TABLE

CAST 和 CONVERT

CREATE TABLE

数据类型转换

数据类型

DECLARE @local_variable

DELETE

INSERT

SET @local_variable

UPDATE


FLOOR

返回小于或等于所给数字表达式的最大整数。

语法

FLOOR ( numeric_expression )

参数

numeric_expression

精确数字或近似数字数据类型类别的表达式（bit 数据类型除外）。

返回类型

返回与 numeric_expression 相同的类型。

示例

此示例说明正数、负数和货币值在 FLOOR 函数中的运用。

SELECT FLOOR(123.45), FLOOR(-123.45), FLOOR($123.45)

结果为与 numeric_expression 数据类型相同的计算值的整数部分。

---------      ---------     -----------
123            -124          123.0000

请参见

数学函数


fn_helpcollations

返回 Microsoft® SQL Server™ 2000 支持的所有排序规则的列表。

语法

fn_helpcollations ()

返回表

fn_helpcollations 返回下列信息。

列名 | 数据类型 | 描述
Name | sysname | 标准排序规则名称
Description | nvarchar(1000) | 对排序规则的描述

请参见

COLLATE

COLLATIONPROPERTY


fn_listextendedproperty

返回数据库对象的扩展属性值。

语法

fn_listextendedproperty (
{ default | [ @name = ] 'property_name' | NULL }
, { default | [ @level0type = ] 'level0_object_type' | NULL }
, { default | [ @level0name = ] 'level0_object_name' | NULL }
, { default | [ @level1type = ] 'level1_object_type' | NULL }
, { default | [ @level1name = ] 'level1_object_name' | NULL }
, { default | [ @level2type = ] 'level2_object_type' | NULL }
, { default | [ @level2name = ] 'level2_object_name' | NULL }
)

参数

{default|[@name =] 'property_name'|NULL}

是属性的名称。property_name 为 sysname 类型。有效的输入为 default、NULL 或属性名。

{default|[@level0type =] 'level0_object_type'|NULL}

用户或用户定义类型。level0_object_type 的数据类型为 varchar(128)，其默认值为 NULL。有效的输入是 USER、TYPE、default 和 NULL。

{default|[@level0name =] 'level0_object_name'|NULL}

指定的 0 级对象类型的名称。level0_object_name 的数据类型为 sysname，其默认值为 NULL。有效的输入为 default、NULL 或对象名。

{default|[@level1type =] 'level1_object_type'|NULL}

1 级对象的类型。level1_object_type 的数据类型为 varchar(128)，其默认值为 NULL。有效的输入为 TABLE、VIEW、PROCEDURE、FUNCTION、DEFAULT、RULE、default 和 NULL。

说明 默认映射 NULL，而"default"映射对象类型 DEFAULT。

{default|[@level1name =] 'level1_object_name'|NULL}

指定的 1 级对象类型的名称。level1_object_name 的数据类型为 sysname，其默认值为 NULL。有效的输入为 default、NULL 或对象名。

{default|[@level2type =] 'level2_object_type'|NULL}

2 级对象的类型。level2_object_type 的数据类型为 varchar(128)，其默认值为 NULL。有效的输入为 COLUMN、PARAMETER、INDEX、CONSTRAINT、TRIGGER、DEFAULT、default（映射 NULL）和 NULL。

{default|[@level2name =] 'level2_object_name'|NULL}

指定的 2 级对象类型的名称。level2_object_name 的数据类型为 sysname，其默认值为 NULL。有效的输入为 default、NULL 或对象名。

返回表

下面是 fn_listextendedproperty 返回的表的格式。

列名 | 数据类型
objtype | sysname
objname | sysname
name | sysname
value | sql_variant

如果返回的表为空，可能对象没有扩展属性或用户没有列出对象扩展属性的权限。

注释

系统对象不允许有扩展属性。

如果 property_name 的值为 NULL 或 default，fn_listextendedproperty 返回对象的所有属性。

如果指定了对象类型且相应的对象名的值为 NULL 或 default，则 fn_listextendedproperty 返回指定类型的所有对象的所有扩展属性。

对象是按级别区分的，0 级为最高，2 级为最低。如果指定了较低级别的对象（1 或 2 级）类型和名称，则父对象类型和名称的值不能为 NULL 或 default。否则，函数将返回错误。

用于列出某些级别对象类型的扩展属性的权限有所不同。

  • 对于级别 0 的对象，如果某用户为级别 0 的名称中所标识的用户，或者是 db_owner 和 db_ddladmin 固定数据库角色的成员，则该用户可以列出指定"user"类型的扩展属性。

  • 所有用户可使用 0 级对象类型"type"列出扩展属性。

  • 对于 1 级对象，如果用户为对象的所有者或用户对于对象有权限，该用户可以用任何有效的类型值列出扩展属性。

  • 对于 2 级对象，如果当前用户对父对象（1 级和 0级）有任何权限，该用户可以用任何有效的类型值列出扩展属性。
示例

此示例列出数据库的所有扩展属性。

SELECT   *
FROM   ::fn_listextendedproperty(NULL, NULL, NULL, NULL, NULL, NULL, NULL)

-或-

SELECT   *
FROM   ::fn_listextendedproperty(default, default, default, default, default, default, default)

此示例列出表"T1"中所有列的所有扩展属性。

CREATE   table T1 (id int , name char (20))

EXEC   sp_addextendedproperty 'caption', 'Employee ID', 'user', dbo, 'table', 'T1', 'column', id

EXEC   sp_addextendedproperty 'caption', 'Employee Name', 'user', dbo, 'table', 'T1', 'column', name

SELECT   *
FROM   ::fn_listextendedproperty (NULL, 'user', 'dbo', 'table', 'T1', 'column', default)

下面是结果集：

objtype | objname | name | value
COLUMN | id | caption | Employee ID
COLUMN | name | caption | Employee Name

请参见

属性管理

sp_addextendedproperty


fn_servershareddrives

返回由群集服务器使用的共享驱动器名称。

语法

fn_servershareddrives()

返回表

如果当前服务器实例不是群集服务器，则 fn_servershareddrives 返回空行集。

如果当前服务器是群集服务器，则 fn_servershareddrives 返回下列信息：

名称 | 数据类型 | 描述
DriveName | nchar(1) | 共享驱动器的名称

注释

fn_servershareddrives 返回该群集服务器使用的共享驱动器的列表。这些共享驱动器与 SQL Server 资源属于同一群集组。此外，SQL Server 资源依赖于这些驱动器。

该函数在识别用户可用的驱动器时十分有用。

示例

以下是在群集服务器实例上的查询。

SELECT *
FROM ::fn_servershareddrives()

下面是结果集：

DriveName
--------
m
n

请参见

故障转移群集

fn_virtualservernodes


fn_trace_geteventinfo

返回有关跟踪的事件信息。

语法

fn_trace_geteventinfo ( [ @traceid = ] trace_id )

参数

[ @traceid = ] trace_id

此跟踪的 ID，trace_id 的数据类型为 int，没有默认设置。用户使用 trace_id 值识别、修改和控制跟踪。

返回表
列名 | 数据类型 | 描述
EventID | int | 跟踪的事件的 ID
ColumnID | int | 为每个事件收集的所有列的 ID 号

注释

fn_trace_geteventinfo 是 Microsoft® SQL Server™ 2000 的内置函数，该函数执行许多以前由 SQL Server 早期版本提供的扩展存储过程所执行的操作。使用 fn_trace_geteventinfo 而不使用：

  • xp_trace_geteventclassrequired

  • xp_trace_getqueuecreateinfo

  • xp_trace_getqueueproperties

若要获得过去由 xp_trace_geteventclassrequired 返回的信息，例如，用下列格式执行查询：

SELECT *
FROM ::fn_trace_geteventinfo(trace_id)
WHERE EventID= 'x'

请参见

sp_trace_generateevent

sp_trace_setevent

sp_trace_setfilter


fn_trace_getfilterinfo

返回有关应用于指定跟踪的筛选的信息。

语法

fn_trace_getfilterinfo( [ @traceid = ] trace_id )

参数

[ @traceid = ] trace_id

此跟踪的 ID，trace_id 的数据类型为 int，没有默认设置。用户使用 trace_id 值识别、修改和控制跟踪。

返回表

该函数返回下列信息。有关这些列的更多信息，请参见 sp_trace_setfilter。

列名 | 数据类型 | 描述
Column ID | int | 应用筛选的列的 ID。
Logical Operator | int | 指定是否应用 AND 或 OR 运算符。
Comparison Operator | int | 指定比较类型（=、<>、<、>、<=、>=、LIKE 或 NOT LIKE）。
Value | sql_variant | 指定应用筛选的值。

注释

fn_trace_getfilterinfo 是 Microsoft® SQL Server™ 2000 的内置函数，该函数执行许多以前由 SQL Server 早期版本提供的扩展存储过程所执行的操作。使用 fn_trace_getfilterinfo 代替 xp_trace_get*filter 扩展存储过程。有关更多信息，请参见创建并管理跟踪和模板。

若要使用 fn_trace_getfilterinfo 以获得有关特定跟踪应用的或可用的筛选的信息，请执行下列格式的查询：

SELECT *
FROM ::fn_trace_getfilterinfo(trace_id)
WHERE

请参见

sp_trace_setfilter


fn_trace_getinfo

返回有关指定跟踪或现有跟踪的信息。

语法

fn_trace_getinfo( [ @traceid = ] trace_id )

参数

[ @traceid = ] trace_id

是跟踪的 ID，为整数。若要返回有关所有跟踪的信息，请指定该参数的默认值。必须使用关键字"default"，如下所示

SELECT * FROM :: fn_trace_getinfo(default)

当显式提供 0 值时，该函数将返回所有的跟踪，就像用"default"关键字调用该函数一样。用户使用 trace_id 值标识、修改和控制跟踪。

返回表

如果指定了 trace_id，则 fn_trace_getinfo 返回含有指定跟踪信息的表。如果没有指定 trace_id，则该函数返回所有活动跟踪的信息。

列名 | 数据类型 | 描述
TraceId | int | 此跟踪的 ID。
Property | int | 跟踪的属性，由下列整数表示： 1 – 跟踪选项（请参见 sp_trace_create 中的 @options） 2 – FileName 3 – MaxSize 4 – StopTime 5 – 当前跟踪状态
Value | sql_variant | 有关指定跟踪的属性的信息。

注释

fn_trace_getinfo 是 Microsoft® SQL Server™ 2000 的内置函数，该函数执行许多以前由 SQL Server 早期版本提供的扩展存储过程所执行的操作。使用 fn_trace_getinfo 代替下列函数：

  • xp_trace_getqueuecreateinfo

  • xp_trace_getqueuedestination

  • xp_trace_getqueueproperties

若要获得过去由 xp_trace_getqueueproperties 返回的信息，例如，用下列格式执行查询：

SELECT *
FROM ::fn_trace_getinfo(trace_id)
WHERE Property=4

请参见

sp_trace_generateevent

sp_trace_setevent

sp_trace_setfilter

sp_trace_setstatus


fn_trace_gettable

以表格格式返回跟踪文件信息。

语法

fn_trace_gettable( [ @filename = ] filename , [ @numfiles = ] number_files )

参数

[ @filename = ] filename

指定要读取的初始跟踪。filename 的数据类型为 nvarchar(256)，没有默认设置。

[ @numfiles = ] number_files

指定要读取的翻转文件数，包括在 filename 中指定的初始文件。number_files 的数据类型为 int。用户可指定默认值"default"以指示 SQL Server 读取全部翻转文件直至跟踪结束。

SELECT * FROM ::fn_trace_gettable('c:\my_trace.trc', default)
GO

或

SELECT * FROM ::fn_trace_gettable(('c:\my_trace.trc', -1)
GO
返回表

fn_trace_gettable 返回含有所有有效列的表。有关信息，请参见 sp_trace_setevent。

示例

下例将该函数作为 SELECT..INTO 语句的一部分调用，并返回可以装入 SQL 事件探查器的表。

USE pubs
SELECT * INTO temp_trc
FROM ::fn_trace_gettable(c:\my_trace.trc", default)

请参见

sp_trace_generateevent

sp_trace_setevent

sp_trace_setfilter

sp_trace_setstatus


fn_virtualfilestats

返回对数据库文件（包括日志文件）的 I/O 统计。

语法

fn_virtualfilestats ( [@DatabaseID=] database_id
, [ @FileID = ] file_id )

参数

[@DatabaseID=] database_id

数据库的 ID，database_id 的数据类型为 int，没有默认设置。

[ @FileID = ] file_id

文件的 ID，file_id 的数据类型为 int，没有默认设置。

返回表
Column Name | 数据类型 | 描述
DbId | smallint | 数据库 ID
FileId | smallint | 文件 ID
TimeStamp | int | 提取数据的时间
NumberReads | bigint | 在文件上发出的读取次数
NumberWrites | bigint | 在文件上写入的次数
BytesRead | bigint | 在文件上发出的读取字节数
BytesWritten | bigint | 在文件上写入的字节数
IoStallMS | bigint | 用户等待在文件上完成 I/O 活动的总计时间（以毫秒为单位）

注释

fn_virtualfilestats 是系统表值函数，提供统计信息，如在文件上操作的 I/O 活动的总数。该函数有助于跟踪用户必须等待以读取或写入文件的时间长度。该函数还有助于识别出遇到大量 I/O 活动的文件。

示例
SELECT *
FROM :: fn_virtualfilestats(1, 1)


fn_virtualservernodes

返回可运行虚拟服务器的节点的列表。这类信息在故障转移群集环境中十分有用。

语法

fn_virtualservernodes()

返回表

如果当前服务器实例不是群集服务器，则 fn_virtualservernodes 返回空行集。

如果当前服务器是群集服务器，则 fn_virtualservernodes 返回已定义了该虚拟服务器的节点的列表。

示例

以下是在群集服务器实例上的查询。

SELECT *
FROM ::fn_virtualservernodes()

下面是结果集：

NodeName
--------
ntmachine1
ntmachine2

请参见

故障转移群集

fn_servershareddrives


FOR 子句

FOR 子句用于指定 BROWSE 或 XML 选项（BROWSE 和 XML 是不相关的选项）。

语法

[ FOR { BROWSE | XML { RAW | AUTO | EXPLICIT }
[ , XMLDATA ]
[ , ELEMENTS ]
[ , BINARY BASE64 ]
        }
]

参数

BROWSE

指定当查看 DB-Library 浏览模式游标中的数据时允许更新。如果表包含时间戳列（用 timestamp 数据类型定义的列），表有唯一索引且 FOR BROWSE 选项在 SELECT 语句的最后发送到 SQL Server，则可以在应用程序中浏览该表。有关更多信息，请参见浏览模式。

说明 在含有 FOR BROWSE 选项的 SELECT 语句中无法使用 <lock_hint> HOLDLOCK。

FOR BROWSE 选项不能出现在用 UNION 运算符联接的 SELECT 语句中。

XML

指定查询结果将作为 XML 文档返回。必须指定下列 XML 模式之一：RAW、AUTO、EXPLICIT。有关 XML 数据和 SQL Server 的更多信息，请参见使用 FOR XML 检索 XML 文档。

RAW

获得查询结果并将结果集内的各行转换为 XML 元素，用一般标识符 <row /> 作为元素标记。有关更多信息，请参见使用 RAW 模式。

AUTO

以简单的嵌套 XML 树返回查询结果。在 FROM 子句内，每个在 SELECT 子句中至少有一列被列出的表都表示为一个 XML 元素。SELECT 子句中列出的列映射到适当的元素特性。有关更多信息，请参见使用 AUTO 模式。

EXPLICIT

指定显式定义所得到的 XML 树的形状。使用此种模式，要求以一种特定的方式编写查询，以便显式指定有关期望的嵌套的附加信息。有关更多信息，请参见使用 EXPLICIT 模式。

XMLDATA

返回架构，但不将根元素添加到结果中。如果指定了 XMLDATA，它将被追加到文档上。

ELEMENTS

指定列作为子元素返回。否则，列将映射到 XML 特性。

BINARY BASE64

指定查询返回二进制 base64 编码格式的二进制数据。使用 RAW 和 EXPLICIT 模式检索二进制数据时，必须指定该选项。这是 AUTO 模式中的默认值。


FORMATMESSAGE

从 sysmessages 现有的消息构造消息。FORMATMESSAGE 与 RAISERROR 语句的功能相似；但 RAISERROR 立即输出消息而 FORMATMESSAGE 返回编辑后的信息供进一步处理。

语法

FORMATMESSAGE ( msg_number , param_value [ ,...n ] )

参数

msg_number

存储于 sysmessages 的消息的 ID。如果消息在 sysmessages 中不存在，则返回 NULL。

param_value

消息中使用的一个或多个参数值。值的顺序必须与占位符变量在消息中出现的次序相同。值的最大数目为 20。

返回类型

nvarchar

注释

与 RAISERROR 语句相像，FORMATMESSAGE 用所提供的参数值替换消息中的占位符变量来编辑消息。有关错误信息中允许使用的占位符和编辑进程的更多信息，请参见 RAISERROR。

FORMATMESSAGE 查找用户当前语言的消息。如果消息没有本地化版本，则使用美国英语版本。

对于本地化的消息，所提供的参数值必须与美国英语版本中的参数占位符相对应。也就是说，本地化版本的参数 1 必须对应于美国英语版本的参数 1，参数 2 必须对应于参数 2，依此类推。

示例

此示例使用假定的存储于 sysmessages 中的 50001 号消息"The number of rows in %s is %1d."（%s 的行数为 %1d。）。FORMATMESSAGE 用值 Table1 和 5 替换参数占位符。结果字符串"The number of rows in Table1 is 5."存储于局部变量 @var1。

DECLARE @var1 VARCHAR(100)
SELECT @var1 = FORMATMESSAGE(50001, 'Table1', 5)

请参见

sp_addmessage

系统函数


FREETEXT

是个谓词，用于搜索含有基于字符的数据类型的列，其中的值符合在搜索条件中所指定文本的含义，但不符合表达方式。使用 FREETEXT 时，全文查询引擎内部将 freetext_string 拆分为若干个搜索词，并赋予每个词以不同的加权，然后查找匹配。

语法

FREETEXT ( { column | * } , 'freetext_string' )

参数

column

已经注册全文检索的特定列的名称。具有字符串数据类型的列是可进行全文检索的有效的列。

*

指定所有已注册用于全文检索的列均用于搜索给定的 freetext_string。

freetext_string

要在指定的 column 中进行搜索的文本。可以输入任何文本，包括单词、短语或句子。所输入的文本与语法无关。

注释

使用 FREETEXT 的全文查询没有使用 CONTAINS 的全文查询精度高。Microsoft® SQL Server™ 全文检索引擎识别重要的字词和短语。保留关键字或通配符字符都不具有特殊含义，而它们指定在 CONTAINS 谓词的 <contains_search_condition> 参数中时则通常具有含义。

当兼容性级别小于 70 时，FREETEXT 不被识别为关键字。有关更多信息，请参见 sp_dbcmptlevel。

示例
A. 使用 FREETEXT 搜索包含指定字符值的单词

下例搜索产品描述中含有与 bread、candy、dry 和 meat 相关的词语的所有产品类别，如 breads、candies、dried 和 meats 等。

USE Northwind
GO
SELECT CategoryName
FROM Categories
WHERE FREETEXT (Description, 'sweetest candy bread and dry meat' )
GO
B. 在全文检索中使用变量

下例使用变量而不是特定的搜索术语。

USE pubs
GO
DECLARE @SearchWord varchar(30)
SET @SearchWord ='Moon'
SELECT pr_info FROM pub_info WHERE FREETEXT(pr_info, @SearchWord)

请参见

CONTAINS

CONTAINSTABLE

数据类型

FREETEXTTABLE

WHERE


FREETEXTTABLE

为下述列返回含有零行、一行或多行的表：这些列含有基于字符的数据类型，其中的值符合指定的 freetext_string 中文本的含义，但不符合确切的表达方式。FREETEXTTABLE 可以在 SELECT 语句的 FROM 子句中象常规表名称一样进行引用。

使用 FREETEXTTABLE 的查询指定 freetext 类型的全文查询，这些查询为每行返回一个关联等级值 (RANK)。

语法

FREETEXTTABLE ( table , { column | * } , 'freetext_string' [ , top_n_by_rank ] )

参数

table

标记为用于全文查询的表的名称。table 可以是一部分、两部分或三部分组成的数据库对象名称。有关更多信息，请参见 Transact-SQL 语法规则。table 不能指定服务器名称，也不能用于对链接服务器的查询。

column

驻留在 table 中、要搜索的列的名称。具有字符串数据类型的列是可进行全文检索的有效的列。

*

指定所有已注册用于全文检索的列均用于搜索给定的 freetext_string。

freetext_string

要在指定的 column 中搜索的文本。不能使用变量。

top_n_by_rank

如果指定整型值 n，FREETEXTTABLE 仅返回最前面的 n 个匹配项，并按等级排序。

注释

FREETEXTTABLE 使用与 FREETEXT 谓词相同的搜索条件。

同 CONTAINSTABLE 一样，返回的表包含名为 KEY 和 RANK 的列，在查询中引用这些列以获得适当行并使用行等级值。

如果兼容级别小于 70，则 FREETEXTTABLE 无法被识别为关键字。有关更多信息，请参见 sp_dbcmptlevel。

权限

FREETEXTTABLE 只能由对指定表或表中所引用的列具有适当的 SELECT 特权的用户进行唤醒调用。

示例

此示例返回所有与 sweet、candy、bread、dry 和 meat 相关的类别的名称和描述。

USE Northwind
SELECT FT_TBL.CategoryName,
   FT_TBL.Description,
   KEY_TBL.RANK
FROM Categories AS FT_TBL INNER JOIN
   FREETEXTTABLE(Categories, Description,
   'sweetest candy bread and dry meat') AS KEY_TBL
   ON FT_TBL.CategoryID = KEY_TBL.[KEY]
GO

请参见

CONTAINS

CONTAINSTABLE

FREETEXT

对 SQL Server 数据进行全文查询

行集函数

SELECT

WHERE


FROM

指定在 DELETE、SELECT 和 UPDATE 语句中使用的表、视图、派生表和连接表。

语法

[ FROM { < table_source > } [ ,...n ] ]

< table_source > ::=
 table_name [ [ AS ] table_alias ] [ WITH ( < table_hint > [ ,...n ] ) ]
| view_name [ [ AS ] table_alias ] [ WITH ( < view_hint > [ ,...n ] ) ]
| rowset_function [ [ AS ] table_alias ]
| user_defined_function [ [ AS ] table_alias ]
| derived_table [ AS ] table_alias [ ( column_alias [ ,...n ] ) ]
| < joined_table >

< joined_table > ::=
< table_source > < join_type > < table_source > ON < search_condition >
| < table_source > CROSS JOIN < table_source >
| [ ( ] < joined_table > [ ) ]

< join_type > ::=
[ INNER | { { LEFT | RIGHT | FULL } [OUTER] } ]
[ < join_hint > ]
JOIN

参数

< table_source >

指定要在 Transact-SQL 语句中使用的表或视图（带或不带别名均可）。可在语句中使用多达 256 个表。可将 table 变量指定为表源。

如果表或视图存在于同一台运行 Microsoft® SQL Server™ 的计算机的其它数据库中，应按格式 database.owner.object_name 使用完全合法的名称。如果表或视图存在于本地服务器之外的一台链接的服务器上，应按以下格式使用由四部分组成的名称：linked_server.catalog.schema.object。如果由四部分构造的表（或视图）名称使用 OPENDATASOURCE 函数作为名称中的服务器部分，则该名称也可用于指定表源。有关该函数的更多信息，请参见 OPENDATASOURCE。

table_name

表名。FROM 关键字之后的表和视图的顺序并不影响返回的结果集。当 FROM 子句中出现重复名称时将报告错误。

[AS] table_alias

table_name、view_name 或 rowset_function 的别名，为方便起见而使用，或用于区分自联接或子查询中的表或视图。别名通常是一个缩短了的表名，用于在联接中引用表中的特定列。如果联接中的多个表中有相同名称的列存在，SQL Server 要求必须使用表名或别名来限定列名。（如果定义了别名则不能使用表名）。

WITH ( < table_hint > )

指定表扫描、查询优化器要使用的一个或多个索引或查询优化器要对此表、此语句使用的锁定方法。有关更多信息，请参见"表提示"。

view_name

是视图名称。视图是一个"虚拟表"，通常创建为一个或多个表中列的子集。

WITH ( < view_hint > )

指定索引视图扫描。默认情况下，视图在查询优化器处理查询之前展开。视图提示只能用在 SELECT 语句中，而不能用于 UPDATE、DELETE 或 INSERT 语句。

rowset_function

指定一个行集函数，该函数返回可替代表引用的对象。有关行集函数列表的更多信息，请参见行集函数。

user_defined_function

指定用户定义的函数，该函数返回一个表。如果用户定义的函数是一个内置的用户定义函数，则前面必须加两个冒号，如：

FROM ::fn_listextendedproperty

derived_table

是从数据库中检索行的子查询。derived_table 用作对外部查询的输入。

column_alias

替换结果集内列名的可选别名。在选择列表中放入每个列的一个别名，并将整个列别名列表用圆括号括起来。

<joined_table>

由两个或更多表的积组成的结果集，例如：

SELECT *
FROM tab1 LEFT OUTER JOIN tab2 ON tab1.c3 = tab2.c3
    RIGHT OUTER JOIN tab3 LEFT OUTER JOIN tab4
        ON tab3.c1 = tab4.c1
        ON tab2.c3 = tab4.c3

对于多个 CROSS 联接，请使用圆括号来更改联接的自然顺序。

<join_type>

指定联接操作的类型。

INNER

指定返回每对匹配的行。废弃两个表中不匹配的行。如果未指定联接类型，则这是默认设置。

FULL [OUTER]

指定在结果集中包含左表或右表中不满足联接条件的行，并将对应于另一个表的输出列设为 NULL。这是对通常由 INNER JOIN 返回的所有行的补充。

说明 按此处指定的方法指定外联接或在 WHERE 子句中使用旧式非标准的 *= 和 =* 运算符都是可行的。不能在同一语句中同时使用这两种方法。

LEFT [OUTER]

指定在结果集中包含左表中所有不满足联接条件的行，且在由内联接返回所有的行之外，将另外一个表的输出列设为 NULL。

RIGHT [OUTER]

指定在结果集中包含右表中所有不满足联接条件的行，且在由内联接返回的所有行之外，将与另外一个表对应的输出列设为 NULL。

<join_hint>

指定 SQL Server 查询优化器为在查询的 FROM 子句中指定的每个联接使用一个联接提示或执行算法。有关更多信息，请参见本主题下面的"联接提示"。

JOIN

指明所指定的联接操作应在给定的表或视图之间执行。

ON <search_condition>

指定联接所基于的条件。尽管经常使用列和比较运算符，但此条件可指定任何谓词，例如：

SELECT ProductID, Suppliers.SupplierID
    FROM Suppliers JOIN Products
    ON (Suppliers.SupplierID = Products.SupplierID)

当条件指定列时，列不一定必须具有相同的名称或数据类型；但是，如果数据类型不一致，则这些列要么必须相互兼容，要么是 Microsoft® SQL Server™ 能够隐性转换的类型。如果数据类型不能隐式转换，则条件必须使用 CAST 函数显式转换数据类型。

在 ON 子句中可能有仅涉及一个联接表的谓词。这样的谓词也可能出现在查询中的 WHERE 子句中。尽管这种谓词的放置在 INNER 联接中不会产生差别，但是在涉及 OUTER 联接时可能会导致不同的结果。这是因为 ON 子句中的谓词在应用于联接之前先应用于表，而 WHERE 子句在语意上应用于联接结果。

有关搜索条件和谓词的更多信息，请参见搜索条件。

CROSS JOIN

指定两个表的矢量积。这将返回相同的行，就好像在旧式的非 SQL-92 式联接中并没有指定 WHERE 子句。

表提示

表提示指定一个表扫描、查询优化器要使用的一个或多个索引或查询优化器要在该表中为该 SELECT 语句使用的锁定方法。虽然这是一个选项，但查询优化器通常无须指定提示就能够选择最佳优化方法。

注意 因为 SQL Server 查询优化器通常为查询选择最优执行计划，所以建议只将 <join_hint>、<query_hint>、<table_hint> 和 <view_hint> 作为经验丰富的开发人员和数据库管理员的最终手段。

如果查询计划不访问表，则忽略表提示。这可能是优化器作出完全不访问该表的选择的结果，或改为访问索引视图。在后一种情况中，使用 OPTION (EXPAND VIEWS) 查询提示可阻止使用索引视图。

鼓励在表提示之间使用逗号，尽管这是可选的。向后兼容性支持使用空格而不是逗号分隔提示。

鼓励使用 WITH 关键字，尽管目前这还不是必须。在将来的 SQL Server 版本中，WITH 可能会成为必需的关键字。

在 SQL Server 2000 中，所有的锁提示都传播给视图中引用的所有基表和视图。另外，SQL Server 执行相应的锁一致性检查。

如果表（包括系统表）中包含计算列，而这些计算列由访问其它表中的列的表达式或函数计算而得，则不在那些表上使用表提示（不传播表提示）。例如，在查询中的表上指定 NOLOCK 表提示。该表包含由访问另一表中的列的表达式和函数组合计算到的计算列。这些由表达式和函数引用的表在被访问时并不使用 NOLOCK 表提示。

对于 FROM 子句中的每个表，SQL Server 不允许有来自下列各组的多个表提示：

  • 粒度提示：PAGLOCK、NOLOCK、ROWLOCK、TABLOCK 或 TABLOCKX。

  • 隔离级别提示：HOLDLOCK、NOLOCK、READCOMMITTED、REPEATABLEREAD 或 SERIALIZABLE。

NOLOCK、READUNCOMMITTED 和 READPAST 表提示不能用于将进行删除、插入或更新操作的表。

语法

< table_hint > ::=
{ INDEX ( index_val [ ,...n ] )
| FASTFIRSTROW
| HOLDLOCK
| NOLOCK
| PAGLOCK
| READCOMMITTED
| READPAST
| READUNCOMMITTED
| REPEATABLEREAD
| ROWLOCK
| SERIALIZABLE
| TABLOCK
| TABLOCKX
| UPDLOCK
| XLOCK
}

参数

INDEX ( index_val [ ,...n ] )

指定 SQL Server 在处理语句时使用的索引的名称或 ID。只能为每个表指定一个索引提示。

如果存在聚集索引，则 INDEX(0) 强制聚集索引扫描，而 INDEX(1) 强制聚集索引扫描或查找。如果不存在聚集索引，则 INDEX(0) 强制表扫描，而 INDEX(1) 则被解释为错误。

选择性的 INDEX = 语法（用于指定单一索引提示）只受向后兼容性的支持。

如果在单一提示列表中使用了多个索引，则将忽略重复项，所列出的其余索引将用于检索表中的行。索引提示中的索引顺序很重要。多索引提示还强制索引 ANDing，且 SQL Server 在所访问的每个索引上应用尽可能多的条件。如果带提示的索引集合不是覆盖性的，则在检索全部索引列后执行一次提取操作。

说明 如果在星型联接的事实数据表中使用引用多个索引的索引提示，则 SQL Server 将忽略该索引提示并返回一条警告消息。此外，不允许在指定了索引提示的表上使用索引 OR 运算。

表提示中的最大索引数为 250 个非聚集索引。

FASTFIRSTROW

等同于 OPTION (FAST 1)。有关更多信息，请参见 SELECT 中 OPTION 子句的 FAST。

HOLDLOCK

等同于 SERIALIZABLE。（有关更多信息，请参见本主题下面的 SERIALIZABLE。）HOLDLOCK 选项仅适用于指定了该选项的表或视图，且仅限于由它所在语句所定义的事务的时间段内。HOLDLOCK 不能用于包括 FOR BROWSE 选项的 SELECT 语句。

NOLOCK

等同于 READUNCOMMITTED。有关更多信息，请参见本主题后面的 READUNCOMMITTED。

PAGLOCK

在通常采取单个共享表锁的地方采取共享页锁。

READCOMMITTED

指定用与运行在 READ COMMITTED 隔离级别的事务相同的锁定语义执行扫描。有关隔离级别的更多信息，请参见 SET TRANSACTION ISOLATION LEVEL。

READPAST

指定跳过（越过读取）锁定的行。例如，假设表 T1 包含单个整数列，其值为 1、2、3、4 和 5。如果事务 A 将值 3 更改为 8，但尚未提交，则 SELECT * FROM T1 (READPAST) 将生成值 1、2、4 和 5。READPAST 仅适用于在 READ COMMITTED 隔离级别操作的事务，且只越过读取行级锁。该锁提示主要用于在 SQL Server 表中实现工作队列。

READUNCOMMITTED

指定允许脏读。这表示不发放共享锁，也不遵守排它锁。允许脏读会导致更高的并发性，但会降低一致性。如果指定了 READUNCOMMITTED，就有可能读取未提交的事务，或读取在读取过程中回滚的一套页，因此可能出现错误信息。有关隔离级别的更多信息，请参见 SET TRANSACTION ISOLATION LEVEL。

说明 如果在指定了 READUNCOMMITTED 的情况下收到 601 号错误信息，则按解决死锁错误 (1205) 的方法解决该错误，然后重试执行语句。

REPEATABLEREAD

指定用与运行在 REPEATABLE READ 隔离级别的事务相同的锁定语义执行扫描。有关隔离级别的更多信息，请参见 SET TRANSACTION ISOLATION LEVEL。

ROWLOCK

指定在通常采取单个共享页或表锁的情形下采取共享行锁。

SERIALIZABLE

等同于 HOLDLOCK。通过将共享锁保持到事务完成，使之更具有约束性（而不要不管事务是否完成，都在不再需要所需的表或数据页时就立即释放共享锁）。用与运行在 SERIALIZABLE 隔离级别的事务相同的语义执行扫描。有关隔离级别的更多信息，请参见 SET TRANSACTION ISOLATION LEVEL。

TABLOCK

指定在表上采取的共享锁一直保持到语句结束。如果同时指定 HOLDLOCK，那么在事务结束之前该共享表锁将一直保持。

TABLOCKX

指定在表上采取的排它锁一直保持到语句结束或事务结束。

UPDLOCK

指定读取表时采取更新锁而不是共享锁，且将这些更新锁保持到语句结束或事务结束。

XLOCK

指定应采取排它锁，且保持到由语句所处理的全部数据上的事务结束。如果与 PAGLOCK 或 TABLOCK 一同指定，则排它锁适用于适当的粒度级别。

视图提示

视图提示只能用于索引视图。（索引视图是创建了唯一聚集索引的视图。）如果查询包含对同时存在于索引视图和基表中的列的引用，且 Microsoft SQL Server™ 查询优化器决定执行查询的最好方法是使用索引视图，则优化器使用视图上的索引。该功能仅在 Microsoft SQL Server 2000 企业版和开发版上受支持。

但是，为了让优化器权衡各种索引视图，必须将下列 SET 选项设为 ON：

ANSI_NULLS | ANSI_WARNINGS | CONCAT_NULL_YIELDS_NULL
ANSI_PADDING | ARITHABORT | QUOTED_IDENTIFIERS

此外，NUMERIC_ROUNDABORT 选项必须设为 OFF。

若要强制优化器对索引视图使用索引，请指定 NOEXPAND 选项。可能仅当在查询中也命名视图时才能使用该提示。对于不直接在 FROM 子句中命名视图的查询，SQL Server 2000 不提供强制在这类查询中使用特定索引视图的提示；然而，即使在查询中不直接引用索引视图，查询优化器也会考虑使用索引视图。

视图提示仅允许用于 SELECT 语句，而不能用于在 INSERT、UPDATE 和 DELETE 语句中作为表源的视图中。

语法

< view_hint > ::=
{ NOEXPAND [ , INDEX ( index_val [ ,...n ] ) ] }

参数

NOEXPAND

指定当查询优化器处理查询时不扩展索引视图。查询优化器将视图作为具有聚集索引的表。

INDEX ( index_val [ ,...n ] )

指定 SQL Server 在处理语句时要使用的索引名称或 ID。只能为一个视图指定一个索引提示。

INDEX(0) 强制执行聚集索引扫描，而 INDEX(1) 强制执行聚集索引扫描或查找。

如果在单个提示列表中使用了多个索引，将忽略重复项，其余列出的索引将用于检索索引视图的行。索引提示中的索引顺序很重要。多索引提示还强制索引 ANDing，且 SQL Server 在所访问的每个索引上应用尽可能多的条件。如果带提示的索引的集合并不包含查询中所引用的全部列，则在检索全部索引列后执行一次提取操作。

联接提示

联接提示在查询的 FROM 子句中指定，可在两个表之间强制联接策略。如果为任意两个表指定了联接提示，查询优化器会根据 ON 关键字的位置，自动为查询中所有联接的表强制联接顺序。在 CROSS JOINS 的情况下，如果没有使用 ON 子句，可使用括号指明联接顺序。

注意 SQL Server 查询优化器通常为查询选择最优执行计划，所以建议只把 <join_hint>、<query_hint> 和 <table_hint> 作为经验丰富的数据库管理员的最终手段。

语法

< join_hint > ::=
{ LOOP | HASH | MERGE | REMOTE }

参数

LOOP | HASH | MERGE

指定查询中的联接应使用循环、哈希或合并。使用 LOOP | HASH | MERGE JOIN 将在两个表之间强制一个特定联接。

REMOTE

指定联接操作在右表处执行。这在左表是本地表而右表是远程表的情况下很有用。只在左表的行数少于右表行数时才能使用 REMOTE。

如果右表为本地表，则联接在本地执行。如果两个表均为远程表但来自不同的数据源，REMOTE 将使联接在右表处执行。如果两个表均为远程表且来自相同数据源，则不必使用 REMOTE。

当使用 COLLATE 子句将联接谓词中正进行比较的一个值投影到不同的排序规则时，不能使用 REMOTE。

REMOTE 只可用于 INNER JOIN 操作。

注释

FROM 子句支持用于联接表和派生表的 SQL-92-SQL 语法。SQL-92 语法提供 INNER、LEFT OUTER、RIGHT OUTER、FULL OUTER 和 CROSS 联接运算符。

虽然可以支持 SQL Server 较早版本中的外联接运算符，但不能在同一个 FROM 子句中同时使用外联接运算符和 SQL-92 样式的联接表。

FROM 子句内的 UNION 和 JOIN 在视图、派生表和子查询中均受支持。

自联接是与自身联接的表。基于自联接的插入和更新遵循 FROM 子句中的顺序。

因为 Microsoft SQL Server™ 2000 会考虑来自提供列分发统计信息的链接服务器上的分发及基数统计信息，所以，不一定非得需要 REMOTE 联接提示来强制远程评估联接。SQL Server 查询处理器将考虑远程统计信息并确定远程联接策略是否适当。REMOTE 联接提示对不提供列分发统计信息的提供程序非常有用。有关更多信息，请参见 OLE DB 提供程序的分布统计要求。

权限

FROM 的权限默认为 DELETE、SELECT 或 UPDATE 语句的权限。

示例
A. 使用简单 FROM 子句

此示例从 publishers 表中检索 pub_id 和 pub_name 列。

USE pubs
SELECT pub_id, pub_name
FROM publishers
ORDER BY pub_id

下面是结果集：

pub_id pub_name
------ ---------------------
0736   New Moon Books
0877   Binnet & Hardley
1389   Algodata Infosystems
1622   Five Lakes Publishing
1756   Ramona Publishers
9901   GGG&G
9952   Scootney Books
9999   Lucerne Publishing

(8 row(s) affected)
B. 使用 TABLOCK 和 HOLDLOCK 优化器提示

下面的部分事务显示了如何在 authors 上放置一个显式共享表锁，以及如何读取索引。该锁在整个事务中均保持。

USE pubs
BEGIN TRAN
SELECT COUNT(*)
FROM authors WITH (TABLOCK, HOLDLOCK)
C. 使用 SQL-92 CROSS JOIN 语法

此示例返回 authors 和 publishers 两个表的矢量积。所返回的列表包含 au_lname 行和所有 pub_name 行的所有可能的组合。

USE pubs
SELECT au_lname, pub_name
FROM authors CROSS JOIN publishers
ORDER BY au_lname ASC, pub_name ASC

下面是结果集：

au_lname                                 pub_name
---------------------------------------- -------------------------------
Bennet                                   Algodata Infosystems
Bennet                                   Binnet & Hardley
Bennet                                   Five Lakes Publishing
Bennet                                   GGG&G
Bennet                                   Lucerne Publishing
Bennet                                   New Moon Books
Bennet                                   Ramona Publishers
Bennet                                   Scootney Books
Blotchet-Halls                           Algodata Infosystems
Blotchet-Halls                           Binnet & Hardley
Blotchet-Halls                           Five Lakes Publishing
Blotchet-Halls                           GGG&G
Blotchet-Halls                           Lucerne Publishing
Blotchet-Halls                           New Moon Books
Blotchet-Halls                           Ramona Publishers
Blotchet-Halls                           Scootney Books
Carson                                   Algodata Infosystems
Carson                                   Binnet & Hardley
Carson                                   Five Lakes Publishing
...
Stringer                                 Scootney Books
White                                    Algodata Infosystems
White                                    Binnet & Hardley
White                                    Five Lakes Publishing
White                                    GGG&G
White                                    Lucerne Publishing
White                                    New Moon Books
White                                    Ramona Publishers
White                                    Scootney Books
Yokomoto                                 Algodata Infosystems
Yokomoto                                 Binnet & Hardley
Yokomoto                                 Five Lakes Publishing
Yokomoto                                 GGG&G
Yokomoto                                 Lucerne Publishing
Yokomoto                                 New Moon Books
Yokomoto                                 Ramona Publishers
Yokomoto                                 Scootney Books

(184 row(s) affected)
D. 使用 SQL-92 FULL OUTER JOIN 语法

此示例返回 titles 表中的书籍标题及对应的出版商。还返回未出版列在 titles 表中的书籍的出版商，以及不是由 publishers 表中所列的出版商出版的所有书籍标题。

USE pubs
-- The OUTER keyword following the FULL keyword is optional.
SELECT SUBSTRING(titles.title, 1, 10) AS Title,
   publishers.pub_name AS Publisher
FROM publishers FULL OUTER JOIN titles
   ON titles.pub_id = publishers.pub_id
WHERE titles.pub_id IS NULL
   OR publishers.pub_id IS NULL
ORDER BY publishers.pub_name

下面是结果集：

Title      Publisher
---------- ----------------------------------------
NULL       Five Lakes Publishing
NULL       GGG&G
NULL       Lucerne Publishing
NULL       Ramona Publishers
NULL       Scootney Books

(5 row(s) affected)
E. 使用 SQL-92 LEFT OUTER JOIN 语法

此示例在 au_id 上联接两个表，并保留左表中没有匹配项的行。authors 表与 titleauthor 表在各表的 au_id 列上相匹配。无论作品出版或未出版，所有作者均出现在结果集中。

USE pubs
-- The OUTER keyword following the LEFT keyword is optional.
SELECT SUBSTRING(authors.au_lname, 1, 10) AS Last,
   authors.au_fname AS First, titleauthor.title_id
FROM authors LEFT OUTER JOIN titleauthor
   ON authors.au_id = titleauthor.au_id

下面是结果集：

Last       First                title_id
---------- -------------------- --------
White      Johnson              PS3333
Green      Marjorie             BU1032
Green      Marjorie             BU2075
Carson     Cheryl               PC1035
...                        ...
McBadden   Heather              NULL
Ringer     Anne                 PS2091
Ringer     Albert               PS2091
Ringer     Albert               PS2106

(29 row(s) affected)
F. 使用 SQL-92 INNER JOIN 语法

此示例返回所有出版商名称以及相应的所出版的书籍标题。

USE pubs
-- By default, SQL Server performs an INNER JOIN if only the JOIN
-- keyword is specified.
SELECT SUBSTRING(titles.title, 1, 30) AS Title, publishers.pub_name
FROM publishers INNER JOIN titles
   ON titles.pub_id = publishers.pub_id
ORDER BY publishers.pub_name

下面是结果集：

Title                          pub_name
------------------------------ ----------------------------------------
The Busy Executive's Database  Algodata Infosystems
Cooking with Computers: Surrep Algodata Infosystems
Straight Talk About Computers  Algodata Infosystems
But Is It User Friendly?       Algodata Infosystems
Secrets of Silicon Valley      Algodata Infosystems
Net Etiquette                  Algodata Infosystems
Silicon Valley Gastronomic Tre Binnet & Hardley
The Gourmet Microwave          Binnet & Hardley
The Psychology of Computer Coo Binnet & Hardley
Computer Phobic AND Non-Phobic Binnet & Hardley
Onions, Leeks, and Garlic: Coo Binnet & Hardley
Fifty Years in Buckingham Pala Binnet & Hardley
Sushi, Anyone?                 Binnet & Hardley
You Can Combat Computer Stress New Moon Books
Is Anger the Enemy?            New Moon Books
Life Without Fear              New Moon Books
Prolonged Data Deprivation: Fo New Moon Books
Emotional Security: A New Algo New Moon Books

(18 row(s) affected)
G. 使用 SQL-92 RIGHT OUTER JOIN 语法

此示例在 pub_id 上联接两个表，并保留右表中没有匹配项的行。publishers 表与 titles 表在各表的 pub_id 上相匹配。无论是否已出版书籍，所有出版商均出现在结果集中。

USE pubs
SELECT SUBSTRING(titles.title, 1, 30) AS 'Title', publishers.pub_name
FROM titles RIGHT OUTER JOIN publishers
   ON titles.pub_id = publishers.pub_id
ORDER BY publishers.pub_name

下面是结果集：

Title                          pub_name
------------------------------ ----------------------------------------
The Busy Executive's Database  Algodata Infosystems
Cooking with Computers: Surrep Algodata Infosystems
Straight Talk About Computers  Algodata Infosystems
But Is It User Friendly?       Algodata Infosystems
Secrets of Silicon Valley      Algodata Infosystems
Net Etiquette                  Algodata Infosystems
Silicon Valley Gastronomic Tre Binnet & Hardley
The Gourmet Microwave          Binnet & Hardley
The Psychology of Computer Coo Binnet & Hardley
Computer Phobic AND Non-Phobic Binnet & Hardley
Onions, Leeks, and Garlic: Coo Binnet & Hardley
Fifty Years in Buckingham Pala Binnet & Hardley
Sushi, Anyone?                 Binnet & Hardley
NULL                           Five Lakes Publishing
NULL                           GGG&G
NULL                           Lucerne Publishing
You Can Combat Computer Stress New Moon Books
Is Anger the Enemy?            New Moon Books
Life Without Fear              New Moon Books
Prolonged Data Deprivation: Fo New Moon Books
Emotional Security: A New Algo New Moon Books
NULL                           Ramona Publishers
NULL                           Scootney Books

(23 row(s) affected)
H. 使用 HASH 和 MERGE 联接提示

此示例在 authors、titleauthors 和 titles 表之间建立三表联接，以生成一个作者及其著作的列表。查询优化器使用 MERGE 联接将 authors 和 titleauthors (A x TA) 联接在一起。然后，将 authors 和 titleauthors MERGE 联接 (A x TA) 的结果与 titles 表进行 HASH 联结以生成 (A x TA) x T。

重要 指定联接提示后，要执行 INNER JOIN 时 INNER 关键字不再为可选，而必须显式说明。

USE pubs
SELECT SUBSTRING((RTRIM(a.au_fname) + ' ' + LTRIM(a.au_lname)), 1, 25)
   AS Name, SUBSTRING(t.title, 1, 20) AS Title
FROM authors a INNER MERGE JOIN titleauthor ta
   ON a.au_id = ta.au_id INNER HASH JOIN titles t
   ON t.title_id = ta.title_id
ORDER BY au_lname ASC, au_fname ASC

下面是结果集：

Warning: The join order has been enforced because a local join hint is used.
Name                      Title
------------------------- --------------------
Abraham Bennet            The Busy Executive's
Reginald Blotchet-Halls   Fifty Years in Bucki
Cheryl Carson             But Is It User Frien
Michel DeFrance           The Gourmet Microwav
Innes del Castillo        Silicon Valley Gastr
...                    ...
Johnson White             Prolonged Data Depri
Akiko Yokomoto            Sushi, Anyone?

(25 row(s) affected)
I. 使用派生表

此示例使用派生表和紧跟 FROM 子句的 SELECT 语句，返回所有作者的姓名以及所著书的标题的书号。

USE pubs
SELECT RTRIM(a.au_fname) + ' ' + LTRIM(a.au_lname) AS Name, d1.title_id
FROM authors a, (SELECT title_id, au_id FROM titleauthor) AS d1
WHERE a.au_id = d1.au_id
ORDER BY a.au_lname, a.au_fname

下面是结果集：

Name                                                          title_id
------------------------------------------------------------- --------
Abraham Bennet                                                BU1032
Reginald Blotchet-Halls                                       TC4203
Cheryl Carson                                                 PC1035
Michel DeFrance                                               MC3021
Innes del Castillo                                            MC2222
Ann Dull                                                      PC8888
Marjorie Green                                                BU1032
Marjorie Green                                                BU2075
Burt Gringlesby                                               TC7777
Sheryl Hunter                                                 PC8888
Livia Karsen                                                  PS1372
Charlene Locksley                                             PC9999
Charlene Locksley                                             PS7777
Stearns MacFeather                                            BU1111
Stearns MacFeather                                            PS1372
Michael O'Leary                                               BU1111
Michael O'Leary                                               TC7777
Sylvia Panteley                                               TC3218
Albert Ringer                                                 PS2091
Albert Ringer                                                 PS2106
Anne Ringer                                                   MC3021
Anne Ringer                                                   PS2091
Dean Straight                                                 BU7832
Johnson White                                                 PS3333
Akiko Yokomoto                                                TC7777

(25 row(s) affected)

请参见

CONTAINSTABLE

DELETE

FREETEXTTABLE

INSERT

OPENQUERY

OPENROWSET

运算符

UPDATE

WHERE


FROM 子句

指定从其中检索行的表。需要 FROM 子句，除非选择列表只包含常量、变量和算术表达式（没有列名）。有关更多信息，请参见 FROM。

语法

[ FROM { < table_source > } [ ,...n ] ]

< table_source > ::=
 table_name [ [ AS ] table_alias ] [ WITH ( < table_hint > [ ,...n ] ) ]
| view_name [ [ AS ] table_alias ]
| rowset_function [ [ AS ] table_alias ]
| OPENXML
| derived_table [ AS ] table_alias [ ( column_alias [ ,...n ] ) ]
    | < joined_table >

< joined_table > ::=
< table_source > < join_type > < table_source > ON < search_condition >
| < table_source > CROSS JOIN < table_source >
| < joined_table >

< join_type > ::=
[ INNER | { { LEFT | RIGHT | FULL } [OUTER] } ]
[ < join_hint > ]
JOIN

参数

< table_source >

指定用于 SELECT 语句的表、视图、派生表和联接表。

table_name [[AS] table_alias ]
指定表名和可选别名。
view_name [ [ AS ] table_alias ]
指定名称、视图和可选别名。
rowset_function [ [AS] table_alias ]
是行集函数名和可选别名。有关行集函数列表的更多信息，请参见行集函数。
OPENXML
在 XML 文档上提供行集视图。有关更多信息，请参见 OPENXML。
WITH ( < table_hint > [ ,...n ] )
指定一个或更多表提示。有关表提示的更多信息，请参见 FROM。
derived_table [ [ AS ] table_alias ]
是嵌套 SELECT 语句，可从指定的数据库和表中检索行。
column_alias
替换结果集内列名的可选别名。

<joined_table>

是两个或更多表的积的结果集。例如：

SELECT *
FROM tab1 LEFT OUTER JOIN tab2 ON tab1.c3 = tab2.c3
    RIGHT OUTER JOIN tab3 LEFT OUTER JOIN tab4
        ON tab3.c1 = tab4.c1
        ON tab2.c3 = tab4.c3

对于多个 CROSS 联接，请使用圆括号来更改联接的自然顺序。

<join_type>

指定联接操作的类型。

INNER
指定返回所有相匹配的行对。废弃两个表中不匹配的行。如果未指定联接类型，则这是默认设置。
LEFT [OUTER]
指定除所有由内联接返回的行外，所有来自左表的不符合指定条件的行也包含在结果集内。来自左表的输出列设置为 NULL。
RIGHT [OUTER]
指定除所有由内联接返回的行外，所有来自右表的不符合指定条件的行也包含在结果集内。来自右表的输出列设置为 NULL。
FULL [OUTER]
如果来自左表或右表的某行与选择准则不匹配，则指定在结果集内包含该行，并且将与另一个表对应的输出列设置为 NULL。除此之外，结果集中还包含通常由内联接返回的所有行。
<join_hint>
指定联接提示或执行算法。如果指定了 <join_hint>，也必须明确指定 INNER、LEFT、RIGHT 或 FULL。有关联接提示的更多信息，请参见 FROM。
JOIN
表示联接所指定的表或视图。

ON <search_condition>

指定联接所基于的条件。此条件可指定任何谓词，但通常使用列和比较运算符。例如：

SELECT ProductID, Suppliers.SupplierID
    FROM Suppliers JOIN Products
    ON (Suppliers.SupplierID = Products.SupplierID)

当条件指定列时，列不必有相同的名称或相同的数据类型。但是如果数据类型不同，则它们必须是兼容或可由 Microsoft® SQL Server™ 进行隐性转换的类型。如果数据类型不能隐式转换，则条件必须使用 CAST 函数显式转换数据类型。

有关搜索条件和谓词的更多信息，请参见搜索条件。

CROSS JOIN

指定两个表的矢量积。返回同样的行，就像要联接的表只列于 FROM 子句中，并且未指定 WHERE 子句。例如，这两个查询返回的结果集都由 T1 和 T2 中所有行的完全联接组成：

SELECT * FROM T1, T2
SELECT * FROM T1 CROSS JOIN T2


FULLTEXTCATALOGPROPERTY

返回有关全文目录属性的信息。

语法

FULLTEXTCATALOGPROPERTY ( catalog_name , property )

参数

catalog_name

包含全文目录名称的表达式。

property

包含全文目录属性名称的表达式。下表列出了这些属性，并提供所返回信息的描述。

属性 | 描述
PopulateStatus | 0 = 空闲 1 = 正在进行完全填充 2 = 已暂停 3 = 中止 4 = 正在恢复 5 = 关机 6 = 正在进行增量填充 7 = 生成索引 8 = 磁盘已满。已暂停 9 = 更改跟踪
ItemCount | 全文目录中当前全文索引项数目。
IndexSize | 全文索引的大小 (MB)。
UniqueKeyCount | 在此目录中组成全文索引的唯一字（键）的数目。这是全文目录中所存储的无干扰字数目的近似值。
LogSize | 与 Microsoft® 搜索服务全文目录相关联的错误日志组合集的大小，以字节表示。
PopulateCompletionAge | 上一次全文索引填充的完成时间与 01/01/1990 00:00:00 之间的时间差，用秒表示。

返回类型

int

注释

不应使应用程序在紧密循环中等待，该循环不断检查 PopulateStatus 属性是否变为空闲（表明填充已完成），这一点很重要，因为如果等待，会使 CPU 游离于数据库和全文检索处理之外，从而导致超时。

示例

此示例返回 Cat_Desc 全文目录中的全文索引项数目。

USE Northwind
GO
SELECT fulltextcatalogproperty('Cat_Desc', 'ItemCount')

下面是结果集：

-----------
9

请参见

FULLTEXTSERVICEPROPERTY

元数据函数

sp_help_fulltext_catalogs


FULLTEXTSERVICEPROPERTY

返回有关全文服务级别属性的信息。

语法

FULLTEXTSERVICEPROPERTY ( property )

参数

property

含有全文服务级别属性名称的表达式下表列出了这些属性，并提供所返回信息的描述。

属性 | 值
ResourceUsage | 一个从 1（后台）到 5（专用）之间的值。
ConnectTimeout | 在超时发生前，Microsoft 搜索服务等待所有与 Microsoft® SQL Sever™ 数据库服务器的连接完成以便进行全文索引填充所用的时间（以秒为单位）。
IsFulltextInstalled | 在 SQL Server 的当前实例中安装全文组件。 1 = 已安装全文组件。 0 = 未安装全文组件。 NULL = 输入无效或发生错误。
DataTimeout | 在超时发生前，Microsoft 搜索服务等待所有由 Microsoft SQL Server 数据库服务器返回数据以便进行全文索引填充所用的时间（以秒为单位）。

返回类型

int

示例

下例验证 ® 搜索服务是否已经安装。

SELECT fulltextserviceproperty('IsFulltextInstalled')

下面是结果集：

-----------
1

请参见

FULLTEXTCATALOGPROPERTY

元数据函数

sp_fulltext_service


GETANSINULL

返回会话的数据库的默认为空性。

语法

GETANSINULL ( [ 'database' ] )

参数

'database'

是要返回为空性信息的数据库名。database 是 char 类型或 nchar 类型。若 database 是 char 类型，则隐式转换为 nchar 类型。

返回类型

int

注释

当给定数据库为空性允许空值并且列或数据类型为空性没有显式定义，GETANSINULL 返回 1。这是 ANSI NULL 的默认值。

若要激活 ANSI NULL 默认设置行为，必须设置下列条件之一:

  • sp_dboption 'database_name', 'ANSI null default', true

  • SET ANSI_NULL_DFLT_ON ON

  • SET ANSI_NULL_DFLT_OFF OFF
示例

下面的示例检查 pubs 数据库的默认为空性。

USE pubs
GO
SELECT GETANSINULL('pubs')
GO

下面是结果集：

------
1

(1 row(s) affected)

请参见

系统函数


GETDATE

按 datetime 值的 Microsoft® SQL Server™ 标准内部格式返回当前系统日期和时间。

语法

GETDATE ( )

返回类型

datetime

注释

日期函数可用在 SELECT 语句的选择列表或用在查询的 WHERE 子句中。

在设计报表时，GETDATE 函数可用于在每次生成报表时打印当前日期和时间。GETDATE 对于跟踪活动也很有用，诸如记录事务在某一帐户上发生的时间。

示例
A. 用 GET DATE 返回当前日期和时间

下面的示例得出当前系统日期和时间：

SELECT GETDATE()
GO

下面是结果集：

-------------------------
July 29 1998   2:50    PM

(1 row(s) affected)
B. 在 CREATE TABLE 语句中使用 GETDATE

下面的示例创建 employees 表并用 GETDATE 给出员工雇佣时间的默认值。

USE pubs
GO
CREATE TABLE employees
(
 emp_id char(11) NOT NULL,
 emp_lname varchar(40) NOT NULL,
 emp_fname varchar(20) NOT NULL,
 emp_hire_date datetime DEFAULT GETDATE(),
 emp_mgr varchar(30)
)
GO

请参见

日期和时间函数


GETUTCDATE

返回表示当前 UTC 时间（世界时间坐标或格林尼治标准时间）的 datetime 值。当前的 UTC 时间得自当前的本地时间和运行 SQL Server 的计算机操作系统中的时区设置。

语法

GETUTCDATE()

返回类型

datetime

注释

GETUTCDATE 是非确定性函数。引用该列的视图和表达式无法进行索引。

GETUTCDATE 无法在用户定义的函数内调用。


GO

用信号通知 Microsoft® SQL Server™ 实用工具一批 Transact-SQL 语句的结束。

语法

GO

注释

GO 不是 Transact-SQL 语句；而是可为 osql 和 isql 实用工具及 SQL Server 查询分析器识别的命令。

SQL Server 实用工具将 GO 解释为应将当前的 Transact-SQL 批处理语句发送给 SQL Server 的信号。当前批处理语句是自上一 GO 命令后输入的所有语句，若是第一条 GO 命令，则是从特殊会话或脚本的开始处到这条 GO 命令之间的所有语句。SQL 查询分析器和 osql 及 isql 命令提示实用工具执行 GO 命令的方式不同。有关更多信息，请参见 osql 实用工具、isql 实用工具和 SQL 查询分析器。

GO 命令和Transact-SQL 语句不可在同一行上。但在 GO 命令行中可包含注释。

用户必须遵照使用批处理的规则。例如，在批处理中的第一条语句后执行任何存储过程必须包含 EXECUTE 关键字。局部（用户定义）变量的作用域限制在一个批处理中，不可在 GO 命令后引用。

USE pubs
GO
DECLARE @MyMsg VARCHAR(50)
SELECT @MyMsg = 'Hello, World.'
GO -- @MyMsg is not valid after this GO ends the batch.

-- Yields an error because @MyMsg not declared in this batch.
PRINT @MyMsg
GO

SELECT @@VERSION;
-- Yields an error: Must be EXEC sp_who if not first statement in
-- batch.
sp_who
GO

SQL Server 应用程序可将多条 Transact-SQL 语句作为一个批处理发给 SQL Server 去执行。在此批处理中的语句编译成一个执行计划。程序员在 SQL Server 实用工具中执行特定语句，或生成 Transact-SQL 语句脚本在 SQL Server 实用工具中运行，用 GO 来标识批处理的结束。

如果基于 DB-Library、ODBC 或 OLE DB APIs 的应用程序试图执行 GO 命令时会收到语法错误。SQL Server 实用工具永远不会向服务器发送 GO 命令。

权限

GO 是一个不需权限的实用工具命令。可以由任何用户执行。

示例

下面的示例创建两个批处理。第一个批处理只包含一条 USE pubs 语句，用于设置数据库上下文。剩下的语句使用了一个局部变量，因此所有的局部变量声明必须在一个批处理中。这一点可通过在最后一条引用此变量的语句之后才使用 GO 命令来做到。

USE pubs
GO
DECLARE @NmbrAuthors int
SELECT @NmbrAuthors = COUNT(*)
FROM authors
PRINT 'The number of authors as of ' +
      CAST(GETDATE() AS char(20)) + ' is ' +
      CAST(@NmbrAuthors AS char (10))
GO

请参见

批处理

成批处理

编写可读性强的代码


GOTO

将执行流变更到标签处。跳过 GOTO 之后的 Transact-SQL 语句，在标签处继续处理。GOTO 语句和标签可在过程、批处理或语句块中的任何位置使用。GOTO 语句可嵌套使用。

语法

定义标签：

label :

改变执行：

GOTO label

参数

label

若有 GOTO 语句指向此标签，则其为处理的起点。标签必须符合标识符规则。不论是否使用 GOTO 语句，标签均可作为注释方法使用。

注释

GOTO 可用在条件控制流语句、语句块或过程中,但不可跳转到批处理之外的标签处。GOTO 分支可跳转到定义在 GOTO 之前或之后的标签处。

权限

GOTO 语句的权限默认情况下授予任何有效用户。

示例

下面给出用 GOTO 循环代替 WHILE 循环的示例。

说明 这里未定义 tnames_cursor 游标。本例只用于演示。

USE pubs
GO
DECLARE @tablename sysname
SET @tablename = N'authors'
table_loop:
   IF (@@FETCH_STATUS <> -2)
   BEGIN
      SELECT @tablename = RTRIM(UPPER(@tablename))
      EXEC ("SELECT """ + @tablename + """ = COUNT(*) FROM "
            + @tablename )
      PRINT " "
   END
   FETCH NEXT FROM tnames_cursor INTO @tablename
IF (@@FETCH_STATUS <> -1) GOTO table_loop
GO

请参见

BEGIN...END

BREAK

CONTINUE

控制流语言

IF...ELSE

WAITFOR

使用标识符

WHILE


GRANT

在安全系统中创建项目，使当前数据库中的用户得以处理当前数据库中的数据或执行特定的 Transact-SQL 语句。

语法

语句权限：

GRANT { ALL | statement [ ,...n ] }
TO security_account [ ,...n ]

对象权限：

GRANT
{ ALL [ PRIVILEGES ] | permission [ ,...n ] }
{
        [ ( column [ ,...n ] ) ] ON { table | view }
| ON { table | view } [ ( column [ ,...n ] ) ]
        | ON { stored_procedure | extended_procedure }
| ON { user_defined_function }
}
TO security_account [ ,...n ]
[ WITH GRANT OPTION ]
[ AS { group | role } ]

参数

ALL

表示授予所有可用的权限。对于语句权限，只有 sysadmin 角色成员可以使用 ALL。对于对象权限，sysadmin 和 db_owner 角色成员和数据库对象所有者都可以使用 ALL。

statement

是被授予权限的语句。语句列表可以包括：

  • CREATE DATABASE

  • CREATE DEFAULT

  • CREATE FUNCTION

  • CREATE PROCEDURE

  • CREATE RULE

  • CREATE TABLE

  • CREATE VIEW

  • BACKUP DATABASE

  • BACKUP LOG

n

一个占位符，表示此项可在逗号分隔的列表中重复。

TO

指定安全帐户列表。

security_account

是权限将应用的安全帐户。安全帐户可以是：

  • Microsoft® SQL Server™ 用户。

  • SQL Server 角色。

  • Microsoft Windows NT® 用户。

  • Windows NT 组。

当权限被授予一个 SQL Server 用户或 Windows NT 用户帐户，指定的 security_account 是权限能影响到的唯一帐户。若权限被授予 SQL Server 角色或 Windows NT 组，权限可影响到当前数据库中该组或该角色成员的所有用户。若组或角色和它们的成员之间存在权限冲突，最严格的权限 (DENY) 优先起作用。security_account 必须在当前数据库中存在；不可将权限授予其它数据库中的用户、角色或组，除非已为该用户在当前数据库中创建或给予了访问权限。

两个特殊的安全帐户可用于 GRANT 语句。授予 public 角色的权限可应用于数据库中的所有用户。授予 guest 用户的权限可为所有在数据库中没有用户帐户的用户使用。

当授予某个 Windows NT 本地组或全局组权限时，请指定在其上定义该组的域名或计算机名，然后依次输入反斜线和组名。但是，若要授予访问 Windows NT 内置本地组的权限，请指定 BUILTIN 而不是域名或计算机名。

PRIVILEGES

是可以包含在符合 SQL-92 标准的语句中的可选关键字。

permission

是当前授予的对象权限。当在表、表值函数或视图上授予对象权限时，权限列表可以包括这些权限中的一个或多个：SELECT、INSERT、DELETE、REFENENCES 或 UPDATE。列列表可以与 SELECT 和 UPDATE 权限一起提供。如果列列表未与 SELECT 和 UPDATE 权限一起提供，那么该权限应用于表、视图或表值函数中的所有列。

在存储过程上授予的对象权限只可以包括 EXECUTE。在标量值函数上授予的对象权限可以包括 EXECUTE 和 REFERENCES。

为在 SELECT 语句中访问某个列，该列上需要有 SELECT 权限。为使用 UPDATE 语句更新某个列，该列上需要有 UPDATE 权限。

为创建引用某个表的 FOREIGN KEY 约束，该表上需要有 REFERENCES 权限。

为使用引用某个对象的 WITH SCHEMABINDING 子句创建 FUNCTION 或 VIEW，该对象上需要有 REFERENCES 权限。

column

是当前数据库中授予权限的列名。

table

是当前数据库中授予权限的表名。

view

是当前数据库中被授予权限的视图名。

stored_procedure

是当前数据库中授予权限的存储过程名。

extended_procedure

是当前数据库中授予权限的扩展存储过程名。

user_defined_function

是当前数据库中授予权限的用户定义函数名。

WITH GRANT OPTION

表示给予了 security_account 将指定的对象权限授予其它安全帐户的能力。WITH GRANT OPTION 子句仅对对象权限有效。

AS {group | role}

指当前数据库中有执行 GRANT 语句权力的安全帐户的可选名。当对象上的权限被授予一个组或角色时使用 AS，对象权限需要进一步授予不是组或角色的成员的用户。因为只有用户（而不是组或角色）可执行 GRANT 语句，组或角色的特定成员授予组或角色权力之下的对象的权限。

注释

不允许有跨数据库权限；只能将当前数据库中的对象和语句的权限授予当前数据库中的用户。如果用户需要另一个数据库中的对象的权限，请在该数据库中创建用户帐户，或者授权用户帐户访问该数据库以及当前数据库。

说明 系统存储过程是例外，因为 EXECUTE 权限已经授予 public 角色，允许任何人去执行。但是在执行系统存储过程后，将检查用户的角色成员资格。如果此用户不是运行此存储过程所需要的适当的固定服务器或数据库角色的成员，则此存储过程不会继续执行。

REVOKE 语句可用于删除已授予的权限，DENY 语句可用于防止用户通过 GRANT 语句获得权限给他们的用户帐户。

授予权限删除所授予级别（用户、组或角色）上的已拒绝权限或已废除权限。在另一级别（诸如包含此用户的组或角色）上被拒绝的同一权限优先起作用。但是，虽然在另一级别上所废除的同一权限仍然适用，但它并不阻止用户访问该对象。

如果用户激活应用程序角色，对此用户通过该应用程序角色访问的任何对象，GRANT 的作用为空。因此，尽管一个用户可能被授予了对当前数据库中的指定对象的访问权限，但是如果此用户使用对此对象无访问权限的应用程序角色，则在应用程序角色激活期间，此用户也没有此对象的访问权限。

sp_helprotect 系统存储过程报告在数据库对象或用户上的权限。

权限

GRANT 权限依赖于所授予的语句权限和权限中涉及的对象。sysadmin 角色中的成员可在任何数据库中授予任何权限。对象所有者可为他们所拥有的对象授予权限。db_owner 或 db_securityadmin 角色的成员可授予其数据库中任何语句或对象上的任何权限。

需要权限的语句是那些在数据库中增加对象，或对数据库执行管理活动的语句。每条需要权限的语句都有一个特定的角色集，自动有权限执行此语句。例如，sysadmin、db_owner 和 db_ddladmin 角色的成员默认有CREATE TABLE 权限。sysadmin 和 db_owner 角色以及表的所有者默认有对表执行 SELECT 语句的权限。

有一些 Transact-SQL 语句不能被授予权限；执行这些语句要求有固定角色中的成员资格，此角色有默示执行特殊语句的权限。例如，若要执行 SHUTDOWN 语句，用户必须添加为 serveradmin 角色中的成员。

dbcreator、processadmin、securityadmin 和 serveradmin 固定服务器角色的成员仅有权执行以下 Transact-SQL 语句。

语句 | dbcreator | processadmin | securityadmin | serveradmin | bulkadmin
ALTER DATABASE | X |  |  |  |
CREATE DATABASE | X |  |  |  |
BULK INSERT |  |  |  |  | X
DBCC |  |  |  | X (1) |
DENY |  |  | X (2) |  |
GRANT |  |  | X (2) |  |
KILL |  | X |  |  |
RECONFIGURE |  |  |  | X |
RESTORE | X |  |  |  |
REVOKE |  |  | X (2) |  |
SHUTDOWN |  |  |  | X |

(1) 有关更多信息，请参见 DBCC 语句。
(2) 仅适用于 CREATE DATABASE 语句。

说明 diskadmin 和 setupadmin 固定服务器角色的成员没有权限执行任何 Transact-SQL 语句，他们只能执行特定的系统存储过程。但是，sysadmin 固定服务器角色的成员有权限执行所有的 Transact-SQL 语句。

下面的固定数据库角色的成员有权限执行指定的 Transact-SQL 语句。

语句 | db_owner | db_datareader | db_datawriter | db_ddladmin | db_backupoperator | db_securityadmin
ALTER DATABASE | X |  |  | X |  |
ALTER FUNCTION | X |  |  | X |  |
ALTER PROCEDURE | X |  |  | X |  |
ALTER TABLE | X (1) |  |  | X |  |
ALTER TRIGGER | X |  |  | X |  |
ALTER VIEW | X (1) |  |  | X |  |
BACKUP | X |  |  |  | X |
CHECKPOINT | X |  |  |  | X |
CREATE DEFAULT | X |  |  | X |  |
CREATE FUNCTION | X |  |  | X |  |
CREATE INDEX | X (1) |  |  | X |  |
CREATE PROCEDURE | X |  |  | X |  |
CREATE RULE | X |  |  | X |  |
CREATE TABLE | X |  |  | X |  |
CREATE TRIGGER | X (1) |  |  | X |  |
CREATE VIEW | X |  |  | X |  |
DBCC | X |  |  |  | X (2) |
DELETE | X (1) |  | X |  |  |
DENY | X |  |  |  |  | X
DENY on object | X |  |  |  |  |
DROP | X (1) |  |  | X |  |
EXECUTE | X (1) |  |  |  |  |
GRANT | X |  |  |  |  | X
GRANT on object | X (1) |  |  |  |  |
INSERT | X (1) |  | X |  |  |
READTEXT | X (1) | X |  |  |  |
REFERENCES | X (1) |  |  | X |  |
RESTORE | X |  |  |  |  |
REVOKE | X |  |  |  |  | X
REVOKE on object | X (1) |  |  |  |  |
SELECT | X (1) | X |  |  |  |
SETUSER | X |  |  |  |  |
TRUNCATE TABLE | X (1) |  |  | X |  |
UPDATE | X (1) |  | X |  |  |
UPDATE STATISTICS | X (1) |  |  |  |  |
UPDATETEXT | X (1) |  | X |  |  |
WRITETEXT | X (1) |  | X |  |  |

(1) 权限也适用于对象所有者。
(2) 有关更多信息，请参见 DBCC 语句。

说明 db_accessadmin 固定数据库角色的成员没有执行任何 Transact-SQL 语句的权限，只可执行特定的系统存储过程。

不需要权限即可执行的 Transact-SQL 语句有（已自动授予 public）:

BEGIN TRANSACTION | COMMIT TRANSACTION
PRINT | RAISERROR
ROLLBACK TRANSACTION | SAVE TRANSACTION
SET |

有关执行系统存储过程所需权限的更多信息，请参见相应的系统存储过程。

示例
A. 授予语句权限

下面的示例给用户 Mary 和 John 以及 Windows NT 组 Corporate\BobJ 授予多个语句权限。

GRANT CREATE DATABASE, CREATE TABLE
TO Mary, John, [Corporate\BobJ]
B. 在权限层次中授予对象权限

下例显示权限的优先顺序。首先，给 public 角色授予 SELECT 权限。然后，将特定的权限授予用户 Mary、John 和 Tom。于是这些用户就有了对 authors 表的所有权限。

USE pubs
GO

GRANT SELECT
ON authors
TO public
GO

GRANT INSERT, UPDATE, DELETE
ON authors
TO Mary, John, Tom
GO
C. 给 SQL Server 角色授予权限

下面的示例将 CREATE TABLE 权限授予 Accounting 角色的所有成员。

GRANT CREATE TABLE TO Accounting
D. 用 AS 选项授予权限

用户 Jean 拥有表 Plan_Data。Jean 将表 Plan_Data 的 SELECT 权限授予 Accounting 角色（指定 WITH GRANT OPTION 子句）。用户 Jill 是 Accounting 的成员，他要将表 Plan_Data 上的 SELECT 权限授予用户 Jack，Jack 不是 Accounting 的成员。

因为对表 Plan_Data 用 GRANT 语句授予其他用户 SELECT 权限的权限是授予 Accounting 角色而不是显式地授予 Jill，不能因为已授予 Accounting 角色中成员该权限，而使 Jill 能够授予表的权限。Jill 必须用 AS 子句来获得 Accounting 角色的授予权限。

/* User Jean */
GRANT SELECT ON Plan_Data TO Accounting WITH GRANT OPTION

/* User Jill */
GRANT SELECT ON Plan_Data TO Jack AS Accounting

请参见

授予权限

DENY

REVOKE

sp_addgroup

sp_addlogin

sp_adduser

sp_changegroup

sp_changedbowner

sp_dropgroup

sp_dropuser

sp_helpgroup

sp_helprotect

sp_helpuser


GROUP BY

将表分为组。组可包含列名、结果或计算列。有关更多信息，请参见 SELECT。


GROUPING

是一个聚合函数,它产生一个附加的列，当用 CUBE 或 ROLLUP 运算符添加行时，附加的列输出值为1，当所添加的行不是由 CUBE 或 ROLLUP 产生时，附加列值为0。

仅在与包含 CUBE 或 ROLLUP 运算符的 GROUP BY 子句相联系的选择列表中才允许分组。

语法

GROUPING ( column_name )

参数

column_name

是 GROUP BY 子句中用于检查 CUBE 或 ROLLUP 空值的列。

返回类型

int

注释

分组用于区分由 CUBE 和 ROLLUP 返回的空值和标准的空值。作为CUBE 或 ROLLUP 操作结果返回的 NULL 是 NULL 的特殊应用。它在结果集内作为列的占位符，意思是"全体"。

示例

下面的示例将 royalty 的数值分组，并聚合 advance 的数值。GROUPING 函数应用于 royalty 列。

USE pubs
SELECT royalty, SUM(advance) 'total advance',
   GROUPING(royalty) 'grp'
   FROM titles
   GROUP BY royalty WITH ROLLUP

结果集在 royalty 下显示两个空值。第一个 NULL 代表从表中这一列得到的空值组。第二个 NULL 在 ROLLUP 操作所添加的汇总行中。汇总行显示的是所有 royalty 组的 advance 合计数值，并且在 grp 列中用 1 标识。

下面是结果集：

royalty        total advance              grp
---------      ---------------------    ---
NULL           NULL                     0
10             57000.0000               0
12             2275.0000                0
14             4000.0000                0
16             7000.0000                0
24             25125.0000               0
NULL           95400.0000               1

请参见

聚合函数

SELECT


HAS_DBACCESS

返回信息，说明用户是否可以访问指定的数据库。

语法

HAS_DBACCESS ( 'database_name' )

参数

database_name

数据库的名称，用户想获取有关该数据库的访问信息。database_name 的数据类型为 sysname。

返回类型

int

注释

如果用户可以访问该数据库，那么 HAS_DBACCESS 返回 1。如果用户不能访问该数据库，那么它返回 0。如果该数据库名无效，则返回 NULL。


HAVING

指定组或聚合的搜索条件。HAVING 只能与 SELECT 语句一起使用。通常在 GROUP BY 子句中使用它。如果不使用 GROUP BY 子句，HAVING 的行为与 WHERE 子句一样。有关更多信息，请参见 SELECT。


HAVING 子句

指定组或聚合的搜索条件。HAVING 通常与 GROUP BY 子句一起使用。如果不使用 GROUP BY 子句，HAVING 的行为与 WHERE 子句一样。

语法

[HAVING <search_condition>]

参数

<search_condition>

指定组或聚合应满足的搜索条件。当 HAVING 与 GROUP BY ALL 一起使用时，HAVING 子句替代 ALL。有关更多信息，请参见搜索条件。

在 HAVING 子句中不能使用 text、image 和 ntext 数据类型。

说明 在 SELECT 语句中使用 HAVING 子句不影响 CUBE 运算符分组结果集和返回汇总聚合行的方式。


HOST_ID

返回工作站标识号。

语法

HOST_ID ( )

返回类型

char(8)

注释

当该参数对系统函数可选时，则系统采用当前数据库、主机、服务器用户或数据库用户。内置函数后面必须跟圆括号。

系统函数可以在选择列表、WHERE 子句和任何允许使用表达式的地方使用。

示例

下面的示例创建一个表，该表在 DEFAULT 定义中使用 HOST_ID() 来记录那些向记录订单的表中插入行的计算机终端 ID。

CREATE TABLE Orders
   (OrderID     INT       PRIMARY KEY,
    CustomerID  NCHAR(5)  REFERENCES Customers(CustomerID),
    TerminalID  CHAR(8)   NOT NULL DEFAULT HOST_ID(),
    OrderDate   DATETIME  NOT NULL,
    ShipDate    DATETIME  NULL,
    ShipperID   INT       NULL REFERENCES Shippers(ShipperID))
GO

请参见

表达式

系统函数


HOST_NAME

返回工作站名称。

语法

HOST_NAME ( )

返回类型

nchar

注释

当该参数对系统函数可选时，则系统采用当前数据库、主机、服务器用户或数据库用户。内置函数后面必须跟圆括号。

系统函数可以在选择列表、WHERE 子句和任何允许使用表达式的地方使用。

示例

下面的示例创建一个表，该表在 DEFAULT 定义中使用 HOST_NAME() 来记录那些向记录订单的表中插入行的计算机工作站名称。

CREATE TABLE Orders
   (OrderID     INT        PRIMARY KEY,
    CustomerID  NCHAR(5)   REFERENCES Customers(CustomerID),
    Workstation NCHAR(30)  NOT NULL DEFAULT HOST_NAME(),
    OrderDate   DATETIME   NOT NULL,
    ShipDate    DATETIME   NULL,
    ShipperID   INT        NULL REFERENCES Shippers(ShipperID))

请参见

表达式

系统函数


IDENT_CURRENT

返回为任何会话和任何作用域中的指定表最后生成的标识值。

语法

IDENT_CURRENT('table_name')

参数

table_name

是将要返回其标识值的表的名称。table_name 的数据类型为 varchar，没有默认值。

返回类型

sql_variant

注释

IDENT_CURRENT 类似于 Microsoft® SQL Server™ 2000 标识函数 SCOPE_IDENTITY 和 @@IDENTITY。这三个函数都返回最后生成的标识值。但是，它们在定义"最后"的作用域和会话上不同。

  • IDENT_CURRENT 返回为任何会话和任何作用域中的特定表最后生成的标识值。

  • @@IDENTITY 返回为当前会话的所有作用域中的任何表最后生成的标识值。

  • SCOPE_IDENTITY 返回为当前会话和当前作用域中的任何表最后生成的标识值。
示例

下面的示例说明由 IDENT_CURRENT、@@IDENTITY 和 SCOPE_IDENTITY 返回的不同的标识值。

USE pubs
DROP TABLE t6
DROP TABLE t7
GO
CREATE TABLE t6(id int IDENTITY)
CREATE TABLE t7(id int IDENTITY(100,1))
GO
CREATE TRIGGER t6ins ON t6 FOR INSERT
AS
BEGIN
   INSERT t7 DEFAULT VALUES
END
GO
--end of trigger definition

SELECT   * FROM t6
--id is empty.

SELECT   * FROM t7
--id is empty.

--Do the following in Session 1
INSERT t6 DEFAULT VALUES
SELECT @@IDENTITY
/*Returns the value 100, which was inserted by the trigger.*/

SELECT SCOPE_IDENTITY()
/* Returns the value 1, which was inserted by the
INSERT stmt 2 statements before this query.*/

SELECT IDENT_CURRENT('t7')
/* Returns value inserted into t7, i.e. in the trigger.*/

SELECT IDENT_CURRENT('t6')
/* Returns value inserted into t6, which was the INSERT statement 4 stmts before this query.*/

-- Do the following in Session 2
SELECT @@IDENTITY
/* Returns NULL since there has been no INSERT action
so far in this session.*/

SELECT SCOPE_IDENTITY()
/* Returns NULL since there has been no INSERT action
so far in this scope in this session.*/

SELECT IDENT_CURRENT('t7')
/* Returns the last value inserted into t7.*/

请参见

@@IDENTITY

SCOPE_IDENTITY


IDENT_INCR

返回增量值（返回形式为 numeric(@@MAXPRECISION,0)），该值是在带有标识列的表或视图中创建标识列时指定的。

语法

IDENT_INCR ( 'table_or_view' )

参数

table_or_view

一个表达式，用来指定表或视图以检查有效的标识增量值。table_or_view 可以是带有引号的字符串常量，也可以是变量、函数或列名。table_or_view 的数据类型为 char、nchar、varchar 或 nvarchar。

返回类型

数字

示例

下面的示例为 pubs 数据库中的 jobs 表返回 1，这是因为 jobs 表中包含带有增量值 1 的标识列。

USE pubs
SELECT TABLE_NAME, IDENT_INCR(TABLE_NAME) AS IDENT_INCR
FROM INFORMATION_SCHEMA.TABLES
WHERE IDENT_INCR(TABLE_NAME) IS NOT NULL

下面是结果集：

TABLE_NAME                                                  IDENT_INCR
------------------------------------------------------------ -----------
jobs                                                         1

(1 row(s) affected)

请参见

表达式

系统函数


IDENT_SEED

返回种子值（返回形式为 numeric(@@MAXPRECISION,0)），该值是在带有标识列的表或视图中创建标识列时指定的。

语法

IDENT_SEED ( 'table_or_view' )

参数

table_or_view

一个表达式，指定表或视图以检查有效的标识种子值。table_or_view 可以是带有引号的字符串常量，也可以是变量、函数或列名。table_or_view 的数据类型为 char、nchar、varchar 或 nvarchar。

返回类型

数字

示例

下面的示例为 pubs 数据库中的 jobs 表返回 1，这是因为 jobs 表中包含带有种子值 1 的标识列。

USE pubs
SELECT TABLE_NAME, IDENT_SEED(TABLE_NAME) AS IDENT_SEED
FROM INFORMATION_SCHEMA.TABLES
WHERE IDENT_SEED(TABLE_NAME) IS NOT NULL

下面是结果集：

TABLE_NAME                                                   IDENT_SEED
------------------------------------------------------------ -----------
jobs                                                         1

(1 row(s) affected)

请参见

表达式

系统函数


IDENTITY（函数）

只用在带有 INTO table 子句的 SELECT 语句中，以将标识列插入到新表中。

尽管类似，但是 IDENTITY 函数不是与 CREATE TABLE 和 ALTER TABLE 一起使用的 IDENTITY 属性。

语法

IDENTITY ( data_type [ , seed , increment ] ) AS column_name

参数

data_type

标识列的数据类型。标识列的有效数据类型可以是任何整数数据类型分类的数据类型（bit 数据类型除外），也可以是 decimal 数据类型。

seed

要指派给表中第一行的值。给每一个后续行指派下一个标识值，该值等于上一个 IDENTITY 值加上 increment 值。如果既没有指定 seed，也没有指定 increment，那么它们都默认为 1。

increment

用来添加到 seed 值以获得表中连续行的增量。

column_name

将插入到新表中的列的名称。

返回类型

返回与 data_type 相同的类型。

注释

因为该函数在表中创建一个列，所以必须用下列方式中的一种在选择列表中指定该列的名称：

--(1)
SELECT IDENTITY(int, 1,1) AS ID_Num
INTO NewTable
FROM OldTable

--(2)
SELECT ID_Num = IDENTITY(int, 1, 1)
INTO NewTable
FROM OldTable
示例

下面的示例将来自 pubs 数据库中 employee 表的所有行都插入到名为 employees 的新表。使用 IDENTITY 函数在 employees 表中从 100 而不是 1 开始编标识号。

USE pubs
IF EXISTS(SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES
      WHERE TABLE_NAME = 'employees')
   DROP TABLE employees
GO
EXEC sp_dboption 'pubs', 'select into/bulkcopy', 'true'

SELECT emp_id AS emp_num,
   fname AS first,
   minit AS middle,
   lname AS last,
   IDENTITY(smallint, 100, 1) AS job_num,
   job_lvl AS job_level,
   pub_id,
   hire_date
INTO employees
FROM employee
GO
USE pubs
EXEC sp_dboption 'pubs', 'select into/bulkcopy', 'false'

请参见

CREATE TABLE

@@IDENTITY

IDENTITY（属性）

SELECT @local_variable

使用系统函数


IDENTITY（属性）

在表中创建一个标识列。该属性与 CREATE TABLE 及 ALTER TABLE Transact-SQL 语句一起使用。

说明 IDENTITY 属性与 SQL-DMO Identity 属性不同，后者表现列的行标识属性。

语法

IDENTITY [ ( seed , increment ) ]

参数

seed

装载到表中的第一个行所使用的值。

increment

增量值，该值被添加到前一个已装载的行的标识值上。

必须同时指定种子和增量，或者二者都不指定。如果二者都未指定，则取默认值 (1,1)。

注释

如果在经常进行删除操作的表中存在着标识列，那么在标识值之间可能会产生差距。如果这构成了问题，那么请不要使用 IDENTITY 属性。但是，为了确保未产生差距，或者为了弥补现有的差距，在用 SET IDENTITY_INSERT ON 显式地输入标识值之前，请先对现有的标识值进行计算。

如果重新使用已删除的标识值，那么请使用示例 B 中的示例代码进行检查，以获得下一个可用的标识值。请用您的表名、标识列数据类型以及（该数据类型的）最大可允许值的数值 –1 替换 tablename、column_type 和 max(column_type) – 1。

使用 DBCC CHECKIDENT 检查当前的标识值，并将其与标识列中的最大值进行比较。

当将 IDENTITY 属性与 CREATE TABLE 一起使用时，Microsoft® SQL Server™ 使用 CREATE TABLE 的 NOT FOR REPLICATION 选项替代标识列的自动增加。通常，SQL Server 给插入表中的每个新行指派一个值，该值比前面的最高值要大出某些增量。但是，如果新行是由另一个数据源复制过来的，那么标识值必须保持与其在数据源中完全相同。

示例
A. 将 IDENTITY 属性与 CREATE TABLE 一起使用

下面的示例创建一个新表，该表将 IDENTITY 属性用于获得自动增加的标识号。

USE pubs
IF EXISTS(SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES
      WHERE TABLE_NAME = 'new_employees')
   DROP TABLE new_employees
GO
CREATE TABLE new_employees
(
 id_num int IDENTITY(1,1),
 fname varchar (20),
 minit char(1),
 lname varchar(30)
)

INSERT new_employees
   (fname, minit, lname)
VALUES
   ('Karin', 'F', 'Josephs')

INSERT new_employees
   (fname, minit, lname)
VALUES
   ('Pirkko', 'O', 'Koskitalo')
B. 使用一般语法查找标识值中的差距

下面的示例显示一般的语法，当删除数据时，可以使用该语法查找标识值中的差距。

说明 下面的 Transact-SQL 脚本中的第一部分只用作示范说明。可以运行以下面的注释开始的 Transact-SQL 脚本：- - Create the img table.

-- Here is the generic syntax for finding identity value gaps in data.
-- This is the beginning of the illustrative example.
SET IDENTITY_INSERT tablename ON

DECLARE @minidentval column_type
DECLARE @nextidentval column_type
SELECT @minidentval = MIN(IDENTITYCOL) FROM tablename
IF @minidentval = IDENT_SEED('tablename')
   SELECT @nextidentval = MIN(IDENTITYCOL) + IDENT_INCR('tablename')
   FROM tablename t1
   WHERE IDENTITYCOL BETWEEN IDENT_SEED('tablename') AND
      MAX(column_type) AND
      NOT EXISTS (SELECT * FROM tablename t2
         WHERE t2.IDENTITYCOL = t1.IDENTITYCOL +
            IDENT_INCR('tablename'))
ELSE
   SELECT @nextidentval = IDENT_SEED('tablename')
SET IDENTITY_INSERT tablename OFF
-- Here is an example to find gaps in the actual data.
-- The table is called img and has two columns: the first column
-- called id_num, which is an increasing identification number, and the
-- second column called company_name.
-- This is the end of the illustration example.

-- Create the img table.
-- If the img table already exists, drop it.
-- Create the img table.
IF EXISTS(SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES
      WHERE TABLE_NAME = 'img')
   DROP TABLE img
GO
CREATE TABLE img (id_num int IDENTITY(1,1), company_name sysname)
INSERT img(company_name) VALUES ('New Moon Books')
INSERT img(company_name) VALUES ('Lucerne Publishing')
-- SET IDENTITY_INSERT ON and use in img table.
SET IDENTITY_INSERT img ON

DECLARE @minidentval smallint
DECLARE @nextidentval smallint
SELECT @minidentval = MIN(IDENTITYCOL) FROM img
 IF @minidentval = IDENT_SEED('img')
    SELECT @nextidentval = MIN(IDENTITYCOL) + IDENT_INCR('img')
    FROM img t1
    WHERE IDENTITYCOL BETWEEN IDENT_SEED('img') AND 32766 AND
      NOT    EXISTS (SELECT * FROM img t2
          WHERE t2.IDENTITYCOL = t1.IDENTITYCOL + IDENT_INCR('img'))
 ELSE
    SELECT @nextidentval = IDENT_SEED('img')
SET IDENTITY_INSERT img OFF

请参见

ALTER TABLE

CREATE TABLE

DBCC CHECKIDENT

IDENT_INCR

@@IDENTITY

IDENTITY（函数）

IDENT_SEED

SELECT

SET IDENTITY_INSERT


IF...ELSE

在执行 Transact-SQL 语句时强加条件。如果条件满足（布尔表达式返回 TRUE 时），则在 IF 关键字及其条件之后执行 Transact-SQL 语句。可选的 ELSE 关键字引入备用的 Transact-SQL 语句，当不满足 IF 条件时（布尔表达式返回 FALSE），就执行这个语句。

语法

IF Boolean_expression
{ sql_statement | statement_block }
[ ELSE
    { sql_statement | statement_block } ]

参数

Boolean_expression

是返回 TRUE 或 FALSE 的表达式。如果布尔表达式中含有 SELECT 语句，必须用圆括号将 SELECT 语句括起来。

{sql_statement | statement_block}

Transact-SQL 语句或用语句块定义的语句分组。除非使用语句块，否则 IF 或 ELSE 条件只能影响一个 Transact-SQL 语句的性能。若要定义语句块，请使用控制流关键字 BEGIN 和 END。如果在 IF...ELSE 块的 IF 区和 ELSE 区都使用了 CREATE TABLE 语句或 SELECT INTO 语句，那么 CREATE TABLE 语句或 SELECT INTO 语句必须指向是相同的表名。

注释

IF...ELSE 结构可以用在批处理中，存储过程中（经常使用这种结构测试是否存在着某个参数），以及特殊查询中。

可以在其它 IF 之后或在 ELSE 下面，嵌套另一个 IF 测试。对于嵌套层数没有限制。

示例
A. 使用一个 IF...ELSE 块

下面的示例显示带有语句块的 IF 条件。如果书的平均价格不低于 $15，那么就显示文本：Average title price is more than $15.

USE pubs

IF (SELECT AVG(price) FROM titles WHERE type = 'mod_cook') < $15
BEGIN
   PRINT 'The following titles are excellent mod_cook books:'
   PRINT ' '
   SELECT SUBSTRING(title, 1, 35) AS Title
   FROM titles
   WHERE type = 'mod_cook'
END
ELSE
   PRINT 'Average title price is more than $15.'

下面是结果集：

The following titles are excellent mod_cook books:

Title
-----------------------------------
Silicon Valley Gastronomic Treats
The Gourmet Microwave

(2 row(s) affected)
B. 使用多个 IF...ELSE 块

下面的示例使用了两个 IF 块。如果书的平均价格不低于 $15，那么就显示文本：Average title price is more than $15。如果现代烹调书的平均价格高于 $15，则显示现代烹调书价格昂贵的语句。

USE pubs

IF (SELECT AVG(price) FROM titles WHERE type = 'mod_cook') < $15
BEGIN
   PRINT 'The following titles are excellent mod_cook books:'
   PRINT ' '
   SELECT SUBSTRING(title, 1, 35) AS Title
   FROM titles
   WHERE type = 'mod_cook'
END
ELSE
   IF (SELECT AVG(price) FROM titles WHERE type = 'mod_cook') > $15
BEGIN
   PRINT 'The following titles are expensive mod_cook books:'
   PRINT ' '
   SELECT SUBSTRING(title, 1, 35) AS Title
   FROM titles
   WHERE type = 'mod_cook'
END

请参见

ALTER TRIGGER

BEGIN...END

CREATE TABLE

CREATE TRIGGER

ELSE (IF...ELSE)

END (BEGIN...END)

SELECT

WHILE


image

有关 image 数据类型的更多信息，请参见 ntext、text 和 image。

请参见

数据类型转换

数据类型


IN

确定给定的值是否与子查询或列表中的值相匹配。

语法

test_expression [ NOT ] IN
(
        subquery
| expression [ ,...n ]
    )

参数

test_expression

是任何有效的 Microsoft® SQL Server™ 表达式。

subquery

是包含某列结果集的子查询。该列必须与 test_expression 有相同的数据类型。

expression [,...n]

一个表达式列表，用来测试是否匹配。所有的表达式必须和 test_expression 具有相同的类型。

结果类型

布尔型

结果值

如果 test_expression 与 subquery 返回的任何值相等，或与逗号分隔的列表中的任何 expression 相等，那么结果值就为 TRUE。否则，结果值为 FALSE。

使用 NOT IN 对返回值取反。

示例
A. 对比 OR 和 IN

下面的示例选择名称和州的列表，列表中列出所有居住在加利福尼亚、印地安纳或马里兰州的作者。

USE pubs

SELECT au_lname, state
FROM authors
WHERE state = 'CA' OR state = 'IN' OR state = 'MD'

但是，也可以使用 IN 获得相同的结果：

USE pubs

SELECT au_lname, state
FROM authors
WHERE state IN ('CA', 'IN', 'MD')

以下是上面任一查询的结果集：

au_lname   state
--------   -----
White      CA
Green      CA
Carson      CA
O'Leary      CA
Straight      CA
Bennet      CA
Dull      CA
Gringlesby      CA
Locksley      CA
Yokomoto      CA
DeFrance      IN
Stringer      CA
MacFeather      CA
Karsen      CA
Panteley            MD
Hunter            CA
McBadden            CA

(17 row(s) affected)
B. 将 IN 与子查询一起使用

下面的示例在 titleauthor 表中查找从任一种书得到的版税少于 50% 的所有作者的 au_ids，然后从 authors 表中选择 au_ids 与 titleauthor 查询结果匹配的所有作者的姓名。结果显示有一些作者属于得到的版税少于 50% 的一类。

USE pubs
SELECT au_lname, au_fname
FROM authors
WHERE au_id IN
   (SELECT au_id
   FROM titleauthor
   WHERE royaltyper < 50)

下面是结果集：

au_lname                                 au_fname
---------------------------------------- --------------------
Green                                    Marjorie
O'Leary                                  Michael
Gringlesby                               Burt
Yokomoto                                 Akiko
MacFeather                               Stearns
Ringer                                   Anne

(6 row(s) affected)
C. 将 NOT IN 与子查询一起使用

NOT IN 将找到那些与值列表中的项目不匹配的作者。下面的示例查找至少有一种书取得不少于 50% 的版税的作者姓名：

USE pubs
SELECT au_lname, au_fname
FROM authors
WHERE au_id NOT IN
   (SELECT au_id
   FROM titleauthor
   WHERE royaltyper < 50)

下面是结果集：

au_lname                                 au_fname
---------------------------------------- --------------------
White                                    Johnson
Carson                                   Cheryl
Straight                                 Dean
Smith                                    Meander
Bennet                                   Abraham
Dull                                     Ann
Locksley                                 Charlene
Greene                                   Morningstar
Blotchet-Halls                           Reginald
del Castillo                             Innes
DeFrance                                 Michel
Stringer                                 Dirk
Karsen                                   Livia
Panteley                                 Sylvia
Hunter                                   Sheryl
McBadden                                 Heather
Ringer                                   Albert

(17 row(s) affected)

请参见

CASE

表达式

函数

运算符

SELECT

WHERE


INDEX_COL

返回索引列名称。

语法

INDEX_COL ( 'table' , index_id , key_id )

参数

'table'

表的名称。

index_id

索引的 ID。

key_id

键的 ID。

返回类型

nvarchar (256)

示例

下面的示例将产生 authors 表中索引的列表。

USE pubs

-- Declare variables to use in this example.
DECLARE @id int, @type char(2),@msg varchar(80),
   @indid smallint, @indname sysname, @status int,
   @indkey int, @name varchar(30)
-- Obtain the identification number for the authors table to look up
-- its indexes in the sysindexes table.
SET NOCOUNT ON
SELECT @id = id, @type = type
FROM sysobjects
WHERE name = 'authors' and type = 'U'

-- Start printing the output information.
print 'Index information for the authors table'
print '---------------------------------------'

-- Loop through all indexes in the authors table.
-- Declare a cursor.
DECLARE i cursor
FOR
SELECT indid, name, status
FROM sysindexes
WHERE id = @id

-- Open the cursor and fetch next set of index information.
OPEN i

FETCH NEXT FROM i INTO @indid, @indname, @status

   IF @@FETCH_STATUS = 0
   PRINT ' '

   -- While there are still rows to retrieve from the cursor,
   -- find out index information and print it.
   WHILE @@FETCH_STATUS = 0
     BEGIN

     SET @msg = NULL
     -- Print the index name and the index number.
          SET @msg = ' Index number '  + CONVERT(varchar, @indid)+
      ' is '+@indname

     SET @indkey = 1
     -- @indkey (equivalent to key_id in the syntax diagram of
     -- INDEX_COL) can be from 1 to 16.
       WHILE @indkey <= 16 and INDEX_COL(@name, @indid, @indkey)
      IS NOT NULL

      BEGIN
      -- Print different information if @indkey <> 1.
        IF @indkey = 1
         SET @msg = @msg + ' on '
            + index_col(@name, @indid, @indkey)
        ELSE
         SET @msg = @msg + ', '
            + index_col(@name, @indid, @indkey)

        SET @indkey = @indkey + 1
      END

      PRINT @msg
      SET @msg = NULL
      FETCH NEXT FROM i INTO @indid, @indname, @status

   END
   CLOSE i
   DEALLOCATE i

SET NOCOUNT OFF

下面是结果集：

Index information for the authors table
---------------------------------------

 Index number 1 is UPKCL_auidind
 Index number 2 is aunmind

请参见

表达式

元数据函数

WHERE


INDEXKEY_PROPERTY

返回有关索引键的信息。

语法

INDEXKEY_PROPERTY ( table_ID , index_ID , key_ID , property )

参数

table_ID

表标识号。table_ID 的数据类型为 int。

index_ID

索引标识号。index_ID 的数据类型为 int。

key_ID

索引列的位置。key_ID 的数据类型为 int。

property

属性的名称，将要为该属性返回信息。property 是字符串，可以是下面值中的一个。

Value | 描述
ColumnId | 索引的 key_ID 位置上的列 ID。
IsDescending | 存储索引列的顺序。 1 = 降序 0 = 升序

返回类型

int

示例
SELECT indexkey_property(OBJECT_ID('authors'),2,2,'ColumnId')

SELECT indexkey_property(OBJECT_ID('authors'),2,2,'IsDescending')


INDEXPROPERTY

在给定表标识号、索引名称及属性名称的前提下，返回指定的索引属性值。

语法

INDEXPROPERTY ( table_ID , index , property )

参数

table_ID

是包含要为其提供索引属性信息的表或索引视图标识号的表达式。table_ID 的数据类型为 int。

index

一个包含索引的名称的表达式，将为该索引返回属性信息。index 的数据类型为 nvarchar(128)。

property

一个表达式，它包含将要返回的数据库属性的名称。property 的数据类型为 varchar(128)，可以是下列值中的一个。

属性 | 描述
IndexDepth | 索引的深度。 返回索引所具有的级别数。
IndexFillFactor | 索引指定自己的填充因子。 返回创建索引或最后重建索引时使用的填充因子。
IndexID | 指定表或索引视图上的索引的索引 ID。
IsAutoStatistics | 索引是由 sp_dboption 的 auto create statistics 选项生成的。 1 = True 0 = False NULL = 无效的输入
IsClustered | 索引是聚集的。 1 = True 0 = False NULL = 无效的输入
IsFulltextKey | 索引是表的全文键。 1 = True 0 = False NULL = 无效的输入
IsHypothetical | 索引是假设的，不能直接用作数据访问路径。假设的索引保留列级统计。 1 = True 0 = False NULL = 无效的输入
IsPadIndex | 索引在每个内部节点上指定将要保持空闲的空间。 1 = True 0 = False NULL = 无效的输入
IsPageLockDisallowed | 1 = 通过 sp_indexoption 禁用页锁定。 0 = 允许页锁定。 NULL = 无效的输入
IsRowLockDisallowed | 1 = 通过 sp_indexoption 禁用行锁定。 0 = 允许行锁定。 NULL = 无效的输入。
IsStatistics | 索引是由 CREATE STATISTICS 语句或由 sp_dboption 的 auto create statistics 选项创建的。对于列级统计，统计索引将用作占位符。 1 = True 0 = False NULL = 无效的输入
IsUnique | 索引是唯一的。 1 = True 0 = False NULL = 无效的输入

返回类型

int

示例

下面的示例为 authors 表的 UPKCL_auidind 索引返回 IsPadIndex 属性的设置。

USE pubs
SELECT INDEXPROPERTY(OBJECT_ID('authors'), 'UPKCL_auidind',
   'IsPadIndex')

请参见

控制流语言

CREATE INDEX

DELETE

INSERT

元数据函数

运算符（逻辑运算符）

UPDATE

WHERE


INSERT

将新行添加到表或视图。

语法

INSERT [ INTO]
{ table_name WITH ( < table_hint_limited > [ ...n ] )
| view_name
 | rowset_function_limited
}

    {    [ ( column_list ) ]
{ VALUES
( { DEFAULT | NULL | expression } [ ,...n] )
            | derived_table
| execute_statement
 }
    }
    | DEFAULT VALUES

< table_hint_limited > ::=
{ FASTFIRSTROW
        | HOLDLOCK
| PAGLOCK
| READCOMMITTED
| REPEATABLEREAD
| ROWLOCK
| SERIALIZABLE
| TABLOCK
| TABLOCKX
| UPDLOCK
    }

参数

[INTO]

一个可选的关键字，可以将它用在 INSERT 和目标表之间。

table_name

将要接收数据的表或 table 变量的名称。

WITH (<table_hint_limited> [...n])

指定目标表所允许的一个或多个表提示。需要有 WITH 关键字和圆括号。不允许有 READPAST、NOLOCK 和 READUNCOMMITTED。有关表提示的更多信息，请参见 FROM。

view_name

视图的名称及可选的别名。通过 view_name 来引用的视图必须是可更新的。由 INSERT 语句所做的修改不能影响视图的 FROM 子句中引用的多个基表。例如，在多表视图中的 INSERT 必须使用 column_list，column_list 是只引用来自一个基表的列。有关可更新视图的更多信息，请参见 CREATE VIEW。

rowset_function_limited

是 OPENQUERY 或 OPENROWSET 函数。有关更多信息，请参见 OPENQUERY 以及 OPENROWSET。

(column_list)

要在其中插入数据的一列或多列的列表。必须用圆括号将 column_list 括起来，并且用逗号进行分隔。

如果某列不在 column_list 中，则 Microsoft® SQL Server™ 必须能够基于该列的定义提供一个值；否则不能装载行。如果列满足下面的条件，那么 SQL Server 将自动为列提供值：

  • 具有 IDENTITY 属性。使用下一个增量标识值。

  • 有默认值。使用列的默认值。

  • 具有 timestamp 数据类型。使用当前的时间戳值。

  • 是可空的。使用空值。

当向标识列中插入显式的值时，必须使用 column_list 及 VALUES 列表，并且对于表，SET IDENTITY_INSERT 选项必须是 ON。

VALUES

引入要插入的数据值的列表。对于 column_list（如果已指定）中或者表中的每个列，都必须有一个数据值。必须用圆括号将值列表括起来。

如果 VALUES 列表中的值与表中列的顺序不相同，或者未包含表中所有列的值，那么必须使用 column_list 明确地指定存储每个传入值的列。

DEFAULT

强制 SQL Server 装载为列定义的默认值。如果对于某列并不存在默认值，并且该列允许 NULL，那么就插入 NULL。对于使用 timestamp 数据类型定义的列，插入下一个时间戳值。DEFAULT 对标识列无效。

expression

一个常量、变量或表达式。表达式不能包含 SELECT 或 EXECUTE 语句。

derived_table

任何有效的 SELECT 语句，它返回将装载到表中的数据行。

execute_statement

任何有效的 EXECUTE 语句，它使用 SELECT 或 READTEXT 语句返回数据。

如果将 execute_statement 与 INSERT 一起使用，那么每个结果集都必须与表中或 column_list 中的列兼容。execute_statement 可以用来执行同一服务器或远程服务器上的存储过程。执行远程服务器中的过程，然后将结果集返回到本地服务器，并装载到本地服务器的表中。如果 execute_statement 使用 READTEXT 语句返回数据，那么每个单独的 READTEXT 语句最多可以返回 1 MB (1024 KB) 的数据，也可以将 execute_statement 与扩展过程一起使用，并且插入扩展过程的主线程返回的数据。不会插入不是主线程的其它线程中的输出结果。

说明 对于 SQL Server 7.0，execute_statement 不包含返回 text 或 image 列的扩展存储过程。这个行为是从 SQL Server 早期版本变化而来的。

DEFAULT VALUES

强制新行包含为每个列所定义的默认值。

注释

INSERT 将新行追加到表中。若要替换表中的数据，必须在使用 INSERT 装载新数据之前，使用 DELETE 或 TRUNCATE TABLE 语句清除现有的数据。若要修改现有行中的列值，请使用 UPDATE。若要创建新表，并且通过一个步骤给它装载数据，请使用 SELECT 语句的 INTO 选项。

table 变量在其作用域内可以像常规表一样访问。因此，可以像在 INSERT 语句中将行添加到表一样使用 table 变量。有关更多信息，请参见 table。

由 OPENDATASOURCE 函数建立的、作为服务器名部分的四段名称可以作为表源，该表源可以出现在 INSERT 语句中显示表名的所有位置。

使用 uniqueidentifier 数据类型创建的列存储特殊格式的 16 字节二进制值。与标识列不同，SQL Server 不会为带有 uniqueidentifier 数据类型的列自动地生成值。在插入操作过程中，带有 uniqueidentifier 数据类型的变量以及某些字符串常量可以用于 uniqueidentifier 列（这些字符串常量的形式为：xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx，有 36 个字符，其中包括连字符。x 是十六进制数，范围为 0-9 或 a-f。）。例如，对于 uniqueidentifier 变量或列，6F9619FF-8B86-D011-B42D-00C04FC964FF 是一个有效值。使用 NEWID() 函数可以获取全局唯一的 ID (GUID)。

插入行时，可以应用下列规则：

  • 如果将值装载到带有 char、varchar 或 varbinary 数据类型的列，尾随空格（对于 char 和 varchar 是空格，对于 varbinary 是零）的填充和截断是由 SET ANSI_PADDING 设置确定的。该设置是在创建表时为列定义的。有关更多信息，请参见 SET ANSI_PADDING。

    下表显示 SET ANSI_PADDING 为 OFF 时的默认操作。

    数据类型 | 默认操作
    Char | 将带有空格的值填充到已定义的列宽。
    Varchar | 删除最后的非空格字符后面的尾随空格，而对于只由空格组成的字符串，一直删除到只留下一个空格字符。
    Varbinary | 删除尾随的零。

  • 如果将一个空字符串 (' ') 装载到带有 varchar 或 text 数据类型的列，那么默认操作是装载一个零长度的字符串。如果数据库的兼容级别小于 70，那么将该值转换成单个空格。有关更多信息，请参见 sp_dbcmptlevel。

  • 如果 INSERT 语句违反约束或规则，或者它有与列的数据类型不兼容的值，那么该语句就会失败，并且 SQL Server 显示错误信息。

  • 将空值插入到 text 或 image 列不能创建有效的文本指针，也不能预分配 8 KB 的文本页。有关插入 text 和 image 数据的更多信息，请参见使用 text、ntext 和 image 函数。

  • 如果 INSERT 正在使用 SELECT 或 EXECUTE 装载多行，正在装载的值中出现任何违反规则或约束的行为都会导致整个语句终止，从而不会装载任何行。

  • 当向远程 SQL Server 表中插入值且没有为所有列指定值时，则用户必须标识将向其中插入指定值的列。

在本地和远程分区视图上，忽略 INSERT 语句的 SET ROWCOUNT 选项的设置。而且，当兼容级别设置为 80 时，在 SQL Server 2000 中的远程表上也不支持 INSERT 语句的 SET ROWCOUNT 选项。

当为表或视图的 INSERT 操作定义了 INSTEAD-OF 触发器时，该触发器就会执行 INSERT 语句中的 instead of。以前的 SQL Server 版本只支持在 INSERT 中定义的 AFTER 触发器，以及其它数据修改语句。

如果在表达式赋值过程中 INSERT 语句遇到算术错误（溢出、被零除或域错误），那么 SQL Server 会处理这些错误，就好像 SET ARITHABORT 是 ON 一样。批处理的其余部分将终止，并且会返回一条错误信息。

权限

默认情况下，INSERT 权限被授予 sysadmin 固定服务器角色成员，db_owner 和 db_datawriter 固定数据库角色成员，以及表的所有者。sysadmin、db_owner 和 db_securityadmin 角色成员和表所有者可以将权限转让给其他用户。

示例
A. 使用简单的 INSERT

下面的示例创建表 T1，并且插入一行。

IF EXISTS(SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES
      WHERE TABLE_NAME = 'T1')
   DROP TABLE T1
GO
CREATE TABLE T1 ( column_1 int, column_2 varchar(30))
INSERT T1 VALUES (1, 'Row #1')
B. 插入与列顺序不同的数据

下面的示例使用 column_list 及 VALUES 列表显式地指定将被插入每个列的值。

IF EXISTS(SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES
      WHERE TABLE_NAME = 'T1')
   DROP TABLE T1
GO
CREATE TABLE T1 ( column_1 int, column_2 varchar(30))
INSERT T1 (column_2, column_1) VALUES ('Row #1',1)
C. 插入值少于列个数的数据

下面的示例创建一个带有四个列的表。INSERT 语句插入一些行，这些行只有部分列包含值。

IF EXISTS(SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES
      WHERE TABLE_NAME = 'T1')
   DROP TABLE T1
GO
CREATE TABLE T1
( column_1 int identity,
  column_2 varchar(30)
    CONSTRAINT default_name DEFAULT ('column default'),
  column_3 int NULL,
  column_4 varchar(40)
)
INSERT INTO T1 (column_4)
   VALUES ('Explicit value')
INSERT INTO T1 (column_2,column_4)
   VALUES ('Explicit value', 'Explicit value')
INSERT INTO T1 (column_2,column_3,column_4)
   VALUES ('Explicit value',-44,'Explicit value')
SELECT *
FROM T1
D. 将数据装载到带有标识列的表

前两个 INSERT 语句允许为新行生成标识值。第三个 INSERT 语句用 SET IDENTITY_INSERT 语句替代列的 IDENTITY 属性，并且将一个显式的值插入到标识列。

IF EXISTS(SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES
      WHERE TABLE_NAME = 'T1')
   DROP TABLE T1
GO
CREATE TABLE T1 ( column_1 int IDENTITY, column_2 varchar(30))
INSERT T1 VALUES ('Row #1')
INSERT T1 (column_2) VALUES ('Row #2')
SET IDENTITY_INSERT T1 ON
INSERT INTO T1 (column_1,column_2)
   VALUES (-99,'Explicit identity value')
SELECT *
FROM T1
E. 通过视图将数据装载到表

在下面的示例中，INSERT 语句指定一个视图名；但是将新行插入该视图的基础表中。INSERT 语句中 VALUES 列表的顺序必须与视图的列顺序相匹配。

IF EXISTS(SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES
      WHERE TABLE_NAME = 'T1')
   DROP TABLE T1
GO
IF EXISTS(SELECT TABLE_NAME FROM INFORMATION_SCHEMA.VIEWS
      WHERE TABLE_NAME = 'V1')
   DROP VIEW V1
GO
CREATE TABLE T1 ( column_1 int, column_2 varchar(30))
GO
CREATE VIEW V1 AS SELECT column_2, column_1
FROM T1
GO
INSERT INTO V1
   VALUES ('Row 1',1)
SELECT *
FROM T1
F. 使用 DEFAULT VALUES 选项装载数据

在下面的示例中，CREATE TABLE 语句给每个列定义一个值，当在 INSERT 语句中没有为列指定显式的值时，就可以使用这个值。使用 INSERT 语句的 DEFAULT VALUES 选项，无须提供显式的值就可以添加行。

IF EXISTS(SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES
      WHERE TABLE_NAME = 'T1')
   DROP TABLE T1
GO
CREATE DEFAULT bound_default AS 'Bound default value'
GO
CREATE TABLE T1
( column_1 int identity,
  column_2 varchar(30)
    CONSTRAINT default_name DEFAULT ('column default'),
  column_3 timestamp,
  column_4 varchar(30),
  column_5 int NULL)
GO
USE master
EXEC sp_bindefault 'bound_default','T1.column_4'
INSERT INTO T1 DEFAULT VALUES
SELECT *
FROM T1
G. 使用 SELECT 和 EXECUTE 选项装载数据

下面的示例演示三种不同的方法，用来从一个表获取数据，并将数据装载到另一个表。每种方法都基于一个多表 SELECT 语句，该语句在列列表中包含一个表达式及一个文字值。

第一个 INSERT 语句使用一个 SELECT 语句直接从源表 (authors) 检索数据，并且将结果集存储到 author_sales 表。第二个 INSERT 执行一个包含 SELECT 语句的过程，而第三个 INSERT 将 SELECT 语句作为一个文字字符串执行。

IF EXISTS(SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES
      WHERE TABLE_NAME = 'author_sales')
   DROP TABLE author_sales
GO
IF EXISTS(SELECT name FROM sysobjects
      WHERE name = 'get_author_sales' AND type = 'P')
   DROP PROCEDURE get_author_sales
GO
USE pubs
CREATE TABLE author_sales
( data_source   varchar(20),
  au_id         varchar(11),
  au_lname      varchar(40),
  sales_dollars smallmoney
)
GO
CREATE PROCEDURE get_author_sales
AS
   SELECT 'PROCEDURE', authors.au_id, authors.au_lname,
      SUM(titles.price * sales.qty)
   FROM authors INNER JOIN titleauthor
      ON authors.au_id = titleauthor.au_id INNER JOIN titles
      ON titleauthor.title_id = titles.title_id INNER JOIN sales
      ON titles.title_id = sales.title_id
   WHERE authors.au_id like '8%'
   GROUP BY authors.au_id, authors.au_lname
GO
--INSERT...SELECT example
USE pubs
INSERT author_sales
   SELECT 'SELECT', authors.au_id, authors.au_lname,
      SUM(titles.price * sales.qty)
   FROM authors INNER JOIN titleauthor
      ON authors.au_id = titleauthor.au_id INNER JOIN titles
      ON titleauthor.title_id = titles.title_id INNER JOIN sales
      ON titles.title_id = sales.title_id
   WHERE authors.au_id LIKE '8%'
   GROUP BY authors.au_id, authors.au_lname

--INSERT...EXECUTE procedure example
INSERT author_sales EXECUTE get_author_sales

--INSERT...EXECUTE('string') example
INSERT author_sales
EXECUTE
('
SELECT ''EXEC STRING'', authors.au_id, authors.au_lname,
   SUM(titles.price * sales.qty)
   FROM authors INNER JOIN titleauthor
      ON authors.au_id = titleauthor.au_id INNER JOIN titles
      ON titleauthor.title_id = titles.title_id INNER JOIN sales
      ON titles.title_id = sales.title_id
   WHERE authors.au_id like ''8%''
   GROUP BY authors.au_id, authors.au_lname
')

--Show results.
SELECT * FROM author_sales
H. 使用 SELECT 语句中的 TOP 子句插入数据

因为可以在 INSERT 语句中指定 SELECT 语句，所以也可以将 TOP 子句用在 SELECT 语句中。下面的示例将 authors 表中最上面的 10 个作者插入到名为 new_authors 的新表中。

IF EXISTS(SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES
      WHERE TABLE_NAME = 'new_authors')
   DROP TABLE new_authors
GO
USE pubs
CREATE TABLE new_authors
(
 au_id    id,
 au_lname varchar(40),
 au_fname varchar(20),
 phone    char(12),
 address  varchar(40),
 city     varchar(20),
 state    char(2),
 zip         char(5),
 contract bit
)
INSERT INTO new_authors
SELECT TOP 10 *
FROM authors

请参见

CREATE TABLE

EXECUTE

FROM

IDENTITY（属性）

NEWID

SELECT

SET ROWCOUNT


int、bigint、smallint 和 tinyint

使用整数数据的精确数字数据类型。

bigint

从 -2^63 (-9223372036854775808) 到 2^63-1 (9223372036854775807) 的整型数据（所有数字）。存储大小为 8 个字节。

int

从 -2^31 (-2,147,483,648) 到 2^31 - 1 (2,147,483,647) 的整型数据（所有数字）。存储大小为 4 个字节。int 的 SQL-92 同义字为 integer。

smallint

从 -2^15 (-32,768) 到 2^15 - 1 (32,767) 的整型数据。存储大小为 2 个字节。

tinyint

从 0 到 255 的整型数据。存储大小为 1 字节。

注释

在支持整数值的地方支持 bigint 数据类型。但是，bigint 用于某些特殊的情况，当整数值超过 int 数据类型支持的范围时，就可以采用 bigint。在 SQL Server 中，int 数据类型是主要的整数数据类型。

在数据类型优先次序表中，bigint 位于 smallmoney 和 int 之间。

只有当参数表达式是 bigint 数据类型时，函数才返回 bigint。SQL Server 不会自动将其它整数数据类型（tinyint、smallint 和 int）提升为 bigint。

请参见

ALTER TABLE

CAST 和 CONVERT

CREATE TABLE

数据类型转换

数据类型

DECLARE @local_variable

DELETE

INSERT

SET @local_variable

UPDATE


IS [NOT] NULL

确定一个给定的表达式是否为 NULL。

语法

expression IS [ NOT ] NULL

参数

expression

是任何有效的 Microsoft® SQL Server™ 表达式。

NOT

指定布尔结果取反。谓词反转其返回值，值不为 NULL 时返回 TRUE，值为 NULL 时返回 FALSE。

结果类型

布尔型

返回代码值

如果 expression 的值是 NULL，则 IS NULL 返回 TRUE；否则，返回 FALSE。

如果 expression 的值是 NULL，则 IS NOT NULL 返回 FALSE；否则，返回 TRUE。

注释

若要确定表达式是否为 NULL，请使用 IS NULL 或 IS NOT NULL，而不要用比较运算符（例如 = 或 !=）。如果有一个参数为 NULL 或两个参数都为 NULL，那么比较运算符返回 UNKNOWN。

示例

在下面的示例中，对于所有预付款少于 $5,000 或者预付款未知（或为 NULL）的书，返回它们的书号及预付款。请注意，显示的结果是在示例 C 执行后所返回的那些结果。

USE pubs
SELECT title_id, advance
FROM titles
WHERE advance < $5000 OR advance IS NULL
ORDER BY title_id

下面是结果集：

title_id advance
-------- --------------------------
MC2222   0.0000
MC3026   NULL
PC9999   NULL
PS2091   2275.0000
PS3333   2000.0000
PS7777   4000.0000
TC4203   4000.0000

(7 row(s) affected)

请参见

CASE

CREATE PROCEDURE

CREATE TABLE

数据类型

表达式

INSERT

LIKE

空值

运算符（逻辑运算符）

SELECT

sp_help

UPDATE

WHERE


IS_MEMBER

表明当前用户是否是指定 Microsoft® Windows NT® 组或 Microsoft SQL Server™ 角色的成员。

语法

IS_MEMBER ( { 'group' | 'role' } )

参数

'group'

被检查的 Windows NT 组的名称；必须用 Domain\Group 这种格式。group 的数据类型为 sysname。

'role'

被检查的 SQL Server 角色的名称。role 的数据类型为 sysname，它可以包括数据库固定角色或用户定义的角色，但不包括服务器角色。

返回类型

int

注释

IS_MEMBER 返回下面三个值。

返回值 | 描述
0 | 当前用户不是 group 或 role 的成员。
1 | 当前用户是 group 或 role 的成员。
NULL | group 或 role 是无效的。

如果要通过程序检测当前用户是否可以执行某个活动（该活动依赖于应用到组或角色的权限），那么这个函数很有用。

示例

下面的示例指明当前用户是否为 db_owner 固定数据库角色的成员。

IF IS_MEMBER ('db_owner') = 1
   print 'Current user is a member of the db_owner role'
ELSE IF IS_MEMBER ('db_owner') = 0
   print 'Current user is NOT a member of the db_owner role'
ELSE IF IS_MEMBER ('db_owner') IS NULL
   print 'ERROR: Invalid group / role specified'

请参见

IS_SRVROLEMEMBER

安全函数


IS_SRVROLEMEMBER

指明当前的用户登录是否是指定的服务器角色的成员。

语法

IS_SRVROLEMEMBER ( 'role' [ , 'login' ] )

参数

'role'

被检查的服务器角色的名称。role 的数据类型为 sysname。

role 有效的值是：

  • sysadmin

  • dbcreator

  • diskadmin

  • processadmin

  • serveradmin

  • setupadmin

  • securityadmin

'login'

将要检查的登录的可选名称。login 的数据类型为 sysname，默认值为 NULL。如果未指定，那么使用当前用户的登录帐户。

返回类型

int

注释

IS_SRVROLEMEMBER 返回下面三个值。

返回值 | 描述
0 | login 不是 role 的成员。
1 | login 是 role 的成员。
NULL | role 或 login 是无效的。

如果要通过程序检测当前用户是否可以执行某个活动（该活动要求服务器角色的权限），那么这个函数很有用。

如果为 login 指定一个 Windows NT 用户（例如 London\JoeB），而先前没有使用 sp_grantlogin 或 sp_denylogin 授予或拒绝该用户直接访问 Microsoft SQL Server 的权限，那么 IS_SRVROLEMEMBER 就会返回 NULL。

示例

下面的示例指明当前用户是否为 sysadmin 固定服务器角色的成员。

IF IS_SRVROLEMEMBER ('sysadmin') = 1
   print 'Current user''s login is a member of the sysadmin role'
ELSE IF IS_SRVROLEMEMBER ('sysadmin') = 0
   print 'Current user''s login is NOT a member of the sysadmin role'
ELSE IF IS_SRVROLEMEMBER ('sysadmin') IS NULL
   print 'ERROR: Invalid server role specified'

请参见

IS_MEMBER

安全函数


ISDATE

确定输入表达式是否为有效的日期。

语法

ISDATE ( expression )

参数

expression

一个表达式，将要验证它是否为一个日期。expression 是任何返回 varchar 数据类型的表达式。

返回类型

int

注释

如果输入表达式是有效的日期，那么 ISDATE 返回 1；否则，返回 0。下表显示一组示例所得到的返回值。

列值 (varchar) | ISDATE 返回值
NULL | 0
Abc | 0
100、-100、100 a 或 100.00 | 0
.01 | 0
-100.1234e-123 | 0
.231e90 | 0
$100.12345、- $100.12345 或 $-1000.123 | 0
as100 或 1a00 | 0
1995-10-1、1/20/95、1995-10-1 12:00pm、Feb 7 1995 11:00pm、1995-10-1 或者 1/23/95 | 1
13/43/3425 或 1995-10-1a | 0
$1000、$100 或 $100 a | 0

示例
A. 使用 ISDATE 检查变量

下面的示例检查 @datestring 局部变量是否为有效的日期。

DECLARE @datestring varchar(8)
SET @datestring = '12/21/98'
SELECT ISDATE(@datestring)

下面是结果集：

-----------
1
B. 使用 ISDATE 检查列是否为有效的日期

下面的示例创建 test_dates 表，并且插入两个值。使用 ISDATE 以确定列中的值是否为日期。

USE tempdb
CREATE TABLE test_dates (Col_1 varchar(15), Col_2 datetime)
GO
INSERT INTO test_dates VALUES ('abc', 'July 13, 1998')
GO
SELECT ISDATE(Col_1) AS Col_1, ISDATE(Col_2) AS Col_2
   FROM test_dates

下面是结果集：

Col_1                     Col_2
-----------------         --------------------
0                         1

请参见

char 和 varchar

系统函数


ISNULL

使用指定的替换值替换 NULL。

语法

ISNULL ( check_expression , replacement_value )

参数

check_expression

将被检查是否为 NULL的表达式。check_expression 可以是任何类型的。

replacement_value

在 check_expression 为 NULL时将返回的表达式。replacement_value 必须与 check_expresssion 具有相同的类型。

返回类型

返回与 check_expression 相同的类型。

注释

如果 check_expression 不为 NULL，那么返回该表达式的值；否则返回 replacement_value。

示例
A. 将 ISNULL 与 AVG 一起使用

下面的示例查找所有书的平均价格，用值 $10.00 替换 titles 表的 price 列中的所有 NULL 条目。

USE pubs
GO
SELECT AVG(ISNULL(price, $10.00))
FROM titles
GO

下面是结果集：

--------------------------
14.24

(1 row(s) affected)
B. 使用 ISNULL

下面的示例为 titles 表中的所有书选择书名、类型及价格。如果一个书名的价格是 NULL，那么在结果集中显示的价格为 0.00。

USE pubs
GO
SELECT SUBSTRING(title, 1, 15) AS Title, type AS Type,
   ISNULL(price, 0.00) AS Price
FROM titles
GO

下面是结果集：

Title           Type         Price
--------------- ------------ --------------------------
The Busy Execut business     19.99
Cooking with Co business     11.95
You Can Combat  business     2.99
Straight Talk A business     19.99
Silicon Valley  mod_cook     19.99
The Gourmet Mic mod_cook     2.99
The Psychology  UNDECIDED    0.00
But Is It User  popular_comp 22.95
Secrets of Sili popular_comp 20.00
Net Etiquette   popular_comp 0.00
Computer Phobic psychology   21.59
Is Anger the En psychology   10.95
Life Without Fe psychology   7.00
Prolonged Data  psychology   19.99
Emotional Secur psychology   7.99
Onions, Leeks,  trad_cook    20.95
Fifty Years in  trad_cook    11.95
Sushi, Anyone?  trad_cook    14.99

(18 row(s) affected)

请参见

表达式

IS [NOT] NULL

系统函数

WHERE


ISNUMERIC

确定表达式是否为一个有效的数字类型。

语法

ISNUMERIC ( expression )

参数

expression

要计算的表达式。

返回类型

int

注释

当输入表达式得数为一个有效的整数、浮点数、money 或 decimal 类型，那么 ISNUMERIC 返回 1；否则返回 0。返回值为 1 确保可以将 expression 转换为上述数字类型中的一种。

示例
A. 使用 ISNUMERIC

下面的示例返回 1，这是因为 zip 列包含有效的数值。

USE pubs
SELECT ISNUMERIC(zip)
FROM authors
GO
B. 使用 ISNUMERIC 和 SUBSTRING

下面的示例对于 titles 表中的所有书名都返回 0，这是因为没有一个书名是有效的数值。

USE pubs
GO
-- Because the title column is all character data, expect a result of 0
-- for the ISNUMERIC function.
SELECT SUBSTRING(title, 1, 15) type, price, ISNUMERIC(title)
FROM titles
GO

下面是结果集：

type            price
--------------- -------------------------- -----------
The Busy Execut 19.99                      0
Cooking with Co 11.95                      0
You Can Combat  2.99                       0
Straight Talk A 19.99                      0
Silicon Valley  19.99                      0
The Gourmet Mic 2.99                       0
The Psychology  (null)                     0
But Is It User  22.95                      0
Secrets of Sili 20.00                      0
Net Etiquette   (null)                     0
Computer Phobic 21.59                      0
Is Anger the En 10.95                      0
Life Without Fe 7.00                       0
Prolonged Data  19.99                      0
Emotional Secur 7.99                       0
Onions, Leeks,  20.95                      0
Fifty Years in  11.95                      0
Sushi, Anyone?  14.99                      0

(18 row(s) affected)

请参见

表达式

系统函数


KILL

根据系统进程 ID (SPID) 终止用户进程。如果指定的 SPID 或 UOW 有许多工作要取消，KILL 命令可能需要一些时间来完成，特别是在涉及回滚长事务时。

在 Microsoft® SQL Server™ 2000 中，KILL 命令可用来终止正常连接，这将在内部终止与给定 SPID 关联的事务。另外，在使用 Microsoft 分布式事务处理协调器 (MS DTC) 时，该命令也可用于终止所有孤立的分布式事务。当分布式事务未与任何当前 SPID 关联时，即为孤立的。

语法

KILL {spid | UOW} [WITH STATUSONLY]

参数

spid

是要终止进程的系统进程 ID (SPID)。SPID 值是当用户进行连接时指派给该连接的一个唯一的整数 (smallint)，但该指派不是永久的。

使用 KILL spid 终止与给定 SPID 相关联的常规非分布式和分布式事务。

UOW

标识 DTC 事务的工作单元 ID (UOW)。UOW 是一个字符串，可从 syslockinfo 表中获得，该表把 UOW 赋予每个由 DTC 事务控制的锁。UOW 也可从错误日志中获得，或通过 DTC 监视器获得。有关监视分布式事务的更多信息，请参见"MS DTC 用户手册"。

使用 KILL UOW 终止孤立的 DTC 事务，这些事务不与任何真实的 SPID 关联，而是手工与 SPID = '-2' 关联。有关 SPID = '-2' 的更多信息，请参见本主题后面的注释部分。

WITH STATUSONLY

指定 SQL Server 生成关于正在回滚的给定 spid 或 UOW 的进度报告。带 WITH STATUSONLY 的 KILL 命令不终止或回滚 spid 或 UOW，而只显示当前进度报告。

若要使带 WITH STATUSONLY 选项的 KILL 命令成功地生成报告，spid 或 UOW 当前必须处于回滚状态。进度报告指出已完成的回滚量（按百分比计算）和估计的剩余时间（以秒为单位），格式如下：

Spid|UOW <xxx>: Transaction rollback in progress. Estimated rollback completion: yy% Estimated time left: zz seconds.

如果执行带 WITH STATUSONLY 选项的 KILL 命令时 spid 或 UOW 回滚已经结束，或者如果没有 spid 或 UOW 正在回滚，带 WITH STATUSONLY 的 KILL 命令将返回下列错误：

Status report cannot be obtained. KILL/ROLLBACK operator for Process ID|UOW <xxx> is not in progress.

执行两次不带 WITH STATUSONLY 选项的 KILL spid|UOW 命令可得到同样的状态报告；但不建议这样做。第二次执行命令可能会终止已指派给释放的 SPID 的新进程。

注释

KILL 命令通常用于终止这样一些进程，它们锁住了其它重要进程，或者正在执行一个查询，而该查询正在使用必需的系统资源。系统进程和运行扩展存储过程的进程不能被终止。

应当小心使用 KILL 命令，特别是正在运行重要进程时。用户不能取消自己的进程。其它不能取消的进程包括：

  • AWAITING COMMAND

  • CHECKPOINT SLEEP

  • LAZY WRITER

  • LOCK MONITOR

  • SELECT

  • SIGNAL HANDLER

执行 sp_who 可得到有效 SPID 值的报告。如果某个特定的 SPID 的回滚正在进行，则 sp_who 结果集中的这个 SPID 的 cmd 列将显示"KILLED/ROLLBACK"。

使用 @@SPID 可显示当前会话的 SPID 值。

在 SQL Server 2000 中，KILL 命令可用于解决与非分布式和分布式事务相关联的 SPID。KILL 还可用于解决孤立的或置疑的分布式事务。当分布式事务未与任何当前 SPID 关联时，即为孤立的。

SPID 值为 '-2' 用于指示无连接或孤立的事务。SQL Server 将该值指派给所有孤立的分布式事务，使在 sp_lock（spid 列）、sp_who（blk 列）、syslockinfo 和 sysprocesses 中标识这样的事务更容易。当特定的连接在数据库资源上有锁并阻塞事务进程时，该功能十分有用。用户能够识别拥有锁的 SPID，并结束连接。

KILL 命令可用来解决怀疑有问题的事务，即由于未计划重新启动数据库服务器或 DTC 处理协调器而产生的未解决的分布式事务。有关解决怀疑有问题的事务的更多信息，请参见 MS DTC 事务疑难解答。

权限

默认情况下，sysadmin 和 processadmin 固定数据库角色的成员具有 KILL 的默认权限，KILL 权限不可转让。

示例
A. 使用 KILL 终止 SPID

下面的示例显示如何终止 SPID 53。

KILL 53
B. 使用 KILL spid WITH STATUSONLY 获得进度报告。

下面的示例为特定的 spid 生成回滚进程的状态。

KILL 54
KILL 54 WITH STATUSONLY

--This is the progress report.
spid 54: Transaction rollback in progress. Estimated rollback completion: 80% Estimated time left: 10 seconds.
C. 使用 KILL 终止孤立的分布式事务。

下例说明如何使用 UOW = D5499C66-E398-45CA-BF7E-DC9C194B48CF 终止孤立 (SPID = -2) 事务。

KILL 'D5499C66-E398-45CA-BF7E-DC9C194B48CF'

请参见

函数

SHUTDOWN

@@SPID

sp_lock

sp_who

MS DTC 事务疑难解答


LEFT

返回从字符串左边开始指定个数的字符。

语法

LEFT ( character_expression , integer_expression )

参数

character_expression

字符或二进制数据表达式。character_expression 可以是常量、变量或列。character_expression 必须是可以隐式地转换为 varchar 的数据类型。否则，请使用 CAST 函数显式转换 character_expression。

integer_expression

是正整数。如果 integer_expression 为负，则返回空字符串。

返回类型

varchar

注释

兼容级别可能影响返回值。有关兼容级别的更多信息，请参见 sp_dbcmptlevel。

示例
A. 对列使用 LEFT 函数

下面的示例返回每个书名最左边的 5 个字符。

USE pubs
GO
SELECT LEFT(title, 5)
FROM titles
ORDER BY title_id
GO

下面是结果集：

-----
The B
Cooki
You C
Strai
Silic
The G
The P
But I
Secre
Net E
Compu
Is An
Life
Prolo
Emoti
Onion
Fifty
Sushi

(18 row(s) affected)
B. 对字符串使用 LEFT 函数

下面的示例使用 LEFT 函数返回字符串 abcdefg 最左边的 2 个字符。

SELECT LEFT('abcdefg',2)
GO

下面是结果集：

--
ab

(1 row(s) affected)

请参见

数据类型

字符串函数


LEN

返回给定字符串表达式的字符（而不是字节）个数，其中不包含尾随空格。

语法

LEN ( string_expression )

参数

string_expression

要计算的字符串表达式。

返回类型

int

示例

下面的示例选定字符个数和位于芬兰的公司的 CompanyName 数据。

USE Northwind
GO
SELECT LEN(CompanyName) AS 'Length', CompanyName
FROM Customers
WHERE Country = 'Finland'

下面是结果集：

Length       CompanyName
-----------  ------------------------------
14           Wartian Herkku
11           Wilman Kala

请参见

数据类型

字符串函数


LIKE

确定给定的字符串是否与指定的模式匹配。模式可以包含常规字符和通配符字符。模式匹配过程中，常规字符必须与字符串中指定的字符完全匹配。然而，可使用字符串的任意片段匹配通配符。与使用 = 和 != 字符串比较运算符相比，使用通配符可使 LIKE 运算符更加灵活。如果任何参数都不属于字符串数据类型，Microsoft® SQL Server™ 会将其转换成字符串数据类型（如果可能）。

语法

match_expression [ NOT ] LIKE pattern [ ESCAPE escape_character ]

参数

match_expression

任何字符串数据类型的有效 SQL Server 表达式。

pattern

match_expression 中的搜索模式，可以包含下列有效 SQL Server 通配符。

通配符 | 描述 | 示例
% | 包含零个或更多字符的任意字符串。 | WHERE title LIKE '%computer%' 将查找处于书名任意位置的包含单词 computer 的所有书名。
_（下划线） | 任何单个字符。 | WHERE au_fname LIKE '_ean' 将查找以 ean 结尾的所有 4 个字母的名字（Dean、Sean 等）。
[ ] | 指定范围 ([a-f]) 或集合 ([abcdef]) 中的任何单个字符。 | WHERE au_lname LIKE '[C-P]arsen' 将查找以arsen 结尾且以介于 C 与 P 之间的任何单个字符开始的作者姓氏，例如，Carsen、Larsen、Karsen 等。
[^] | 不属于指定范围 ([a-f]) 或集合 ([abcdef]) 的任何单个字符。 | WHERE au_lname LIKE 'de[^l]%' 将查找以 de 开始且其后的字母不为 l 的所有作者的姓氏。

escape_character

字符串数据类型分类中的所有数据类型的任何有效 SQL Server 表达式。escape_character 没有默认值，且必须仅包含一个字符。

结果类型

Boolean

结果值

如果 match_expression 匹配指定模式，LIKE 将返回 TRUE。

注释

当使用 LIKE 进行字符串比较时，模式字符串中的所有字符都有意义，包括起始或尾随空格。如果查询中的比较要返回包含"abc "（abc 后有一个空格）的所有行，则将不会返回包含"abc"（abc 后没有空格）的列所在行。但是可以忽略模式所要匹配的表达式中的尾随空格。如果查询中的比较要返回包含"abc"（abc 后没有空格）的所有行，则将返回以"abc"开始且具有零个或多个尾随空格的所有行。

由于数据存储方式的原因，使用包含 char 和 varchar 数据模式的字符串比较可能无法通过 LIKE 比较。了解每种数据类型的存储方式以及导致 LIKE 比较失败的原因十分重要。下面的示例将局部 char 变量传递给存储过程，然后使用模式匹配查找某个作者的所有著作。在此过程中，作者的姓将作为变量传递。

CREATE PROCEDURE find_books @AU_LNAME char(20)
AS
SELECT @AU_LNAME = RTRIM(@AU_LNAME) + '%'
SELECT t.title_id, t.title
FROM authors a, titleauthor ta, titles t
WHERE a.au_id = ta.au_id AND ta.title_id = t.title_id
   AND a.au_lname LIKE @AU_LNAME

当名字中包含的字符数小于 20 时，char 变量 (@AU_LNAME) 将包含尾随空格，这导致 find_books 过程中没有行返回。由于 au_lname 列为 varchar 类型，所以没有尾随空格。因为尾随空格是有意义的，所以此过程失败。

但下面的示例是成功的，因为尾随空格没有被添加到 varchar 变量中：

USE pubs
GO
CREATE PROCEDURE find_books2 @au_lname varchar(20)
AS
SELECT t.title_id, t.title
FROM authors a, titleauthor ta, titles t
WHERE a.au_id = ta.au_id AND ta.title_id = t.title_id
   AND a.au_lname LIKE @au_lname + '%'

EXEC find_books2 'ring'

下面是结果集：

title_id title
-------- ---------------------------------------------------------------
MC3021   The Gourmet Microwave
PS2091   Is Anger the Enemy?
PS2091   Is Anger the Enemy?
PS2106   Life Without Fear

(4 row(s) affected)
使用 LIKE 的模式匹配

当搜索 datetime 值时，推荐使用 LIKE，因为 datetime 项可能包含各种日期部分。例如，如果将值 19981231 9:20 插入到名为 arrival_time 的列中，则子句 WHERE arrival_time = 9:20 将无法找到 9:20 字符串的精确匹配，因为 SQL Server 将其转换为 1900 年 1 月 1 日上午 9:20。然而，子句 WHERE arrival_time LIKE '%9:20%' 将找到匹配。

LIKE 支持 ASCII 模式匹配和 Unicode 模式匹配。当所有参数，包括 match_expression、pattern 和 escape_character（如果有）都是 ASCII 字符数据类型时，将执行 ASCII 模式匹配。如果其中任何参数属于 Unicode 数据类型，则所有参数将被转换为 Unicode 并执行 Unicode 模式匹配。当对 Unicode 数据（nchar 或 nvarchar 数据类型）使用 LIKE 时，尾随空格是有意义的。但是对于非 Unicode 数据，尾随空格没有意义。Unicode LIKE 与 SQL-92 标准兼容。ASCII LIKE 与 SQL Server 的早期版本兼容。

下面的一系列示例显示 ASCII LIKE 模式匹配与 Unicode LIKE 模式匹配所返回的行之间的差异：

-- ASCII pattern matching with char column
CREATE TABLE t (col1 char(30))
INSERT INTO t VALUES ('Robert King')
SELECT *
FROM t
WHERE col1 LIKE '% King'   -- returns 1 row

-- Unicode pattern matching with nchar column
CREATE TABLE t (col1 nchar(30))
INSERT INTO t VALUES ('Robert King')
SELECT *
FROM t
WHERE col1 LIKE '% King'   -- no rows returned

-- Unicode pattern matching with nchar column and RTRIM
CREATE TABLE t (col1 nchar (30))
INSERT INTO t VALUES ('Robert King')
SELECT *
FROM t
WHERE RTRIM(col1) LIKE '% King'   -- returns 1 row

说明 如果使用 LIKE 进行字符串比较，模式字符串中的所有字符都有意义，包括起始空格或尾随空格。

使用 % 通配符

如果指定 LIKE '5%'，SQL Server 将搜索后面带有零个或多个任意字符的数字 5。

例如，此查询将显示数据库中所有的系统表，因为它们都以字母 sys 开始：

SELECT TABLE_NAME
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME LIKE 'sys%'

说明 请注意：系统表可以随版本不同而更改。推荐使用信息架构视图或适用的存储过程处理 SQL Server 系统表。

若要查阅非系统表的所有对象，请使用 NOT LIKE 'sys%'。如果共有 32 个对象且 LIKE 找到 13 个与模式匹配的名称，则 NOT LIKE 将找到 19 个与 LIKE 模式不匹配的对象。

使用 LIKE '[^s][^y][^s]%' 模式不一定每次找到的名称都相同。可能仅得到 14 个名称（而不是 19 个），除了系统表名称外，所有以 s 开始或第二个字母为 y 或第三个字母为 s 的名称也都将从结果中消除。这是因为用反向通配符匹配字符串是分步骤进行计算的，一次一个通配符。如果在计算过程中任一环节匹配失败，那么就会将其消除。

将通配符作为文字使用

可以将通配符模式匹配字符串用作文字字符串，方法是将通配符放在括号中。下表显示了使用 LIKE 关键字和 [ ] 通配符的示例。

符号 | 含义
LIKE '5[%]' | 5%
LIKE '[_]n' | _n
LIKE '[a-cdf]' | a、b、c、d 或 f
LIKE '[-acdf]' | -、a、c、d 或 f
LIKE '[ [ ]' | [
LIKE ']' | ]
LIKE 'abc[_]d%' | abc_d 和 abc_de
LIKE 'abc[def]' | abcd、abce 和 abcf

使用 ESCAPE 子句的模式匹配

可搜索包含一个或多个特殊通配符的字符串。例如，customers 数据库中的 discounts 表可能存储含百分号 (%) 的折扣值。若要搜索作为字符而不是通配符的百分号，必须提供 ESCAPE 关键字和转义符。例如，一个样本数据库包含名为 comment 的列，该列含文本 30%。若要搜索在 comment 列中的任何位置包含字符串 30% 的任何行，请指定由 WHERE comment LIKE '%30!%%' ESCAPE '!' 组成的 WHERE 子句。如果不指定 ESCAPE 和转义符，SQL Server 将返回所有含字符串 30 的行。

下例说明如何在 pubs 数据库 titles 表的 notes 列中搜索字符串"50% off when 100 or more copies are purchased"：

USE pubs
GO
SELECT notes
FROM titles
WHERE notes LIKE '50%% off when 100 or more copies are purchased'
   ESCAPE '%'
GO
示例
A. 使用带 % 通配符的 LIKE

下例查找 authors 表中所有区号为 415 的电话号码。

USE pubs
GO
SELECT phone
FROM authors
WHERE phone LIKE '415%'
ORDER by au_lname
GO

下面是结果集：

phone
------------
415 658-9932
415 548-7723
415 836-7128
415 986-7020
415 836-7128
415 534-9219
415 585-4620
415 354-7128
415 834-2919
415 843-2991
415 935-4228

(11 row(s) affected)
B. 使用带 % 通配符的 NOT LIKE

下例查找 authors 表中所有区号不是 415 的电话号码。

USE pubs
GO
SELECT phone
FROM authors
WHERE phone NOT LIKE '415%'
ORDER BY au_lname
GO

下面是结果集：

phone
------------
503 745-6402
219 547-9982
615 996-8275
615 297-2723
707 938-6445
707 448-4982
408 286-2428
301 946-8853
801 826-0752
801 826-0752
913 843-0462
408 496-7223

(12 row(s) affected)
C. 使用 ESCAPE 子句

下例使用 ESCAPE 子句和转义符查找 mytbl2 表的 c1 列中的精确字符串 10-15%。

USE pubs
GO
IF EXISTS(SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES
      WHERE TABLE_NAME = 'mytbl2')
   DROP TABLE mytbl2
GO
USE pubs
GO
CREATE TABLE mytbl2
(
 c1 sysname
)
GO
INSERT mytbl2 VALUES ('Discount is 10-15% off')
INSERT mytbl2 VALUES ('Discount is .10-.15 off')
GO
SELECT c1
FROM mytbl2
WHERE c1 LIKE '%10-15!% off%' ESCAPE '!'
GO
D. 使用 [ ] 通配符

下例查找名字为 Cheryl 或 Sheryl 的作者。

USE pubs
GO
SELECT au_lname, au_fname, phone
FROM authors
WHERE au_fname LIKE '[CS]heryl'
ORDER BY au_lname ASC, au_fname ASC
GO

下例查找姓为 Carson、Carsen、Karson 或 Karsen 的作者所在的行。

USE pubs
GO
SELECT au_lname, au_fname, phone
FROM authors
WHERE au_lname LIKE '[CK]ars[eo]n'
ORDER BY au_lname ASC, au_fname ASC
GO

请参见

表达式

函数

SELECT

WHERE


LOAD

装载下列之一的备份复本：

  1. 用户数据库 (LOAD DATABASE)

  2. 事务日志 (LOAD TRANSACTION)

  3. 有关转储的标题信息 (LOAD HEADERONLY)

重要 在 Microsoft® SQL Server™ 2000 中包括 LOAD 语句是为了向后兼容。LOAD 语句与 RESTORE 语句完全相同。建议使用 RESTORE 语句取代 LOAD 语句。在将来的 SQL 版本中将不再支持 LOAD。

请参见

BACKUP

CREATE DATABASE

RESTORE

sp_helpdevice


LOG

返回给定 float 表达式的自然对数。

语法

LOG ( float_expression )

参数

float_expression

是 float 数据类型的表达式。

返回类型

float

示例

下例计算给定 float 表达式的 LOG。

DECLARE @var float
SET @var = 5.175643
SELECT 'The LOG of the variable is: ' + CONVERT(varchar,LOG(@var))
GO

下面是结果集：

The LOG of the variable is: 1.64396

(1 row(s) affected)

请参见

数学函数


LOG10

返回给定 float 表达式的以 10 为底的对数。

语法

LOG10 ( float_expression )

参数

float_expression

是 float 数据类型的表达式。

返回类型

float

示例

下例计算给定变量的 LOG10。

DECLARE @var float
SET @var = 145.175643
SELECT 'The LOG10 of the variable is: ' + CONVERT(varchar,LOG10(@var))
GO

下面是结果集：

The LOG10 of the variable is: 2.16189

(1 row(s) affected)

请参见

数学函数


LOWER

将大写字符数据转换为小写字符数据后返回字符表达式。

语法

LOWER ( character_expression )

参数

character_expression

是字符或二进制数据表达式。character_expression 可以是常量、变量或列。character_expression 必须是可以隐性转换为 varchar 的数据类型。否则，使用 CAST 显式转换 character_expression。

返回类型

varchar

示例

下例在选择价格位于 $11 和 $20 间的书名时，使用 LOWER 函数、UPPER 函数并把 UPPER 函数嵌套在 LOWER 函数内。

USE pubs
GO
SELECT LOWER(SUBSTRING(title, 1, 20)) AS Lower,
   UPPER(SUBSTRING(title, 1, 20)) AS Upper,
   LOWER(UPPER(SUBSTRING(title, 1, 20))) As LowerUpper
FROM titles
WHERE price between 11.00 and 20.00
GO

下面是结果集：

Lower                   Upper                   LowerUpper
--------------------    --------------------    --------------------
the busy executive's    THE BUSY EXECUTIVE'S    the busy executive's
cooking with compute    COOKING WITH COMPUTE    cooking with compute
straight talk about     STRAIGHT TALK ABOUT     straight talk about
silicon valley gastr    SILICON VALLEY GASTR    silicon valley gastr
secrets of silicon v    SECRETS OF SILICON V    secrets of silicon v
prolonged data depri    PROLONGED DATA DEPRI    prolonged data depri
fifty years in bucki    FIFTY YEARS IN BUCKI    fifty years in bucki
sushi, anyone?          SUSHI, ANYONE?          sushi, anyone?

(8 row(s) affected)

请参见

数据类型

字符串函数


LTRIM

删除起始空格后返回字符表达式。

语法

LTRIM ( character_expression )

参数

character_expression

是字符或二进制数据表达式。character_expression 可以是常量、变量或列。character_expression 必须是可以隐性转换为 varchar 的数据类型。否则，使用 CAST 显式转换 character_expression。

返回类型

varchar

注释

兼容级别可能影响返回值。有关兼容级别的更多信息，请参见 sp_dbcmptlevel。

示例

下例使用 LTRIM 字符删除字符变量中的起始空格。

DECLARE @string_to_trim varchar(60)
SET @string_to_trim = '     Five spaces are at the beginning of this
   string.'
SELECT 'Here is the string without the leading spaces: ' +
   LTRIM(@string_to_trim)
GO

下面是结果集：

------------------------------------------------------------------------
Here is the string without the leading spaces: Five spaces are at the beginning of this string.

(1 row(s) affected)

请参见

数据类型

字符串函数


MAX

返回表达式的最大值。

语法

MAX ( [ ALL | DISTINCT ] expression )

参数

ALL

对所有的值进行聚合函数运算。ALL 是默认设置。

DISTINCT

指定每个唯一值都被考虑。DISTINCT 对于 MAX 无意义，使用它仅仅是为了符合 SQL-92 兼容性。

expression

常量、列名、函数以及算术运算符、按位运算符和字符串运算符的任意组合。MAX 可用于数字列、字符列和 datetime 列，但不能用于 bit 列。不允许使用聚合函数和子查询。

返回类型

返回类型与 expression 相同。

重要 当使用 CUBE 或 ROLLUP 时，不支持区分聚合，例如 AVG(DISTINCT column_name)、COUNT(DISTINCT column_name)、MAX(DISTINCT column_name)、MIN(DISTINCT column_name) 和 SUM(DISTINCT column_name)。如果使用，则 Microsoft® SQL Server™ 将返回错误信息并取消查询。

注释

MAX 忽略任何空值。

对于字符列，MAX 查找排序序列的最大值。

示例

下面的示例返回年度销售额最高的书。

USE pubs
GO
SELECT MAX(ytd_sales)
FROM titles
GO

下面是结果集：

-----------
22246

(1 row(s) affected)

Warning, null value eliminated from aggregate.

请参见

聚合函数


MIN

返回表达式的最小值。

语法

MIN ( [ ALL | DISTINCT ] expression )

参数

ALL

对所有的值进行聚合函数运算。ALL 是默认设置。

DISTINCT

指定每个唯一值都被考虑。DISTINCT 对于 MIN 无意义，使用它仅仅是为了符合 SQL-92 兼容性。

expression

常量、列名、函数以及算术运算符、按位运算符和字符串运算符的任意组合。MIN 可用于数字列、char 列、varchar 列或 datetime列，但不能用于 bit 列。不允许使用聚合函数和子查询。

返回类型

返回类型与 expression 相同。

重要 当使用 CUBE 或 ROLLUP 时，不支持区分聚合，例如 AVG(DISTINCT column_name)、COUNT(DISTINCT column_name)、MAX(DISTINCT column_name)、MIN(DISTINCT column_name) 和 SUM(DISTINCT column_name)。如果使用，则 Microsoft® SQL Server™ 就会返回错误信息并结束查询。

注释

MIN 忽略任何空值。

对于字符列，MIN 查找排序序列的最低值。

示例

下面的示例返回年度销售额最低的书。

USE pubs
GO
SELECT min(ytd_sales)
FROM titles
GO

下面是结果集：

-----------
111

(1 row(s) affected)

请参见

聚合函数


money 和 smallmoney

代表货币或现金值的货币数据类型。

money

货币数据值介于 -2^63 (-922,337,203,685,477.5808) 与 2^63 - 1 (+922,337,203,685,477.5807) 之间，精确到货币单位的千分之十。存储大小为 8 个字节。

smallmoney

货币数据值介于 -214,748.3648 与 +214.748,3647 之间，精确到货币单位的千分之十。存储大小为 4 个字节。

请参见

ALTER TABLE

CAST 和 CONVERT

CREATE TABLE

数据类型转换

数据类型

DECLARE @local_variable

DELETE

INSERT

货币数据

SET @local_variable

UPDATE

使用货币数据


MONTH

返回代表指定日期月份的整数。

语法

MONTH ( date )

参数

date

返回 datetime 或 smalldatetime 值或日期格式字符串的表达式。仅对 1753 年 1 月 1 日后的日期使用 datetime 数据类型。

返回类型

int

注释

MONTH 等价于 DATEPART(mm, date)。

将 datetime 值包含在引号中。对于早期日期，可将其存储为字符数据。

Microsoft® SQL Server™ 认可各种日期样式。有关日期和时间数据的更多信息，请参见 CAST 和 CONVERT。

示例

下面的示例从日期 03/12/1998 中返回月份数。

SELECT "Month Number" = MONTH('03/12/1998')
GO

下面是结果集：

Month Number
------------
3

下例用数字指定日期。注意：SQL Server 将 0 解释为 01/01/1900。

SELECT MONTH(0), DAY(0), YEAR(0)

下面是结果集。

----- ------ ------
1     1      1900

请参见

数据类型

日期和时间函数

datetime 和 smalldatetime


NCHAR

根据 Unicode 标准所进行的定义，用给定整数代码返回 Unicode 字符。

语法

NCHAR ( integer_expression )

参数

integer_expression

介于 0 与 65535 之间的所有正整数。如果指定了超出此范围的值，将返回 NULL。

返回类型

nchar(1)

示例
A. 使用 NCHAR 和 UNICODE

下面的示例使用 UNICODE 和 NCHAR 函数打印字符串 Køenhavn 第二个字符的 UNICODE 值和 NCHAR（Unicode 字符），并打印实际的第二个字符ø。

DECLARE @nstring nchar(8)
SET @nstring = N'København'
SELECT UNICODE(SUBSTRING(@nstring, 2, 1)),
   NCHAR(UNICODE(SUBSTRING(@nstring, 2, 1)))
GO

下面是结果集：

----------- -
248         ø(1 row(s) affected)
B. 使用 SUBSTRING、UNICODE、CONVERT 和 NCHAR

下面的示例使用 SUBSTRING、UNICODE、CONVERT 和 NCHAR 函数打印字符串 Køenhavn 的字符数、Unicode 字符以及每个字符的 UNICODE 值。

-- The @position variable holds the position of the character currently
-- being processed. The @nstring variable is the Unicode character
-- string to process.
DECLARE @position int, @nstring nchar(9)
-- Initialize the current position variable to the first character in
-- the string.
SET @position = 1
-- Initialize the character string variable to the string to process.
-- Notice that there is an N before the start of the string, which
-- indicates that the data following the N is Unicode data.
SET @nstring = N'København'
-- Print the character number of the position of the string you're at,
-- the actual Unicode character you're processing, and the UNICODE value -- for this particular character.
PRINT 'Character #' + ' ' + 'Unicode Character' + ' ' + 'UNICODE Value'
WHILE @position <= DATALENGTH(@nstring)
   BEGIN
   SELECT @position,
      NCHAR(UNICODE(SUBSTRING(@nstring, @position, 1))),
      CONVERT(NCHAR(17), SUBSTRING(@nstring, @position, 1)),
      UNICODE(SUBSTRING(@nstring, @position, 1))
   SELECT @position = @position + 1
   END
GO

下面是结果集：

Character # Unicode Character UNICODE Value

----------- ----------------- -----------
1           K                 75

----------- ----------------- -----------
2           ø                 248

----------- ----------------- -----------
3           b                 98

----------- ----------------- -----------
4           e                 101

----------- ----------------- -----------
5           n                 110

----------- ----------------- -----------
6           h                 104

----------- ----------------- -----------
7           a                 97

----------- ----------------- -----------
8           v                 118

----------- ----------------- -----------
9           n                 110

----------- ----------------- -----------
10          (null)            (null)

----------- ----------------- -----------
11          (null)            (null)

----------- ----------------- -----------
12          (null)            (null)

----------- ----------------- -----------
13          (null)            (null)

----------- ----------------- -----------
14          (null)            (null)

----------- ----------------- -----------
15          (null)            (null)

----------- ----------------- -----------
16          (null)            (null)

----------- ----------------- -----------
17          (null)            (null)

----------- ----------------- -----------
18          (null)            (null)

请参见

数据类型

字符串函数

UNICODE


nchar 和 nvarchar

nchar 是固定长度 Unicode 数据的数据类型，nvarchar 是可变长度 Unicode 数据的数据类型，二者均使用 UNICODE UCS-2 字符集。

nchar(n)

包含 n 个字符的固定长度 Unicode 字符数据。n 的值必须介于 1 与 4,000 之间。存储大小为 n 字节的两倍。nchar 在 SQL-92 中的同义词为 national char 和 national character。

nvarchar(n)

包含 n 个字符的可变长度 Unicode 字符数据。n 的值必须介于 1 与 4,000 之间。字节的存储大小是所输入字符个数的两倍。所输入的数据字符长度可以为零。nvarchar 在 SQL-92 中的同义词为 national char varying 和 national character varying。

注释

如果没有在数据定义或变量声明语句中指定 n，则默认长度为 1。如果没有使用 CAST 函数指定 n，则默认长度为 30。

如果希望列中所有数据项的大小接近一致，则使用 nchar。

如果希望列中数据项的大小差异很大，则使用 nvarchar。

使用 nchar 或 nvarchar 的对象被赋予数据库的默认排序规则，除非使用 COLLATE 子句赋予特定的排序规则。

SET ANSI_PADDING OFF 不适用于 nchar 或 nvarchar。SET ANSI_PADDING ON 永远适用于 nchar 和 nvarchar。

请参见

ALTER TABLE

CAST 和 CONVERT

COLLATE

CREATE TABLE

数据类型转换

数据类型

DECLARE @local_variable

DELETE

INSERT

LIKE

SET ANSI_PADDING

SET @local_variable

sp_dbcmptlevel

UPDATE

使用 Unicode 数据

WHERE


NEWID

创建 uniqueidentifier 类型的唯一值。

语法

NEWID ( )

返回类型

uniqueidentifier

示例
A.对变量使用 NEWID 函数

下面的示例使用 NEWID 对声明为 uniqueidentifier 数据类型的变量赋值。在测试该值前，将先打印 uniqueidentifier 数据类型变量的值。

-- Creating a local variable with DECLARE/SET syntax.
DECLARE @myid uniqueidentifier
SET @myid = NEWID()
PRINT 'Value of @myid is: '+ CONVERT(varchar(255), @myid)

下面是结果集：

Value of @myid is: 6F9619FF-8B86-D011-B42D-00C04FC964FF

说明 对于每台计算机，由 NEWID 返回的值不同。所显示的数字仅起解释说明的作用。

B.在 CREATE TABLE 语句中使用 NEWID

下面的示例创建具有 uniqueidentifier 数据类型的 cust 表，并使用 NEWID 将默认值填充到表中。为 NEWID() 赋默认值时，每个新行和现有行均具有 cust_id 列的唯一值。

-- Creating a table using NEWID for uniqueidentifier data type.
CREATE TABLE cust
(
 cust_id uniqueidentifier NOT NULL
   DEFAULT newid(),
 company varchar(30) NOT NULL,
 contact_name varchar(60) NOT NULL,
 address varchar(30) NOT NULL,
 city varchar(30) NOT NULL,
 state_province varchar(10) NULL,
 postal_code varchar(10) NOT NULL,
 country varchar(20) NOT NULL,
 telephone varchar(15) NOT NULL,
 fax varchar(15) NULL
)
GO
-- Inserting data into cust table.
INSERT cust
(cust_id, company, contact_name, address, city, state_province,
 postal_code, country, telephone, fax)
VALUES
(newid(), 'Wartian Herkku', 'Pirkko Koskitalo', 'Torikatu 38', 'Oulu', NULL,
 '90110', 'Finland', '981-443655', '981-443655')
INSERT cust
(cust_id, company, contact_name, address, city, state_province,
postal_code, country, telephone, fax)
VALUES
(newid(), 'Wellington Importadora', 'Paula Parente', 'Rua do Mercado, 12', 'Resende', 'SP',
 '08737-363', 'Brazil', '(14) 555-8122', '')
INSERT cust
(cust_id, company, contact_name, address, city, state_province,
 postal_code, country, telephone, fax)
VALUES
(newid(), 'Cactus Comidas para Ilevar', 'Patricio Simpson', 'Cerrito 333', 'Buenos Aires', NULL,
 '1010', 'Argentina', '(1) 135-5555', '(1) 135-4892')
INSERT cust
(cust_id, company, contact_name, address, city, state_province,
 postal_code, country, telephone, fax)
VALUES
(newid(), 'Ernst Handel', 'Roland Mendel', 'Kirchgasse 6', 'Graz', NULL,
 '8010', 'Austria', '7675-3425', '7675-3426')
INSERT cust
(cust_id, company, contact_name, address, city, state_province,
 postal_code, country, telephone, fax)
VALUES
(newid(), 'Maison Dewey', 'Catherine Dewey', 'Rue Joseph-Bens 532', 'Bruxelles', NULL,
 'B-1180', 'Belgium', '(02) 201 24 67', '(02) 201 24 68')
GO
C. 使用 uniqueidentifier 和变量赋值

下面的示例声明局部变量 @myid 为 uniqueidentifier 数据类型。然后使用 SET 语句为该变量赋值。

DECLARE @myid uniqueidentifier
SET @myid = 'A972C577-DFB0-064E-1189-0154C99310DAAC12'
GO

请参见

ALTER TABLE

CAST 和 CONVERT

CREATE TABLE

数据类型

复制概述

系统函数

uniqueidentifier


Northwind 示例数据库

Northwind Traders 示例数据库包含一个名为 Northwind Traders 的虚构公司的销售数据，该公司从事世界各地的特产食品进出口贸易。

如果对 Northwind 数据库进行了更改，可通过运行 Microsoft® SQL Server™ 安装的 Install 目录下的脚本将其重新安装：

  1. 在命令提示符下，更改到 Mssql7\Install 目录。

  2. 使用 osql 实用工具运行 Instnwnd.sql 脚本：
    osql/Usa /Psapassword /Sservername /iinstnwnd.sql /oinstnwnd.rpt
  3. 检查 Instnwnd.rpt 中报告的错误。

数据库创建于 SQL Server 安装程序的 Data 目录下。

Instnwnd.sql 是个大文件。如果希望通过记事本查看 Instnwnd.sql，请先关闭记事本的"自动换行"选项。如果打开了"自动换行"选项，那么打开文件以及每次的滚动操作将花费较长时间。即使在文件已经打开后关闭"自动换行"选项，也需要较长的时间。


Categories

Column_name | 数据类型 | 可为空 | 默认值 | 检查 | 键/索引
CategoryID | int | 否 | IDENTITY(1,1) |  | 聚集主键
CategoryName | nvarchar(15) | 否 |  |  | 非聚集
Description | ntext | 是 |  |  |
Picture | image | 是 |  |  |


CustomerCustomerDemo

Column_name | 数据类型 | 可以为空 | 默认值 | 检查 | 键/索引
CustomerID | nchar(5) | 否 |  |  | 组合非聚集主键1、 外键 Customers(CustomerID)
CustomerTypeID | nchar(10) | 否 |  |  | 组合非聚集主键1、外键 CustomerDemographics(CustomerTypeID)

1 组合主键在 CustomerID、CustomerTypeID 上定义。


CustomerDemographics

Column_name | 数据类型 | 可以为空 | 默认值 | 检查 | 键/索引
CustomerTypeID | nchar(10) | 否 |  |  | 非聚集主键
CustomerDesc | ntext | 是 |  |  |


Customers

Column_name | 数据类型 | 可以为空 | 默认值 | 检查 | 键/索引
CustomerID | nchar(5) | 否 |  |  | 聚集主键
CompanyName | nvarchar(40) | 否 |  |  | 非聚集
ContactName | nvarchar(30) | 是 |  |  |
ContactTitle | nvarchar(30) | 是 |  |  |
Address | nvarchar(60) | 是 |  |  |
City | nvarchar(15) | 是 |  |  | 非聚集
Region | nvarchar(15) | 是 |  |  | 非聚集
PostalCode | nvarchar(10) | 是 |  |  | 非聚集
Country | nvarchar(15) | 是 |  |  |
Phone | nvarchar(24) | 是 |  |  |
Fax | nvarchar(24) | 是 |  |  |


Employees

Column_name | 数据类型 | 可以为空 | 默认值 | 检查 | 键/索引
EmployeeID | int | 否 | IDENTITY (1,1) |  | 聚集主键
LastName | nvarchar(20) | 否 |  |  | 非聚集
FirstName | nvarchar(10) | 否 |  |  |
Title | nvarchar(30) | 是 |  |  |
TitleOfCourtesy | nvarchar(25) | 是 |  |  |
BirthDate | datetime | 是 |  | 是1 |
HireDate | datetime | 是 |  |  |
Address | nvarchar(60) | 是 |  |  |
City | nvarchar(15) | 是 |  |  |
Region | nvarchar(15) | 是 |  |  |
PostalCode | nvarchar(10) | 是 |  |  | 非聚集
Country | nvarchar(15) | 是 |  |  |
HomePhone | nvarchar(24) | 是 |  |  |
Extension | nvarchar(4) | 是 |  |  |
Photo | image | 是 |  |  |
Notes | ntext | 是 |  |  |
ReportsTo | int | 是 |  |  | 外键 Employees(EmployeeID)
Photopath | nvarchar(255) | 是 |  |  |

1 BirthDate 的 CHECK 约束定义为 (BirthDate < GETDATE())。

说明 Employees 表中 Address 列的某些项包含换行符，这可能影响结果集列的格式。


EmployeeTerritories

Column_name | 数据类型 | 可以为空 | 默认值 | 检查 | 键/索引
EmployeeID | int | 否 |  |  | 组合非聚集主键
TerritoryID | nvarchar(20) | 否 |  |  | 组合非聚集主键


Order Details

Column_name | 数据类型 | 可以为空 | 默认值 | 检查 | 键/索引
OrderID | int | 否 |  |  | 组合聚集主键1、外键 Orders(OrderID)2
ProductID | int | 否 |  |  | 组合聚集主键1、外键 Products(ProductID)3
UnitPrice | money | 否 | 0 | 是4 |
Quantity | smallint | 否 | 1 | 是5 |
Discount | real | 否 | 0 |  |

1 组合、主键、聚集索引在 OrderID 和ProductID 上定义。
2 在 OrderID 上也有两个非聚集索引。
3 在 ProductID 上也有两个非聚集索引。
4 UnitPrice 的 CHECK 约束被定义为 (UnitPrice >= 0)。
5 Quantity 的 CHECK 约束被定义为 (Quantity > 0)。
表级别的 CHECK 约束被定义为 (Discount >= 0 和 Discount < = 1)。


Orders

Column_name | 数据类型 | 可以为空 | 默认值 | 检查 | 键/索引
OrderID | int | 否 | IDENTITY (1,1) |  | 聚集主键
CustomerID | nchar(5) | 是 |  |  | 主键 Customers(CustomerID)1
EmployeeID | int | 是 |  |  | 主键 Employees(EmployeeID)2
OrderDate | datetime | 是 | GETDATE ( ) |  | 非聚集
RequiredDate | datetime | 是 |  |  |
ShippedDate | datetime | 是 |  |  | 非聚集
ShipVia | int | 是 |  |  | 主键 Shippers(ShipperID)3
Freight | money | 是 | 0 |  |
ShipName | nvarchar(40) | 是 |  |  |
ShipAddress | nvarchar(60) | 是 |  |  |
ShipCity | nvarchar(15) | 是 |  |  |
ShipRegion | nvarchar(15) | 是 |  |  |
ShipPostalCode | nvarchar(10) | 是 |  |  | 非聚集
ShipCountry | nvarchar(15) | 是 |  |  |

1 在 CustomerID 上也有两个非聚集索引。
2 在 EmployeeID 上也有两个非聚集索引。
3 在 ShipVia 上也有一个非聚集索引。


Products

Column_name | 数据类型 | 可以为空 | 默认值 | 检查 | 键/索引
ProductID | int | 否 | IDENTITY (1,1) |  | 聚集主键
ProductName | nvarchar(40) | 否 |  |  | 非聚集
SupplierID | int | 是 |  |  | 非聚集主键 Suppliers(SupplierID)1
CategoryID | int | 是 |  |  | 非聚集主键 Categories(CategoryID)2
QuantityPerUnit | nvarchar(20) | 是 |  |  |
UnitPrice | money | 是 | 0 | 是3 |
UnitsInStock | smallint | 是 | 0 | 是4 |
UnitsOnOrder | smallint | 是 | 0 | 是5 |
ReorderLevel | smallint | 是 | 0 | 是6 |
Discontinued | bit | 否 | 0 |  |

1 在 SupplierID 上有两个非聚集索引。
2 在 CategoryID 上有两个非聚集索引。
3 UnitPrice 的 CHECK 约束被定义为 (UnitPrice >=)。
4 UnitsInStock 的 CHECK 约束被定义为 (UnitsInStock >=)。
5 UnitsOnOrder 的 CHECK 约束被定义为 (UnitsOnOrder >=)。
6 ReorderLevel 的 CHECK 约束被定义为 (ReorderLevel >=)。


Region

Column_name | 数据类型 | 可以为空 | 默认值 | 检查 | 键/索引
RegionID | int | 否 |  |  | 非聚集主键
RegionDescription | nchar(50) | 否 |  |  |


Shippers

Column_name | 数据类型 | 可以为空 | 默认值 | 检查 | 键/索引
ShipperID | int | 否 | IDENTITY (1,1) |  | 聚集主键
CompanyName | nvarchar(40) | 否 |  |  |
Phone | nvarchar(24) | 是 |  |  |


Suppliers

Column_name | 数据类型 | 可以为空 | 默认值 | 检查 | 键/索引
SupplierID | int | 否 | IDENTITY (1,1) |  | 聚集主键
CompanyName | nvarchar(40) | 否 |  |  | 非聚集
ContactName | nvarchar(30) | 是 |  |  |
ContactTitle | nvarchar(30) | 是 |  |  |
Address | nvarchar(60) | 是 |  |  |
City | nvarchar(15) | 是 |  |  |
Region | nvarchar(15) | 是 |  |  |
PostalCode | nvarchar(10) | 是 |  |  | 非聚集
Country | nvarchar(15) | 是 |  |  |
Phone | nvarchar(24) | 是 |  |  |
Fax | nvarchar(24) | 是 |  |  |
HomePage | ntext | 是 |  |  |


Territories

Column_name | 数据类型 | 可以为空 | 默认值 | 检查 | 键/索引
TerritoryID | nvarchar(20) | 否 |  |  | 非聚集主键
TerritoryDescription | nchar(50) | 否 |  |  |
RegionID | int | 否 |  |  | 外键 Region (RegionID)


NOT

对布尔型输入取反。

语法

[ NOT ] boolean_expression

参数

boolean_expression

是任何有效的 Microsoft® SQL Server™ 布尔表达式。

结果类型

Boolean

结果值

NOT 反转任何布尔表达式的值。

注释

可用 NOT 对一个表达式求反。

下面的表显示使用 NOT 运算符比较 TRUE 和 FALSE 值的结果。

 | NOT
TRUE | FALSE
FALSE | TRUE
UNKNOWN | UNKNOWN

示例

下面的示例查找所有预付款不超过 $5,500 的商业和心理学丛书。

USE pubs
GO
SELECT title_id, type, advance
FROM titles
WHERE (type = 'business' OR type = 'psychology')
   AND NOT advance > $5500
ORDER BY title_id ASC
GO

下面是结果集：

title_id type         advance
-------- ------------ ---------------------
BU1032   business     5000.0000
BU1111   business     5000.0000
BU7832   business     5000.0000
PS2091   psychology   2275.0000
PS3333   psychology   2000.0000
PS7777   psychology   4000.0000

(6 row(s) affected)

请参见

表达式

函数

运算符（逻辑运算符）

SELECT

WHERE


ntext、text 和 image

用于存储大型非 Unicode 字符、Unicode 字符及二进制数据的固定长度和可变长度数据类型。Unicode 数据使用 UNICODE UCS-2 字符集。

ntext

可变长度 Unicode 数据的最大长度为 230 - 1 (1,073,741,823) 个字符。存储大小是所输入字符个数的两倍（以字节为单位）。ntext 在 SQL-92 中的同义词是 national text。

text

服务器代码页中的可变长度非 Unicode 数据的最大长度为 231-1 (2,147,483,647) 个字符。当服务器代码页使用双字节字符时，存储量仍是 2,147,483,647 字节。存储大小可能小于 2,147,483,647 字节（取决于字符串）。

image

可变长度二进制数据介于 0 与 231-1 (2,147,483,647) 字节之间。

注释

下面的函数和语句可以与 ntext、text 或 image 数据一起使用。

函数 | 语句
DATALENGTH | READTEXT
PATINDEX | SET TEXTSIZE
SUBSTRING | UPDATETEXT
TEXTPTR | WRITETEXT
TEXTVALID |

请参见

ALTER TABLE

CAST 和 CONVERT

CREATE TABLE

数据类型转换

数据类型

DECLARE @local_variable

DELETE

INSERT

LIKE

SET @local_variable

UPDATE

使用 Unicode 数据


NULLIF

如果两个指定的表达式相等，则返回空值。

语法

NULLIF ( expression , expression )

参数

expression

常量、列名、函数、子查询或算术运算符、按位运算符以及字符串运算符的任意组合。

返回类型

返回类型与第一个 expression 相同。

如果两个表达式不相等，NULLIF 返回第一个 expression 的值。如果相等，NULLIF 返回第一个 expression 类型的空值。

注释

如果两个表达式相等且结果表达式为 NULL，NULLIF 等价于 CASE 的搜索函数。

示例

下面的示例创建 budgets 表，表中显示部门 (dept) 及其当年的预算 (current_year) 以及去年预算 (previous_year)。对于当年预算，那些同去年相比预算没有改变的部门使用 NULL，那些预算还没有确定的部门使用 0。要只计算那些接收预算的部门的预算平均值，并引用上一年度的预算值（当 current_year 为 0 时，使用 previous_year 值），请组合使用 NULLIF 和 COALESCE 函数。

USE pubs
IF EXISTS (SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES
      WHERE TABLE_NAME = 'budgets')
   DROP TABLE budgets
GO
SET NOCOUNT ON
CREATE TABLE budgets
(
   dept            tinyint   IDENTITY,
   current_year      decimal   NULL,
   previous_year   decimal   NULL
)
INSERT budgets VALUES(100000, 150000)
INSERT budgets VALUES(NULL, 300000)
INSERT budgets VALUES(0, 100000)
INSERT budgets VALUES(NULL, 150000)
INSERT budgets VALUES(300000, 250000)
GO
SET NOCOUNT OFF
SELECT AVG(NULLIF(COALESCE(current_year,
   previous_year), 0.00)) AS 'Average Budget'
FROM budgets
GO

下面是结果集：

Average Budget
----------------------------------------
212500.000000

(1 row(s) affected)

请参见

CASE

decimal 和 numeric

系统函数


numeric

有关 numeric 数据类型的更多信息，请参见 decimal 和 numeric。

请参见

数据类型转换

数据类型


OBJECT_ID

返回数据库对象标识号。

语法

OBJECT_ID ( 'object' )

参数

'object'

要使用的对象。object 的数据类型为 char 或 nchar。如果 object 的数据类型是 char，那么隐性将其转换成 nchar。

返回类型

int

注释

当该参数对系统函数可选时，则系统采用当前数据库、主机、服务器用户或数据库用户。内置函数后面必须跟圆括号。

如果指定一个临时表名，则必须在临时表名前面加上数据库名，例如：

SELECT OBJECT_ID('tempdb..#mytemptable')

系统函数可以在选择列表、WHERE 子句和任何允许使用表达式的地方使用。有关更多信息，请参见表达式和 WHERE。

示例

下面的示例为 pubs 数据库中的 authors 表返回对象 ID。

USE master
SELECT OBJECT_ID('pubs..authors')

下面是结果集：

-----------
1977058079

(1 row(s) affected)

请参见

元数据函数


OBJECT_NAME

返回数据库对象名。

语法

OBJECT_NAME ( object_id )

参数

object_id

要使用的对象的 ID。object_id 的数据类型为 int。

返回类型

nchar

注释

当该参数对系统函数可选时，则系统采用当前数据库、主机、服务器用户或数据库用户。内置函数后面必须跟圆括号。

系统函数可以在选择列表、WHERE 子句和任何允许使用表达式的地方使用。有关更多信息，请参见表达式和 WHERE。

示例

下面的示例为 pubs 数据库中的 authors 表返回 OBJECT_NAME。

USE pubs
SELECT TABLE_CATALOG, TABLE_NAME
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME = OBJECT_NAME(1977058079)

下面是结果集：

TABLE_CATALOG                  TABLE_NAME
------------------------------ --------------
pubs                           authors

(1 row(s) affected)

请参见

元数据函数


OBJECTPROPERTY

返回当前数据库中对象的有关信息。

语法

OBJECTPROPERTY ( id , property )

参数

id

一个表达式，包含当前数据库中某个对象的 ID。id 的数据类型是 int。

Property

一个表达式，包含针对由 id 指定的对象将要返回的信息。Property 可以是下面这些值中的一个。

说明 除非加以注释，否则，如果 property 是无效的属性名，则返回 NULL。

属性名称 | 对象类型 | 描述和返回的值
CnstIsClustKey | 约束 | 带有聚集索引的主键。 1 = True 0 = False
CnstIsColumn | 约束 | COLUMN 约束。 1 = True 0 = False
CnstIsDeleteCascade | 约束 | 带有 ON DELETE CASCADE 选项的外键约束。
CnstIsDisabled | 约束 | 禁用的约束。 1 = True 0 = False
CnstIsNonclustKey | 约束 | 带有非聚集索引的主键。 1 = True 0 = False
CnstIsNotTrusted | 约束 | 启用约束时未检查现有行，所以可能不是所有行都受约束的控制。 1 = True 0 = False
CnstIsNotRepl | 约束 | 使用 NOT FOR REPLICATION 关键字定义约束。
CnstIsUpdateCascade | 约束 | 带有 ON UPDATE CASCADE 选项的外键约束。
ExecIsAfterTrigger | 触发器 | AFTER 触发器。
ExecIsAnsiNullsOn | 过程、触发器、视图 | 创建时的 ANSI_NULLS 设置。 1 = True 0 = False
ExecIsDeleteTrigger | 触发器 | DELETE 触发器。 1 = True 0 = False
ExecIsFirstDeleteTrigger | 触发器 | 对表执行 DELETE 时触发的第一个触发器。
ExecIsFirstInsertTrigger | 触发器 | 对表执行 INSERT 时触发的第一个触发器。
ExecIsFirstUpdateTrigger | 触发器 | 对表执行 UPDATE 时触发的第一个触发器。
ExecIsInsertTrigger | 触发器 | INSERT 触发器。 1 = True 0 = False
ExecIsInsteadOfTrigger | 触发器 | INSTEAD OF 触发器。
ExecIsLastDeleteTrigger | 触发器 | 对表执行 DELETE 时触发的最后一个触发器。
ExecIsLastInsertTrigger | 触发器 | 对表执行 INSERT 时触发的最后一个触发器。
ExecIsLastUpdateTrigger | 触发器 | 对表执行 UPDATE 时触发的最后一个触发器。
ExecIsQuotedIdentOn | 过程、触发器、视图 | 创建时的 QUOTED_IDENTIFIER 设置。 1 = True 0 = False
ExecIsStartup | 过程 | 启动过程。 1 = True 0 = False
ExecIsTriggerDisabled | 触发器 | 禁用的触发器。 1 = True 0 = False
ExecIsUpdateTrigger | 触发器 | UPDATE 触发器。 1 = True 0 = False
HasAfterTrigger | 表，视图 | 表或视图具有 AFTER 触发器。 1 = True 0 = False
HasInsertTrigger | 表，视图 | 表或视图具有 INSERT 触发器。 1 = True 0 = False
HasInsteadOfTrigger | 表、视图 | 表或视图具有 INSTEAD OF 触发器。 1 = True 0 = False
HasUpdateTrigger | 表、视图 | 表或视图具有 UPDATE 触发器。 1 = True 0 = False
IsAnsiNullsOn | 函数、过程、表、触发器、视图 | 指定表的 ANSI NULLS 选项设置为 ON，表示所有与空值的比较都取值为 UNKNOWN。只要表存在，该设置就应用于表定义中的所有表达式，包括计算列和约束。 1 = ON 0 = OFF
IsCheckCnst | 任何 | CHECK 约束。 1 = True 0 = False
IsConstraint | 任何 | 约束。 1 = True 0 = False
IsDefault | 任何 | 绑定的默认值。 1 = True 0 = False
IsDefaultCnst | 任何 | DEFAULT 约束。 1 = True 0 = False
IsDeterministic | 函数、视图 | 函数的确定性属性。只适用于标量值及表值函数。 1 = 可确定的 0 = 不可确定的 NULL = 不是标量值或表值函数，或者是无效的对象 ID。
IsExecuted | 任何 | 指定执行该对象的方式（视图、过程或触发器）。 1 = True 0 = False
IsExtendedProc | 任何 | 扩展过程。 1 = True 0 = False
IsForeignKey | 任何 | FOREIGN KEY 约束。 1 = True 0 = False
IsIndexed | 表、视图 | 带有索引的表或视图。
IsIndexable | 表、视图 | 可以创建索引的表或视图。
IsInlineFunction | 函数 | 内嵌函数。 1 = 内嵌函数 0 = 非内嵌函数 NULL = 不是函数，或者是无效的对象 ID。
IsMSShipped | 任何 | 在安装 Microsoft® SQL Server™ 2000 的过程中创建的对象。 1 = True 0 = False
IsPrimaryKey | 任何 | PRIMARY KEY 约束。 1 = True 0 = False
IsProcedure | 任何 | 过程。 1 = True 0 = False
IsQuotedIdentOn | 函数、过程、表、触发器、视图 | 指定表的被引用标识符设置为 ON，表示在表定义所涉及的所有表达式中，双引号标记分隔标识符。 1 = ON 0 = OFF
IsReplProc | 任何 | 复制过程。 1 = True 0 = False
IsRule | 任何 | 绑定的规则。 1 = True 0 = False
IsScalarFunction | 函数 | 标量值函数。 1 = 标量值 0 = 表值 NULL = 不是函数，或者是无效的对象 ID。
IsSchemaBound | 函数，视图 | 使用 SCHEMABINDING 创建的架构绑定函数或视图。 1 = 架构绑定 0 = 非架构绑定 NULL = 不是函数或视图，或者是无效的对象 ID。
IsSystemTable | 表 | 系统表。 1 = True 0 = False
IsTable | 表 | 表。 1 = True 0 = False
IsTableFunction | 函数 | 表值函数。 1 = 表值 0 = 标量值 NULL = 不是函数，或者是无效的对象 ID。
IsTrigger | 任何 | 触发器。 1 = True 0 = False
IsUniqueCnst | 任何 | UNIQUE 约束。 1 = True 0 = False
IsUserTable | 表 | 用户定义的表。 1 = True 0 = False
IsView | 视图 | 视图。 1 = True 0 = False
OwnerId | 任何 | 对象的所有者。 Nonnull = 对象所有者的数据库用户 ID。 NULL = 无效的输入。
TableDeleteTrigger | 表 | 表有 DELETE 触发器。 >1 = 给定类型的第一个触发器的 ID。
TableDeleteTriggerCount | 表 | 表具有指定数目的 DELETE 触发器。 >1 = 给定类型的第一个触发器的 ID。 NULL = 无效的输入。
TableFullTextBackgroundUpdateIndexOn | 表 | 表已启用全文后台更新索引。 1 = True 0 = False
TableFulltextCatalogId | 表 | 表的全文索引数据所驻留的全文目录的 ID。 Nonzero = 全文目录 ID，它与标识全文索引表中行的唯一索引相关。 0 = 表不是全文索引的。
TableFullTextChangeTrackingOn | 表 | 表已启用全文更改跟踪。 1 = True 0 = False
TableFulltextKeyColumn | 表 | 与某个单列唯一索引相关联的列 ID，这个单列唯一索引参与全文索引定义。 0 = 表不是全文索引的。
TableFullTextPopulateStatus | 表 | 0 = 不填充 1 = 完全填充 2 = 增量填充
TableHasActiveFulltextIndex | 表 | 表具有一个活动的全文索引。 1 = True 0 = False
TableHasCheckCnst | 表 | 表具有 CHECK 约束。 1 = True 0 = False
TableHasClustIndex | 表 | 表具有聚集索引。 1 = True 0 = False
TableHasDefaultCnst | 表 | 表具有 DEFAULT 约束。 1 = True 0 = False
TableHasDeleteTrigger | 表 | 表具有 DELETE 触发器。 1 = True 0 = False
TableHasForeignKey | 表 | 表具有 FOREIGN KEY 约束。 1 = True 0 = False
TableHasForeignRef | 表 | 表由 FOREIGN KEY 约束引用。 1 = True 0 = False
TableHasIdentity | 表 | 表具有标识列。 1 = True 0 = False
TableHasIndex | 表 | 表具有一个任何类型的索引。 1 = True 0 = False
TableHasInsertTrigger | 表 | 对象具有 Insert 触发器。 1 = True 0 = False NULL = 无效的输入。
TableHasNonclustIndex | 表 | 表具有非聚集索引。 1 = True 0 = False
TableHasPrimaryKey | 表 | 表具有主键。 1 = True 0 = False
TableHasRowGuidCol | 表 | 对于 uniqueidentifier 列，表具有 ROWGUIDCOL。 1 = True 0 = False
TableHasTextImage | 表 | 表具有 text 列。 1 = True 0 = False
TableHasTimestamp | 表 | 表具有 timestamp 列。 1 = True 0 = False
TableHasUniqueCnst | 表 | 表具有 UNIQUE 约束。 1 = True 0 = False
TableHasUpdateTrigger | 表 | 对象具有 Update 触发器。 1 = True 0 = False
TableInsertTrigger | 表 | 表具有 INSERT 触发器。 >1 = 给定类型的第一个触发器的 ID。
TableInsertTriggerCount | 表 | 表具有指定数目的 INSERT 触发器。 >1 = 给定类型的第一个触发器的 ID。
TableIsFake | 表 | 表不是真实的。根据需要 SQL Server 对其进行内部具体化。 1 = True 0 = False
TableIsPinned | 表 | 驻留表以将其保留在数据高速缓存中。 1 = True 0 = False
TableTextInRowLimit | 表 | text in row 所允许的最大字节数，如果没有设置 text in row 选项则为 0。
TableUpdateTrigger | 表 | 表具有 UPDATE 触发器。 >1 = 给定类型的第一个触发器的 ID。
TableUpdateTriggerCount | 表 | 表具有指定数目的 UPDATE 触发器。 >1 = 给定类型的第一个触发器的 ID。

返回类型

int

注释

OBJECTPROPERTY(view_id,'IsIndexable') 可能会耗费大量的计算机资源，这是因为对 IsIndexable 属性的评估需要分析视图定义、进行规范化以及部分优化。

当至少添加了表的一列以用于索引时，OBJECTPROPERTY(table_id, 'TableHasActiveFulltextIndex') 将返回"1"(True)。只要添加了用于索引的第一列后，全文索引即可用于填充。

当除去索引中的最后一列时，索引变成非活动。

如果某些索引键需求条件得不到满足，那么实际创建索引仍然可能会失败。详细信息请参见 CREATE INDEX。

示例
A. 查明 authors 是否为一个表

下面的示例测试 authors 是否为一个表。

IF OBJECTPROPERTY ( object_id('authors'),'ISTABLE') = 1
   print 'Authors is a table'

ELSE IF OBJECTPROPERTY ( object_id('authors'),'ISTABLE') = 0
   print 'Authors is not a table'

ELSE IF OBJECTPROPERTY ( object_id('authors'),'ISTABLE') IS NULL
   print 'ERROR: Authors is not an object'
B. 确定是否在表上启用了 text in row

下面的示例测试是否在 authors 表上启用了 text in row 选项，以便 text、ntext 或 image 数据可以存储在它的数据行内。

USE pubs
SELECT OBJECTPROPERTY(OBJECT_ID('authors'),'TableTextInRowLimit')

结果集显示在表上没有启用 text in row。

-----
0
C. 确定用户定义的标量值函数是否具有确定性

下面的示例测试用户定义的标量值函数 fn_CubicVolume 是否具有确定性，该函数返回小数。

CREATE FUNCTION fn_CubicVolume
-- Input dimensions in centimeters.
   (@CubeLength decimal(4,1), @CubeWidth decimal(4,1),
   @CubeHeight decimal(4,1) )
RETURNS decimal(12,3) -- Cubic Centimeters.
WITH SCHEMABINDING
AS
BEGIN
   RETURN ( @CubeLength * @CubeWidth * @CubeHeight )
END

--Is it a deterministic function?
SELECT OBJECTPROPERTY(OBJECT_ID('fn_CubicVolume'), 'IsDeterministic')

结果集显示 fn_CubicVolume 是确定性函数。

-----
1

请参见

COLUMNPROPERTY

CREATE INDEX

元数据函数

TYPEPROPERTY


OPEN

打开 Transact-SQL 服务器游标，然后通过执行在 DECLARE CURSOR 或 SET cursor_variable 语句中指定的 Transact-SQL 语句填充游标。

语法

OPEN { { [ GLOBAL ] cursor_name } | cursor_variable_name }

参数

GLOBAL

指定 cursor_name 指的是全局游标。

cursor_name

已声明的游标的名称。如果全局游标和局部游标都使用 cursor_name 作为其名称，那么如果指定了 GLOBAL，cursor_name 指的是全局游标，否则 cursor_name 指的是局部游标。

cursor_variable_name

游标变量的名称，该名称引用一个游标。

注释

如果使用 INSENSITIVE 或 STATIC 选项声明了游标，那么 OPEN 将创建一个临时表以保留结果集。如果结果集中任意行的大小超过 Microsoft® SQL Server™ 表的最大行大小，OPEN 将失败。如果使用 KEYSET 选项声明了游标，那么 OPEN 将创建一个临时表以保留键集。临时表存储在 tempdb 中。

打开游标后，可以使用 @@CURSOR_ROWS 函数在最后一次打开的游标中接收合格行的数目。根据期望出现在结果集中的行数，SQL Server 可能会选择在一个单独的线程中异步地填充键集驱动游标。这就允许即使没有充分地填充键集，也可以立即进行提取。有关更多信息，请参见异步填充。

若要设置 SQL Server 异步生成键集时的阈值，请设置 cursor threshold 配置选项。有关更多信息，请参见 sp_configure。

示例

下面的示例打开一个游标并且提取所有的行。

DECLARE Employee_Cursor CURSOR FOR
SELECT LastName, FirstName
FROM Northwind.dbo.Employees
WHERE LastName like 'B%'

OPEN Employee_Cursor

FETCH NEXT FROM Employee_Cursor
WHILE @@FETCH_STATUS = 0
BEGIN
    FETCH NEXT FROM Employee_Cursor
END

CLOSE Employee_Cursor
DEALLOCATE Employee_Cursor

请参见

CLOSE

@@CURSOR_ROWS

DEALLOCATE

DECLARE CURSOR

FETCH


OPENDATASOURCE

不使用链接的服务器名，而提供特殊的连接信息，并将其作为四部分对象名的一部分。

语法

OPENDATASOURCE ( provider_name, init_string )

参数

provider_name

注册为用于访问数据源的 OLE DB 提供程序的 PROGID 的名称。provider_name 的数据类型为 char，没有默认值。

init_string

连接字符串，这些字符串将要传递给目标提供程序的 IDataInitialize 接口。提供程序字符串语法是以关键字值对为基础的，这些关键字值对由分号隔开，例如："keyword1=value; keyword2=value."

在 Microsoft® Data Access SDK 中定义了基本语法。有关所支持的特定关键字值对的信息，请参见提供程序中的文档。下表列出 init_string 参数中最常用的关键字。

关键字 | OLE DB 属性 | 有效值和描述
数据源 | DBPROP_INIT_DATASOURCE | 要连接的数据源的名称。不同的提供程序用不同的方法对此进行解释。对于 SQL Server OLE DB 提供程序来说，这会指明服务器的名称。对于 Jet OLE DB 提供程序来说，这会指明 .mdb 文件或 .xls 文件的完整路径。
位置 | DBPROP_INIT_LOCATION | 要连接的数据库的位置。
扩展属性 | DBPROP_INIT_PROVIDERSTRING | 提供程序特定的连接字符串。
连接超时 | DBPROP_INIT_TIMEOUT | 超时值，在该超时值后，连接尝试将失败。
用户 ID | DBPROP_AUTH_USERID | 用于该连接的用户 ID。
密码 | DBPROP_AUTH_PASSWORD | 用于该连接的密码。
目录 | DBPROP_INIT_CATALOG | 连接到数据源时的初始或默认的目录名称。

注释

OPENDATASOURCE 函数可以在能够使用链接服务器名的相同 Transact-SQL 语法位置中使用。因此，就可以将 OPENDATASOURCE 用作四部分名称的第一部分，该名称指的是 SELECT、INSERT、UPDATE 或 DELETE 语句中的表或视图的名称；或者指的是 EXECUTE 语句中的远程存储过程。当执行远程存储过程时，OPENDATASOURCE 应该指的是另一个 SQL Server。OPENDATASOURCE 不接受参数变量。

与 OPENROWSET 函数类似，OPENDATASOURCE 应该只引用那些不经常访问的 OLE DB 数据源。对于访问次数稍多的任何数据源，请为它们定义链接的服务器。无论 OPENDATASOURCE 还是 OPENROWSET 都不能提供链接的服务器定义的全部功能，例如，安全管理以及查询目录信息的能力。每次调用 OPENDATASOURCE 时，都必须提供所有的连接信息（包括密码）。

示例

下面的示例访问来自某个表的数据，该表在 SQL Server 的另一个实例中。

SELECT   *
FROM      OPENDATASOURCE(
         'SQLOLEDB',
         'Data Source=ServerName;User ID=MyUID;Password=MyPass'
         ).Northwind.dbo.Categories

下面是个查询的示例，它通过用于 Jet 的 OLE DB 提供程序查询 Excel 电子表格。

SELECT *
FROM OpenDataSource( 'Microsoft.Jet.OLEDB.4.0',
  'Data Source="c:\Finance\account.xls";User ID=Admin;Password=;Extended properties=Excel 5.0')...xactions

请参见

分布式查询

OPENROWSET

sp_addlinkedserver


OPENQUERY

在给定的链接服务器（一个 OLE DB 数据源）上执行指定的直接传递查询。可以在查询的 FROM 子句中像引用表名那样引用 OPENQUERY 函数。依据 OLE DB 提供程序的能力，还可以将 OPENQUERY 函数引用为 INSERT、UPDATE 或 DELETE 语句的目标表。尽管查询可能返回多个结果集，但是 OPENQUERY 只返回第一个。

语法

OPENQUERY ( linked_server , 'query' )

参数

linked_server

一个标识符，表示链接的服务器的名称。

'query'

在链接的服务器中执行的查询字符串。

注释

OPENQUERY 不接受参数变量。

示例

下面的示例利用用于 Oracle 的 Microsoft OLE DB 提供程序针对 Oracle 数据库创建一个名为 OracleSvr 链接的服务器。然后，该示例对此链接的服务器使用一个直接传递查询。

说明 本示例假定已经创建了一个名为 ORCLDB 的 Oracle 数据库别名。

EXEC sp_addlinkedserver 'OracleSvr',
   'Oracle 7.3',
   'MSDAORA',
   'ORCLDB'
GO
SELECT *
FROM OPENQUERY(OracleSvr, 'SELECT name, id FROM joe.titles')
GO

请参见

DELETE

分布式查询

FROM

INSERT

OPENDATASOURCE

OPENROWSET

行集函数

SELECT

sp_addlinkedserver

sp_serveroption

UPDATE

WHERE


OPENROWSET

包含访问 OLE DB 数据源中的远程数据所需的全部连接信息。当访问链接服务器中的表时，这种方法是一种替代方法，并且是一种使用 OLE DB 连接并访问远程数据的一次性的、特殊的方法。可以在查询的 FROM 子句中像引用表名那样引用 OPENROWSET 函数。依据 OLE DB 提供程序的能力，还可以将 OPENROWSET 函数引用为 INSERT、UPDATE 或 DELETE 语句的目标表。尽管查询可能返回多个结果集，然而 OPENROWSET 只返回第一个。

语法

OPENROWSET ( 'provider_name'
, { 'datasource' ; 'user_id' ; 'password'
| 'provider_string' }
, { [ catalog.] [ schema.] object
| 'query' }
)

参数

'provider_name'

字符串，它代表在注册表中指定的 OLE DB 提供程序的友好名。provider_name 没有默认值。

'datasource'

字符串常量，它对应着某个特定的 OLE DB 数据源。datasource 是将被传递到提供程序 IDBProperties 接口以初始化提供程序的 DBPROP_INIT_DATASOURCE 属性。通常，这个字符串包含数据库文件的名称、数据库服务器的名称，或者提供程序能理解的用于查找数据库的名称。

'user_id'

字符串常量，它是传递到指定 OLE DB 提供程序的用户名。user_id 为连接指定安全上下文，并将它作为 DBPROP_AUTH_USERID 属性传递进来以初始化提供程序。

'password'

字符串常量，它是将被传递到 OLE DB 提供程序的用户密码。当初始化提供程序时，将 password 作为 DBPROP_AUTH_PASSWORD 属性传递进来。

'provider_string'

提供程序特定的连接字符串，将它作为 DBPROP_INIT_PROVIDERSTRING 属性传递进来以初始化 OLE DB 提供程序。通常 provider_string 封装初始化提供程序所需的所有连接信息。

catalog

目录或数据库的名称，其中驻留着指定的对象。

schema

架构的名称或指定对象的对象所有者名称。

object

对象名称，它唯一地标识出将要操作的对象。

'query'

是字符串常量，发送到提供程序并由提供程序执行。Microsoft® SQL Server™ 不处理该查询，但处理由提供程序返回的查询结果（直接传递查询）。对于有些提供程序，它们并没有通过表名而是通过命令语言表现自己的表格格式数据，那么将直接传递查询用于这些提供程序是非常有用的。只要查询提供程序支持 OLE DB Command 对象及其强制接口，那么在远程服务器上就支持直接传递查询。有关更多信息，请参见 SQL Server OLE DB 程序员参考。

注释

如果 OLE DB 提供程序在指定的数据源中支持多个目录和架构，那么就需要目录及架构名称。如果 OLE DB 提供程序并不支持目录和架构，那么可以省略 catalog 及 schema 的值。

如果提供程序只支持架构名，那么必须指定一个两部分名称，形式为 schema.object。如果提供程序只支持目录名，那么必须指定一个三部分名称，形式为 catalog.schema.object。

OPENROWSET 不接受参数变量。

权限

OPENROWSET 权限由传递到 OLE DB 提供程序的用户名的权限确定。

示例
A. 将 OPENROWSET 与 SELECT 语句及用于 SQL Server 的 Microsoft OLE DB 提供程序一起使用

下面的示例使用用于 SQL Server 的 Microsoft OLE DB 提供程序访问 pubs 数据库中的 authors 表，该数据库在一个名为 seattle1 的远程服务器上。从 datasource、user_id 及 password 中初始化提供程序，并且使用 SELECT 语句定义返回的行集。

USE pubs
GO
SELECT a.*
FROM OPENROWSET('SQLOLEDB','seattle1';'sa';'MyPass',
   'SELECT * FROM pubs.dbo.authors ORDER BY au_lname, au_fname') AS a
GO
B. 将 OPENROWSET 与对象及用于 ODBC 的 OLE DB 提供程序一起使用

下面的示例使用用于 ODBC 的 OLE DB 提供程序以及 SQL Server ODBC 驱动程序访问 pubs 数据库中的 authors 表，该数据库在一个名为 seattle1 的远程服务器中。提供程序用在 ODBC 提供程序所用的 ODBC 语法中指定的 provider_string 进行初始化，定义返回的行集时使用 catalog.schema.object 语法。

USE pubs
GO
SELECT a.*
FROM OPENROWSET('MSDASQL',
   'DRIVER={SQL Server};SERVER=seattle1;UID=sa;PWD=MyPass',
   pubs.dbo.authors) AS a
ORDER BY a.au_lname, a.au_fname
GO
C. 使用用于 Jet 的 Microsoft OLE DB 提供程序

下面的示例通过用于 Jet 的 Microsoft OLE DB 提供程序访问 Microsoft Access Northwind 数据库中的 orders 表。

说明 下面的示例假定已经安装了 Access。

USE pubs
GO
SELECT a.*
FROM OPENROWSET('Microsoft.Jet.OLEDB.4.0',
   'c:\MSOffice\Access\Samples\northwind.mdb';'admin';'mypwd', Orders)
   AS a
GO
D. 使用 OPENROWSET 和 INNER JOIN 中的另一个表

下面的示例从本地 SQL Server Northwind 数据库的 customers 表中，以及存储在相同计算机上 Access Northwind 数据库的 orders 表中选择所有数据

说明 下面的示例假定已经安装了 Access。

USE pubs
GO
SELECT c.*, o.*
FROM Northwind.dbo.Customers AS c INNER JOIN
   OPENROWSET('Microsoft.Jet.OLEDB.4.0',
   'c:\MSOffice\Access\Samples\northwind.mdb';'admin';'mypwd', Orders)
   AS o
   ON c.CustomerID = o.CustomerID
GO

请参见

DELETE

分布式查询

FROM

INSERT

OPENDATASOURCE

OPENQUERY

行集函数

SELECT

sp_addlinkedserver

sp_serveroption

UPDATE

WHERE


OPENXML

OPENXML 通过 XML 文档提供行集视图。由于OPENXML 是行集提供程序，因此可在会出现行集提供程序（如表、视图或 OPENROWSET 函数）的 Transact-SQL 语句中使用 OPENXML。

语法

OPENXML(idoc int [in],rowpattern nvarchar[in],[flags byte[in]])
[WITH (SchemaDeclaration | TableName)]

参数

idoc

是 XML 文档的内部表式法的文档句柄。通过调用 sp_xml_preparedocument 创建 XML 文档的内部表式法。

rowpattern

是 XPath 模式，用来标识要作为行处理的节点（这些节点在 XML 文档中，该文档的句柄由 idoc 参数传递）。

flags

表示应在 XML 数据和关系行集间使用映射以及应如何填充溢出列。flag 为可选输入参数，可以是下列值之一。

字节值 | 描述
0 | 默认为以特性为中心的映射。
1 | 使用以特性为中心的映射。 在某些情况下，可以将它与 XML_ELEMENTS 组合使用。使用时首先应用以特性为中心的映射，然后对于所有仍未处理的列应用以元素为中心的映射。
2 | 使用以元素为中心的映射。 在某些情况下，可以将它与 XML_ATTRIBUTES 组合使用。使用时先应用以特性为中心的映射，然后对于所有仍未处理的列应用以元素为中心的映射。
8 | 可与 XML_ATTRIBUTES 或 XML_ELEMENTS 组合使用（逻辑 OR）。 在检索的上下文中，该标志指明不应将已消耗的数据复制到溢出属性 @mp:xmltext。

SchemaDeclaration

是窗体的架构定义：
ColName ColType [ColPattern | MetaProperty][, ColName ColType [ColPattern | MetaProperty]...]

ColName
是行集中的列名。
ColType
是行集中列的 SQL 数据类型。如果列类型不同于特性的基础 XML 数据类型，那么将发生类型压制。如果列的类型是 TIMESTAMP，则当从 OPENXML 行集中进行选择时，将忽略 XML 文档中现有的值并返回自动填充值。
ColPattern
是可选的通用 XPath 模式，它说明应如何将 XML 节点映射到列。如果没有指定 ColPattern，那么发生默认的映射（由 flags 指定的以特性为中心或以元素为中心的映射）。

指定为 ColPattern 的 XPath 模式用于指定特殊的映射性质（如果发生以特性为中心和以元素为中心的映射），这些特殊的映射性质可以重写或增强由标志所指定的默认映射。

指定为 ColPattern 的通用 XPath 模式也支持元属性。

MetaProperty
是由 OPENXML 提供的元属性之一。如果指定元属性，则该列包含元属性提供的信息。这些元属性使您得以析取 XML 节点的信息（如相对位置、命名空间信息），以提供比文本化表示法更详细的信息。

TableName

如果具有期望架构的表已经存在且不要求列模式，则为给定的表名（而不是 SchemaDeclaration）。

通过使用 SchemaDeclaration 或者指定一个现有的 TableName，WITH 子句提供一种行集格式（根据需要还提供其它映射信息）。如果没有指定可选的 WITH 子句，那么以 edge table 格式返回结果。边缘表在单个表中表示 XML 文档的细密结构（例如，元素/特性名、文档层次结构、命名空间、PI 等）。

下表描述边缘表的结构。

列名 | 数据类型 | 描述
id | bigint | 是文档节点的唯一 ID。 根元素的 ID 值为 0。保留负 ID 值。
parentid | bigint | 标识节点的父节点。此 ID 所标识的父节点不一定是父元素，而是取决于此 ID 所标识节点的子节点的 NodeType。例如，如果节点是文本节点，则其父节点可能是特性节点。 如果节点位于 XML 文档的顶层，则其 ParentID 为 NULL。
nodetype | int | 标识节点类型。是对应于 XML DOM 节点类型编号的整数（有关节点信息，请参见 DOM）。 三种节点类型是： 1 = 元素节点 2 = 特性节点 3 = 文本节点
localname | nvarchar | 给出元素或特性的本地名称。如果 DOM 对象没有名称则为 NULL。
prefix | nvarchar | 是节点名称的命名空间前缀。
namespaceuri | nvarchar | 是节点的命名空间 URI。如果值是 NULL，则命名空间不存在。
datatype | nvarchar | 是元素或特性行的实际数据类型，否则是 NULL。从内嵌 DTD 中或从内嵌架构中推断数据类型。
prev | bigint | 是前一个兄弟元素的 XML ID。如果前面没有兄弟元素则为 NULL。
text | ntext | 包含文本格式的特性值或元素内容（如果边缘表项不需要值则为 NULL）。

示例
A.使用带有 OPENXML 的 SELECT 语句。

下面的示例使用 sp_xml_preparedocument 创建 XML 图像的内部表示。然后对 XML 文档的内部表示法执行使用 OPENXML 行集提供程序的 SELECT 语句。

flag 值设置为 1，表示以特性为中心的映射。因此，XML 特性映射到行集中的列。指定为 /ROOT/Customers 的 rowpattern 标识要处理的 <Customers> 节点。

没有指定可选的 colpattern（列模式），因为列名和 XML 特性名称匹配。

OPENXML 行集提供程序创建了一个双列行集（CustomerID 和 ContactName），SELECT 语句从该行集中检索必要的列（在本例中检索所有的列）。

DECLARE @idoc int
DECLARE @doc varchar(1000)
SET @doc ='
<ROOT>
<Customer CustomerID="VINET" ContactName="Paul Henriot">
   <Order CustomerID="VINET" EmployeeID="5" OrderDate="1996-07-04T00:00:00">
      <OrderDetail OrderID="10248" ProductID="11" Quantity="12"/>
      <OrderDetail OrderID="10248" ProductID="42" Quantity="10"/>
   </Order>
</Customer>
<Customer CustomerID="LILAS" ContactName="Carlos Gonzlez">
   <Order CustomerID="LILAS" EmployeeID="3" OrderDate="1996-08-16T00:00:00">
      <OrderDetail OrderID="10283" ProductID="72" Quantity="3"/>
   </Order>
</Customer>
</ROOT>'
--Create an internal representation of the XML document.
EXEC sp_xml_preparedocument @idoc OUTPUT, @doc
-- Execute a SELECT statement that uses the OPENXML rowset provider.
SELECT    *
FROM       OPENXML (@idoc, '/ROOT/Customer',1)
            WITH (CustomerID  varchar(10),
                  ContactName varchar(20))

下面是结果集：

CustomerID ContactName
---------- --------------------
VINET      Paul Henriot
LILAS      Carlos Gonzlez

如果将 flags 设置为 2（表示以元素为中心的映射）并执行相同的 SELECT 语句，由于 <Customers> 元素没有任何子元素，则对于 XML 文档中两个 Customer 的 CustomerID 和 ContactName 的值都作为 NULL 返回。

下面是结果集：

CustomerID ContactName
---------- -----------
NULL       NULL
NULL       NULL
B. 为列和 XML 特性之间的映射指定 ColPattern

下面的查询从 XML 文档返回客户 ID、订单日期、产品 ID 和数量等特性。rowpattern 标识 <OrderDetail> 元素。ProductID 和 Quantity 是 <OrderDetails> 元素的特性。而 CustomerID 和 OrderDate 是父元素 (<Orders>) 的特性。

指定可选的 ColPattern，表示：

  • 行集中的 OrderID、CustomerID 和 OrderDate 列映射到 XML 文档中 rowpattern 所标识节点的父节点的特性。

  • 行集中的 ProdID 列映射到 ProductID 特性，而行集中的 Qty 列映射到 rowpattern 所标识节点的 Quantity 特性。

尽管以元素为中心的映射由 flag 参数指定，但 ColPattern 中指定的映射重写该映射。

declare @idoc int
declare @doc varchar(1000)
set @doc ='
<ROOT>
<Customer CustomerID="VINET" ContactName="Paul Henriot">
   <Order OrderID="10248" CustomerID="VINET" EmployeeID="5"
           OrderDate="1996-07-04T00:00:00">
      <OrderDetail ProductID="11" Quantity="12"/>
      <OrderDetail ProductID="42" Quantity="10"/>
   </Order>
</Customer>
<Customer CustomerID="LILAS" ContactName="Carlos Gonzlez">
   <Order OrderID="10283" CustomerID="LILAS" EmployeeID="3"
           OrderDate="1996-08-16T00:00:00">
      <OrderDetail ProductID="72" Quantity="3"/>
   </Order>
</Customer>
</ROOT>'
--Create an internal representation of the XML document.
exec sp_xml_preparedocument @idoc OUTPUT, @doc
-- SELECT stmt using OPENXML rowset provider
SELECT *
FROM   OPENXML (@idoc, '/ROOT/Customer/Order/OrderDetail',2)
         WITH (OrderID       int         '../@OrderID',
               CustomerID  varchar(10) '../@CustomerID',
               OrderDate   datetime    '../@OrderDate',
               ProdID      int         '@ProductID',
               Qty         int         '@Quantity')

结果如下：

OrderID CustomerID OrderDate ProdID Qty

------------------------------------------------------------------------

10248      VINET       1996-07-04 00:00:00.000   11      12
10248      VINET       1996-07-04 00:00:00.000   42      10
10283      LILAS       1996-08-16 00:00:00.000   72      3
C. 获得边缘表格式的结果

在下例中，在 OPENXML 语句中未指定 WITH 子句。因此，OPENXML 所生成的行集具有边缘表格式。SELECT 语句返回边缘表中的所有列。

下例中的示例 XML 文档由 <Customer>、<Order> 和 <Order_0020_Details> 元素组成。

首先调用 sp_xml_preparedocument 以获得文档句柄。此文档句柄传递到 OPENXML。

在 OPENXML 语句中

  • rowpattern (/ROOT/Customer) 标识要处理的 <Customer> 节点。

  • 未提供 WITH 子句。因此 OPENXML 以边缘表格式返回行集。

最后 SELECT 语句检索边缘表中的所有列。

declare @idoc int
declare @doc varchar(1000)
set @doc ='
<ROOT>
<Customers CustomerID="VINET" ContactName="Paul Henriot">
   <Orders CustomerID="VINET" EmployeeID="5" OrderDate=
           "1996-07-04T00:00:00">
      <Order_x0020_Details OrderID="10248" ProductID="11" Quantity="12"/>
      <Order_x0020_Details OrderID="10248" ProductID="42" Quantity="10"/>
   </Orders>
</Customers>
<Customers CustomerID="LILAS" ContactName="Carlos Gonzlez">
   <Orders CustomerID="LILAS" EmployeeID="3" OrderDate=
           "1996-08-16T00:00:00">
      <Order_x0020_Details OrderID="10283" ProductID="72" Quantity="3"/>
   </Orders>
</Customers>
</ROOT>'
--Create an internal representation of the XML document.
exec sp_xml_preparedocument @idoc OUTPUT, @doc
-- SELECT statement using OPENXML rowset provider
SELECT    *
FROM       OPENXML (@idoc, '/ROOT/Customers')
EXEC sp_xml_removedocument @idoc

结果作为边缘表返回。

请参见

使用 OPENXML


OPTION 子句

指定应在整个查询中使用所指定的查询提示。每个查询提示只能指定一次，但允许指定多个查询提示。用该语句只可能指定一个 OPTION 子句。查询提示影响语句中的所有运算符。如果主查询中涉及 UNION，则只有涉及 UNION 运算符的最后一个查询可以有 OPTION 子句。如果一个或多个查询提示导致查询优化器不生成有效计划，则产生 8622 号错误。

注意 查询优化器通常为查询选择最佳执行计划，因此建议有经验的数据库管理员将 <join_hint>、<query_hint> 和 <table_hint> 仅作为最后的手段。

语法

[ OPTION ( < query_hint > [ ,...n ) ]

< query_hint > ::=
{ { HASH | ORDER } GROUP
    | { CONCAT | HASH | MERGE } UNION
| {LOOP | MERGE | HASH } JOIN
| FAST number_rows
 | FORCE ORDER
| MAXDOP number
| ROBUST PLAN
| KEEP PLAN
| KEEPFIXED PLAN
| EXPAND VIEWS
    }

参数

{ HASH | ORDER } GROUP

指定在 GROUP BY、DISTINCT 或 COMPUTE 查询子句中所描述的聚合应使用哈希操作或排列。

{ MERGE | HASH | CONCAT } UNION

指定由合并、哈希或串联 UNION 集合执行所有 UNION 运算。如果指定了不止一个 UNION 提示，查询优化器就会从这些指定的提示中选择开销最少的策略。

{ LOOP | MERGE | HASH } JOIN

指定在整个查询中所有的联接操作由循环联接、合并联接或哈希联接来完成。如果指定了多个联接提示，则优化器从允许的联接策略中选择最便宜的联接策略。

如果在同一个查询中，还为一对特定的表指定了联接提示，则虽然仍须遵守查询提示，但该联接提示将优先联接这两个表。因此，为这对表指定的联接提示可能只限制选择查询提示中允许的联接方法。有关详细信息，请参见提示。

FAST number_rows

指定对查询进行优化，以便快速检索第一个 number_rows（非负整数）。在第一个 number_rows 返回后，查询继续进行并生成完整的结果集。

FORCE ORDER

指定在查询优化过程中保持由查询语法表示的联接顺序。

MAXDOP number

只对指定了 sp_configure 的 max degree of parallelism 配置选项的查询替代该选项。当使用 MAXDOP 查询提示时，所有和 max degree of parallelism 配置选项一起使用的语义规则均适用。有关更多信息，请参见 max degree of parallelism 选项。

ROBUST PLAN

强制查询优化器以性能为代价，使用对最大可能的行大小有效的计划。处理查询时，中间级表和运算符可能需要存储和处理比输入行宽的行。在有些情况下，行可能很宽，以致某个运算符无法处理行。如果发生这种情况，SQL Server 将在查询执行过程中生成错误。通过使用 ROBUST PLAN，可以指示查询优化器不考虑可能会遇到该问题的查询计划。

KEEP PLAN

强制查询优化器对查询放宽估计的重新编译阈值。估计的重新编译阈值是一个点，基于该点当对表的索引列更改（更新、删除或插入）达到估计的数字时自动重新编译查询。指定 KEEP PLAN 将确保当表有多个更新时不会频繁地对查询进行重新编译。

KEEPFIXED PLAN

强制查询优化器不因统计中的更改或索引列（更新、删除或插入）而重新编译查询。指定 KEEPFIXED PLAN 将确保仅当更改基础表的架构或在那些表上执行 sp_recompile 时才重新编译查询。

EXPAND VIEWS

指定展开索引视图，而且查询优化器不将任何索引视图看作是查询中任何部分的替代。（当视图名称由查询文本中的视图定义替换时，视图将展开。）实际上，该查询提示不允许在查询计划中直接使用索引视图和直接在索引视图上使用索引。

只有在查询的 SELECT 部分中直接引用视图，而且指定 WITH (NOEXPAND) 或 WITH（NOEXPAND、INDEX( index_val [ ,...n ] )），才会展开索引视图。有关查询提示 WITH (NOEXPAND) 的更多信息，请参见 FROM。

只有语句的 SELECT 部分的视图（包括 INSERT、UPDATE 和 DELETE 语句中的视图）才受提示影响。

注释

SELECT 语句中的子句顺序非常重要。可以省略可选子句，但这些子句在使用时必须按适当的顺序出现。

只有当这些语句的选择列表包含给函数的局域变量赋值的表达式时，在用户定义的函数中才允许有 SELECT 语句。

在 table 变量的作用域内，可以像访问常规表那样访问 table 变量，因此可以在 SELECT 语句内将 table 变量作为表源使用。

对于由四部分组成的名称，若其中的服务器名称使用的是 OPENDATASOURCE 函数，则该名称可以在表名能够在 SELECT 语句内出现的任何位置作为表源使用。

对涉及远程表的 SELECT 语句有一些语法限制。有关更多信息，请参见外部数据和 Transact-SQL。

选择列表内包含的text 或 ntext 列的返回长度默认为最小的 text 实际大小、默认的 TEXTSIZE 会话设置或硬编码应用程序限制。若要更改会话的返回文本长度，请使用 SET 语句。默认情况下，用 SELECT 语句返回的文本数据的长度限制是 4,000 字节。

如果发生下列两种情况中的一种，SQL Server 将生成编号为 511 的异常错误并回滚当前执行的语句：

  • SELECT 语句生成超过 8,060 字节的结果行或中间级工作表。

  • 试图对超过 8,060 字节的行执行 DELETE、INSERT 或 UPDATE 语句。

在 SQL Server 中，如果没有为 SELECT INTO 或 CREATE VIEW 语句创建的列提供列名，将会发生错误。

选择标识列

将现有标识列选入新表时，新列将继承 IDENTITY 属性，除非下列条件中的一个为真：

  • SELECT 语句包含联接、GROUP BY 子句或聚合函数。

  • 多个 SELECT 语句由 UNION 联接。

  • 标识列在选择列表内多次列出。

  • 标识列是表达式的一部分。

如果这些条件中的一个为真，列将被创建为 NOT NULL 而不继承 IDENTITY 属性。所有用于标识列的规则和限制均适用于新表。

旧式外联接

SQL Server 的早期版本支持在 WHERE 子句中使用 *= 和 =* 运算符定义外联接。SQL Server 7.0 版支持 SQL-92 标准，该标准在 FROM 子句中提供联接运算符。建议使用 SQL-92 语法重新编写查询。

WHERE、GROUP BY 和 HAVING 子句的处理顺序

下表显示带 WHERE 子句、GROUP BY 子句和 HAVING 子句的 SELECT 语句的处理顺序：

  1. WHERE 子句排除不满足搜索条件的行。

  2. GROUP BY 子句将选定的行收集到 GROUP BY 子句中各唯一值的组中。

  3. 在选择列表中指定的聚合函数计算各组的汇总值。

  4. HAVING 子句进一步排除不满足搜索条件的行。
权限

SELECT 权限默认授予 sysadmin 固定服务器角色成员、db_owner 和 db_datareader 固定数据库角色的成员以及表的所有者。sysadmin、db_owner 和 db_securityadmin 角色的成员和表所有者可以将权限转让给其他用户。

如果用 INTO 子句创建永久表，用户必须在目的数据库中具有 CREATE TABLE 权限。

请参见

CONTAINS

CONTAINSTABLE

CREATE TRIGGER

CREATE VIEW

DELETE

EXECUTE

表达式

FREETEXT

FREETEXTTABLE

对 SQL Server 数据进行全文查询

INSERT

联接基础知识

SET TRANSACTION ISOLATION LEVEL

sp_dboption

子查询基础知识

table

UNION

UPDATE

使用变量和参数

WHERE


OR

将两个条件结合起来。当在一个语句中使用多个逻辑运算符时，在 AND 运算符之后求 OR 运算符的值。但是，通过使用括号可以更改求值的顺序。

语法

boolean_expression OR boolean_expression

参数

boolean_expression

是任何返回 TRUE、FALSE 或 UNKNOWN 的有效 Microsoft® SQL Server™ 表达式。

结果类型

Boolean

结果值

当两个条件中的任何一个为 TRUE 时，OR 返回 TRUE。

注释

下表显示 OR 运算符的结果。

 | TRUE | FALSE | UNKNOWN
TRUE | TRUE | TRUE | TRUE
FALSE | TRUE | FALSE | UNKNOWN
UNKNOWN | TRUE | UNKNOWN | UNKNOWN

示例

下面的示例检索某些书名，这些书具有大于 $5,500 的预付款，并且这些书籍是商业书籍或心理学书籍。如果没有括号，那么 WHERE 子句就会检索预付款超过 $5,500 的所有商业书籍或者心理学书籍。

USE pubs
GO
SELECT SUBSTRING(title, 1, 30) AS Title, type
FROM titles
WHERE (type = 'business' OR type = 'psychology') AND
   advance > $5500
ORDER BY title
GO

下面是结果集：

Title                          type
------------------------------ ------------
Computer Phobic AND Non-Phobic psychology
Life Without Fear              psychology
You Can Combat Computer Stress business

(3 row(s) affected)

请参见

表达式

函数

运算符（逻辑运算符）

SELECT

WHERE


ORDER BY

指定在 SELECT 语句返回的列中所使用的排序次序。有关更多信息，请参见 SELECT。


ORDER BY 子句

指定结果集的排序。除非同时指定了 TOP，否则 ORDER BY 子句在视图、内嵌函数、派生表和子查询中无效。

语法

[ ORDER BY { order_by_expression [ ASC | DESC ] } [ ,...n ] ]

参数

order_by_expression

指定要排序的列。可以将排序列指定为列名或列的别名（可由表名或视图名限定）和表达式，或者指定为代表选择列表内的名称、别名或表达式的位置的负整数。

可指定多个排序列。ORDER BY 子句中的排序列序列定义排序结果集的结构。

ORDER BY 子句可包括未出现在此选择列表中的项目。然而，如果指定 SELECT DISTINCT，或者如果 SELECT 语句包含 UNION 运算符，则排序列必定出现在选择列表中。

此外，当 SELECT 语句包含 UNION 运算符时，列名或列的别名必须是在第一选择列表内指定的列名或列的别名。

说明 在 ORDER BY 子句中不能使用 ntext、text 和 image 列。

ASC

指定按递增顺序，从最低值到最高值对指定列中的值进行排序。

DESC

指定按递减顺序，从最高值到最低值对指定列中的值进行排序。

空值被视为最低的可能值。

对 ORDER BY 子句中的项目数没有限制。然而，对于排序操作所需的中间级工作表的大小有 8,060 字节的限制。这限制了在 ORDER BY 子句中指定的列的合计大小。


PARSENAME

返回对象名的指定部分。可以检索的对象部分有对象名、所有者名称、数据库名称和服务器名称。

说明 PARSENAME 函数不表明所指定名称的对象是否存在，而只是返回给定对象名的指定部分。

语法

PARSENAME ( 'object_name' , object_piece )

参数

'object_name'

要检索其指定部分的对象名。object_name 是 sysname 值。本参数是可选的合法对象名。如果该对象名的所有部分均符合要求，则该名称由以下四部分组成：服务器名称、数据库名称、所有者名称和对象名。

object_piece

要返回的对象部分。object_piece 是 int 值，可以为下列值。

Value | 描述
1 | 对象名
2 | 所有者名称
3 | 数据库名称
4 | 服务器名称

返回类型

nchar

注释

如果符合下列条件之一，则 PARSENAME 返回 NULL 值：

  • object_name 或 object_piece 为 NULL 值。

  • 发生语法错误。

  • 所请求的对象部分长度为 0，并且是无效的 Microsoft® SQL Server™ 标识符。零长度的对象名将导致整个合法名称无效。
示例

本示例使用 PARSENAME 返回有关 pubs 数据库中 authors 表的信息。

USE pubs
SELECT PARSENAME('pubs..authors', 1) AS 'Object Name'
SELECT PARSENAME('pubs..authors', 2) AS 'Owner Name'
SELECT PARSENAME('pubs..authors', 3) AS 'Database Name'
SELECT PARSENAME('pubs..authors', 4) AS 'Server Name'

下面是结果集：

Object Name
------------------------------
authors

(1 row(s) affected)

Owner Name
------------------------------
(null)

(1 row(s) affected)

Database Name
------------------------------
pubs

(1 row(s) affected)

Server Name
------------------------------
(null)

(1 row(s) affected)

请参见

ALTER TABLE

CREATE TABLE

系统函数


PATINDEX

返回指定表达式中某模式第一次出现的起始位置；如果在全部有效的文本和字符数据类型中没有找到该模式，则返回零。

语法

PATINDEX ( '%pattern%' , expression )

参数

pattern

一个字符串。可以使用通配符，但 pattern 之前和之后必须有 % 字符（搜索第一个和最后一个字符时除外）。pattern 是短字符数据类型类别的表达式。

expression

一个表达式，通常为要在其中搜索指定模式的列，expression 为字符串数据类型类别。

返回类型

int

注释

PATINDEX 对 text 数据类型很有用；除 IS NULL、IS NOT NULL 和 LIKE（这些是 WHERE 子句中对 text 类型有效的仅有的其它比较运算）外，PATINDEX 也可用于 WHERE 子句中。

如果 pattern 或 expression 为 NULL，则当数据库的兼容级别为 70 时 PATINDEX 返回 NULL；如果数据库兼容级别为 65 或更靠前，则仅当 pattern 和 expression 同时为 NULL 时，PATINDEX 返回 NULL。

示例
A. 在 PATINDEX 中使用模式

本示例查找模式"wonderful"在 titles 表中 notes 列的某一特定行中的开始位置。

USE pubs
GO
SELECT PATINDEX('%wonderful%', notes)
FROM titles
WHERE title_id = 'TC3218'
GO

下面是结果集：

-----------
46

(1 row(s) affected)

如果未通过 WHERE 子句限制要搜索的行，查询将返回表中的所有行，对在其中找到该模式的所有行报告非零值，对在其中未找到该模式的所有行报告零值。

B. 在 PATINDEX 中使用通配符

本示例使用通配符查找模式"won_erful"在 titles 表中 notes 列的某一特定行中的开始位置，其中下划线为代表任何字符的通配符。

USE pubs
GO
SELECT PATINDEX('%won_erful%', notes)
FROM titles
WHERE title_id = 'TC3218'
GO

下面是结果集：

------------
46

(1 row(s) affected)

如果没有限制要搜索的行，查询将返回表中的所有行，对在其中找到该模式的所有行报告非零值。

请参见

数据类型

字符串函数


PERMISSIONS

返回一个包含位图的值，表明当前用户的语句、对象或列权限。

语法

PERMISSIONS ( [ objectid [ , 'column' ] ] )

参数

objectid

对象的 ID。如果未指定 objectid，则位图值包含当前用户的语法权限；否则，位图包含当前用户在该对象 ID 上的对象权限。指定的对象必须在当前数据库中。将 OBJECT_ID 函数用于对象名以确定 objectid 值。

column

返回其权限信息的列的可选名。该列必须是 objectid 所指定表中的有效列名。

返回类型

int

注释

可使用 PERMISSIONS 确定当前用户是否有执行某个语句所需的权限，或者是否有将某个对象上的权限授予另一用户所需的权限。

所返回的权限信息是 32 位位图。

低 16 位反映对当前用户的安全帐户所授予的权限，以及应用于当前用户所在的 Microsoft® Windows NT® 组或 Microsoft SQL Server™ 角色的权限。例如，当没有指定 objectid 时，将返回值 66（十六进制值 0x42），表示当前用户有执行 CREATE TABLE（十进制值 2）和 BACKUP DATABASE（十进制值 64）语句的权限。

高 16 位反映当前用户可以授予其他用户的权限。除左移 16 位（与 65536 相乘）之外，高 16 位的解释方式与下表中所介绍的低 16 位的解释方式完全相同。例如，位 0x8（十进制值 8）说明当指定 objectid 时的 INSERT 权限。而 0x80000（十进制值 524288）说明 GRANT INSERT 权限的能力，这是因为 524288 = 8 x 65536。由于角色中的成员资格，该用户可能没有执行语句的权限，但仍然能够将该权限授予他人。

下表显示语句权限所使用的位（未指定 objectid）。

位（十进制） | 位（十六进制） | 语句权限
1 | 0x1 | CREATE DATABASE（仅限于 master 数据库）
2 | 0x2 | CREATE TABLE
4 | 0x4 | CREATE PROCEDURE
8 | 0x8 | CREATE VIEW
16 | 0x10 | CREATE RULE
32 | 0x20 | CREATE DEFAULT
64 | 0x40 | BACKUP DATABASE
128 | 0x80 | BACKUP LOG
256 | 0x100 | 保留

下表显示当仅指定 objectid 时，返回的对象权限所使用的位。

位（十进制） | 位（十六进制） | 语句权限
1 | 0x1 | SELECT ALL
2 | 0x2 | UPDATE ALL
4 | 0x4 | REFERENCES ALL
8 | 0x8 | INSERT
16 | 0x10 | DELETE
32 | 0x20 | EXECUTE（仅限于过程）
4096 | 0x1000 | SELECT ANY（至少一列）
8192 | 0x2000 | UPDATE ANY
16384 | 0x4000 | REFERENCES ANY

下表显示当同时指定 objectid 和 column 时，返回的列级对象权限所使用的位。

位（十进制） | 位（十六进制） | 语句权限
1 | 0x1 | SELECT
2 | 0x2 | UPDATE
4 | 0x4 | REFERENCES

如果指定的参数为 NULL 值或无效（例如，objectid 或 column 不存在），则返回 NULL 值。没有定义不适用的权限所使用的位值（例如，表的 EXECUTE 权限、位 0x20）。

使用按位 AND (&) 运算符确定 PERMISSIONS 函数返回的位图中的每个位集。

还可使用 sp_helprotect 系统存储过程返回某位用户在当前数据库中的对象权限列表。

示例
A. 对语句权限使用 PERMISSIONS 函数

本示例确定当前用户是否能够执行 CREATE TABLE 语句。

IF PERMISSIONS()&2=2
   CREATE TABLE test_table (col1 INT)
ELSE
   PRINT 'ERROR: The current user cannot create a table.'
B. 对对象权限使用 PERMISSIONS 函数

本示例确定当前用户是否能够在 authors 表中插入数据行。

IF PERMISSIONS(OBJECT_ID('authors'))&8=8
   PRINT 'The current user can insert data into authors.'
ELSE
   PRINT 'ERROR: The current user cannot insert data into authors.'
C. 对可授予的权限使用 PERMISSIONS 函数

本示例确定当前用户是否能够将 authors 表中的 INSERT 权限授予另一用户。

IF PERMISSIONS(OBJECT_ID('authors'))&0x80000=0x80000
   PRINT 'INSERT on authors is grantable.'
ELSE
   PRINT 'You may not GRANT INSERT permissions on authors.'

请参见

DENY

GRANT

OBJECT_ID

REVOKE

sp_helprotect

系统函数


PI

返回 PI 的常量值。

语法

PI ( )

返回类型

float

示例

本示例返回 PI 值。

SELECT PI()
GO

下面是结果集：

------------------------
3.14159265358979

(1 row(s) affected)

请参见

数学函数


POWER

返回给定表达式乘指定次方的值。

语法

POWER ( numeric_expression , y )

参数

numeric_expression

是精确数字或近似数字数据类型类别的表达式（bit 数据类型除外）。

y

numeric_expression 的次方。y 可以是精确数字或近似数字数据类型类别的表达式（bit 数据类型除外）。

返回类型

与 numeric_expression 相同。

示例
A. 使用 POWER 显示结果 0.0

本示例显示返回结果 0.0 的浮点下溢。

SELECT POWER(2.0, -100.0)
GO

下面是结果集：

------------------------------------------
0.0

(1 row(s) affected)
B. 使用 POWER

本示例显示 21 到 24 的 POWER 结果。

DECLARE @value int, @counter int
SET @value = 2
SET @counter = 1

WHILE @counter < 5
   BEGIN
      SELECT POWER(@value, @counter)
      SET NOCOUNT ON
      SET @counter = @counter + 1
      SET NOCOUNT OFF
   END
GO

下面是结果集：

-----------
2

(1 row(s) affected)

-----------
4

(1 row(s) affected)

-----------
8

(1 row(s) affected)

-----------
16

(1 row(s) affected)

请参见

decimal 和 numeric

float 和 real

int、smallint 和 tinyint

数学函数

money 和 smallmoney


Predicate

取值为 TRUE、FALSE 或 UNKNOWN 的表达式。Predicate 用于 WHERE 子句和 HAVING 子句的搜索条件中，以及 FROM 子句的联接条件中。

请参见

BETWEEN

CONTAINS

EXISTS

FREETEXT

IN

IS [NOT] NULL

LIKE

搜索条件


PRINT

将用户定义的消息返回客户端。

语法

PRINT 'any ASCII text' | @local_variable | @@FUNCTION | string_expr

参数

'any ASCII text'

一个文本字符串。

@local_variable

任意有效的字符数据类型变量。@local_variable 必须是 char 或 varchar，或者能够隐式转换为这些数据类型。

@@FUNCTION

是返回字符串结果的函数。@@FUNCTION 必须是 char 或 varchar，或者能够隐式转换为这些数据类型。

string_expr

是返回字符串的表达式。可包含串联的字面值和变量。消息字符串最长可达 8,000 个字符，超过 8,000 个的任何字符均被截断。

注释

若要打印用户定义的错误信息（该消息中包含可由 @@ERROR 返回的错误号），请使用 RAISERROR 而不要使用 PRINT。

示例
A. 有条件地执行打印 (IF EXISTS)

本示例使用 PRINT 语句有条件地返回消息。

IF EXISTS (SELECT zip FROM authors WHERE zip = '94705')
   PRINT 'Berkeley author'
B. 生成并显示字符串

本示例将 GETDATE 函数的结果转换为 varchar 数据类型，并将其与 PRINT 要返回的文本进行串联。

PRINT 'This message was printed on ' +
   RTRIM(CONVERT(varchar(30), GETDATE())) + '.'

请参见

数据类型

DECLARE @local_variable

函数

RAISERROR


pubs 示例数据库

pubs 示例数据库以一个图书出版公司为模型，用于演示 Microsoft® SQL Server™ 数据库中可用的许多选项。该数据库及其中的表经常在文档内容所介绍的示例中使用。

如果更改了 pubs 数据库，可以使用 SQL Server 安装中 Install 目录下的文件重新进行安装。安装过程需要两步：

  1. 从命令提示行使用 osql 实用工具运行 Instpubs.sql 脚本。本操作将除去现有的 pubs 数据库，创建新的 pubs 数据库并定义其中的所有对象。

  2. 从命令提示行运行 Pubimage.bat。本操作将在 pub_info 表中插入 image 值。


authors

Column_name | 数据类型 | 可为空 | 默认值 | 检查 | 键/索引
au_id | id | 否 |  | 是1 | 聚集主键
au_lname | varchar(40) | 否 |  |  | 组合，非聚集。 3
au_fname | varchar(20) | 否 |  |  | 组合，非聚集。 3
phone | char(12) | 否 | 'Unknown' |  |
address | varchar(40) | 是 |  |  |
city | varchar(20) | 是 |  |  |
state | char(2) | 是 |  |  |
zip | char(5) | 是 |  | 是2 |
contract | bit | 否 |  |  |

1 au_id CHECK 约束定义为 (au_id LIKE '[0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9][0-9][0-9]')。
2 zip CHECK 约束定义为 (zip LIKE '[0-9][0-9][0-9][0-9][0-9]')。
3 组合非聚集索引定义在 au_lname 和 au_fname 上。

这些表显示 authors 表中的内容。第一列 (au_id) 在第二个表中重复出现，第二个表中还包括第 5 列到第 9 列。

au_id (1) | au_lname (2) | au_fname (3) | phone (4)
172-32-1176 | White | Johnson | 408 496-7223
213-46-8915 | Green | Marjorie | 415 986-7020
238-95-7766 | Carson | Cheryl | 415 548-7723
267-41-2394 | O'Leary | Michael | 408 286-2428
274-80-9391 | Straight | Dean | 415 834-2919
341-22-1782 | Smith | Meander | 913 843-0462
409-56-7008 | Bennet | Abraham | 415 658-9932
427-17-2319 | Dull | Ann | 415 836-7128
472-27-2349 | Gringlesby | Burt | 707 938-6445
486-29-1786 | Locksley | Charlene | 415 585-4620
527-72-3246 | Greene | Morningstar | 615 297-2723
648-92-1872 | Blotchet-Halls | Reginald | 503 745-6402
672-71-3249 | Yokomoto | Akiko | 415 935-4228
712-45-1867 | del Castillo | Innes | 615 996-8275
722-51-5454 | DeFrance | Michel | 219 547-9982
724-08-9931 | Stringer | Dirk | 415 843-2991
724-80-9391 | MacFeather | Stearns | 415 354-7128
756-30-7391 | Karsen | Livia | 415 534-9219
807-91-6654 | Panteley | Sylvia | 301 946-8853
846-92-7186 | Hunter | Sheryl | 415 836-7128
893-72-1158 | McBadden | Heather | 707 448-4982
899-46-2035 | Ringer | Anne | 801 826-0752
998-72-3567 | Ringer | Albert | 801 826-0752

au_id (1) | address (5) | city (6) | state (7) | zip (8) | contract (9)
172-32-1176 | 10932 Bigge Rd. | Menlo Park | CA | 94025 | 1
213-46-8915 | 309 63rd St. #411 | Oakland | CA | 94618 | 1
238-95-7766 | 589 Darwin Ln. | Berkeley | CA | 94705 | 1
267-41-2394 | 22 Cleveland Av. #14 | San Jose | CA | 95128 | 1
274-80-9391 | 5420 College Av. | Oakland | CA | 94609 | 1
341-22-1782 | 10 Mississippi Dr. | Lawrence | KS | 66044 | 0
409-56-7008 | 6223 Bateman St. | Berkeley | CA | 94705 | 1
427-17-2319 | 3410 Blonde St. | Palo Alto | CA | 94301 | 1
472-27-2349 | PO Box 792 | Covelo | CA | 95428 | 1
486-29-1786 | 18 Broadway Av. | San Francisco | CA | 94130 | 1
527-72-3246 | 22 Graybar House Rd. | Nashville | TN | 37215 | 0
648-92-1872 | 55 Hillsdale Bl. | Corvallis | OR | 97330 | 1
672-71-3249 | 3 Silver Ct. | Walnut Creek | CA | 94595 | 1
712-45-1867 | 2286 Cram Pl. #86 | Ann Arbor | MI | 48105 | 1
722-51-5454 | 3 Balding Pl. | Gary | IN | 46403 | 1
724-08-9931 | 5420 Telegraph Av. | Oakland | CA | 94609 | 0
724-80-9391 | 44 Upland Hts. | Oakland | CA | 94612 | 1
756-30-7391 | 5720 McAuley St. | Oakland | CA | 94609 | 1
807-91-6654 | 1956 Arlington Pl. | Rockville | MD | 20853 | 1
846-92-7186 | 3410 Blonde St. | Palo Alto | CA | 94301 | 1
893-72-1158 | 301 Putnam | Vacaville | CA | 95688 | 0
899-46-2035 | 67 Seventh Av. | Salt Lake City | UT | 84152 | 1
998-72-3567 | 67 Seventh Av. | Salt Lake City | UT | 84152 | 1


discounts

Column_name | 数据类型 | 可为空 | 默认值 | 检查 | 键/索引
discounttype | varchar(40) | 否 |  |  |
stor_id | char(4) | 是 |  |  | 外键 stores(stor_id)
lowqty | smallint | 是 |  |  |
highqty | smallint | 是 |  |  |
discount | float | 否 |  |  |

discounttype | stor_id | lowqty | highqty | discount
Initial Customer | NULL | NULL | NULL | 10.5
Volume Discount | NULL | 100 | 1000 | 6.7
Customer Discount | 8042 | NULL | NULL | 5.0


employee

Column_name | 数据类型 | 可为空 | 默认值 | 检查 | 键/索引
emp_id | empid | 否 |  | 是1 | 主键，非聚集。
fname | varchar(20) | 否 |  |  | 组合，聚集。 2
minit | char(1) | 是 |  |  | 组合，聚集。 2
lname | varchar(30) | 否 |  |  | 组合，聚集。 2
job_id | smallint | 否 | 1 |  | 外键 jobs(job_id)
job_lvl | tinyint | 否 | 10 |  |
pub_id | char(4) | 否 | '9952' |  | 外键 publishers(pub_id)
hire_date | datetime | 否 | GETDATE( ) |  |

1 CHECK 约束定义为 (emp_id LIKE '[A-Z][A-Z][A-Z][1-9][0-9][0-9][0-9][0-9][FM]') OR
(emp_id LIKE '[A-Z]-[A-Z][1-9][0-9][0-9][0-9][0-9][FM]')。
2 组合聚集索引定义在 lname、fname 和 minit 上。

这些表显示 employee 表的内容。第一列 (emp_id) 在第二张表中重复出现，第二个表中还包括第 6 列到第 8 列。

emp_id (1) | fname (2) | minit (3) | lname (4) | job_id (5)
PMA42628M | Paolo | M | Accorti | 13
PSA89086M | Pedro | S | Alfonso | 14
VPA30890F | Victoria | P | Ashworth | 6
H-B39728F | Helen | NULL | Bennett | 12
L-B31947F | Lesley | NULL | Brown | 7
F-C16315M | Francisco | NULL | Chang | 4
PTC11962M | Philip | T | Cramer | 2
A-C71970F | Aria | NULL | Cruz | 10
AMD15433F | Ann | M | Devon | 3
ARD36773F | Anabela | R | Domingues | 8
PHF38899M | Peter | H | Franken | 10
PXH22250M | Paul | X | Henriot | 5
CFH28514M | Carlos | F | Hernández | 5
PDI47470M | Palle | D | Ibsen | 7
KJJ92907F | Karla | J | Jablonski | 9
KFJ64308F | Karin | F | Josephs | 14
MGK44605M | Matti | G | Karttunen | 6
POK93028M | Pirkko | O | Koskitalo | 10
JYL26161F | Janine | 是 | Labrune | 5
M-L67958F | Maria | NULL | Larsson | 7
Y-L77953M | Yoshi | NULL | Latimer | 12
LAL21447M | Laurence | A | Lebihan | 5
ENL44273F | Elizabeth | 否 | Lincoln | 14
PCM98509F | Patricia | C | McKenna | 11
R-M53550M | Roland | NULL | Mendel | 11
RBM23061F | Rita | B | Müller | 5
HAN90777M | Helvetius | A | Nagy | 7
TPO55093M | Timothy | P | O'Rourke | 13
SKO22412M | Sven | K | Ottlieb | 5
MAP77183M | Miguel | A | Paolino | 11
PSP68661F | Paula | S | Parente | 8
M-P91209M | Manuel | NULL | Pereira | 8
MJP25939M | Maria | J | Pontes | 5
M-R38834F | Martine | NULL | Rancé | 9
DWR65030M | Diego | W | Roel | 6
A-R89858F | Annette | NULL | Roulet | 6
MMS49649F | Mary | M | Saveley | 8
CGS88322F | Carine | G | Schmitt | 13
MAS70474F | Margaret | A | Smith | 9
HAS54740M | Howard | A | Snyder | 12
MFS52347M | Martín | F | Sommer | 10
GHT50241M | Gary | H | Thomas | 9
DBT39435M | Daniel | B | Tonini | 11

emp_id (1) | job_lvl (6) | pub_id (7) | hire_date (8)
PMA42628M | 35 | 0877 | Aug 27 1992 12:00AM
PSA89086M | 89 | 1389 | Dec 24 1990 12:00AM
VPA30890F | 140 | 0877 | Sep 13 1990 12:00AM
H-B39728F | 35 | 0877 | Sep 21 1989 12:00AM
L-B31947F | 120 | 0877 | Feb 13 1991 12:00AM
F-C16315M | 227 | 9952 | Nov 3 1990 12:00AM
PTC11962M | 215 | 9952 | Nov 11 1989 12:00AM
A-C71970F | 87 | 1389 | Oct 26 1991 12:00AM
AMD15433F | 200 | 9952 | Jul 16 1991 12:00AM
ARD36773F | 100 | 0877 | Jan 27 1993 12:00AM
PHF38899M | 75 | 0877 | May 17 1992 12:00AM
PXH22250M | 159 | 0877 | Aug 19 1993 12:00AM
CFH28514M | 211 | 9999 | Apr 21 1989 12:00AM
PDI47470M | 195 | 0736 | May 9 1993 12:00AM
KJJ92907F | 170 | 9999 | Mar 11 1994 12:00AM
KFJ64308F | 100 | 0736 | Oct 17 1992 12:00AM
MGK44605M | 220 | 0736 | May 1 1994 12:00AM
POK93028M | 80 | 9999 | Nov 29 1993 12:00AM
JYL26161F | 172 | 9901 | May 26 1991 12:00AM
M-L67958F | 135 | 1389 | Mar 27 1992 12:00AM
Y-L77953M | 32 | 1389 | Jun 11 1989 12:00AM
LAL21447M | 175 | 0736 | Jun 3 1990 12:00AM
ENL44273F | 35 | 0877 | Jul 24 1990 12:00AM
PCM98509F | 150 | 9999 | Aug 1 1989 12:00AM
R-M53550M | 150 | 0736 | Sep 5 1991 12:00AM
RBM23061F | 198 | 1622 | Oct 9 1993 12:00AM
HAN90777M | 120 | 9999 | May 19 1993 12:00AM
TPO55093M | 100 | 0736 | Jun 19 1988 12:00AM
SKO22412M | 150 | 1389 | Apr 5 1991 12:00AM
MAP77183M | 112 | 1389 | Dec 7 1992 12:00AM
PSP68661F | 125 | 1389 | Jan 19 1994 12:00AM
M-P91209M | 101 | 9999 | Jan 9 1989 12:00AM
MJP25939M | 246 | 1756 | Mar 1 1989 12:00AM
M-R38834F | 75 | 0877 | Feb 5 1992 12:00AM
DWR65030M | 192 | 1389 | Dec 16 1991 12:00AM
A-R89858F | 152 | 9999 | Feb 21 1990 12:00AM
MMS49649F | 175 | 0736 | Jun 29 1993 12:00AM
CGS88322F | 64 | 1389 | Jul 7 1992 12:00AM
MAS70474F | 78 | 1389 | Sep 29 1988 12:00AM
HAS54740M | 100 | 0736 | Nov 19 1988 12:00AM
MFS52347M | 165 | 0736 | Apr 13 1990 12:00AM
GHT50241M | 170 | 0736 | Aug 9 1988 12:00AM
DBT39435M | 75 | 0877 | Jan 1 1990 12:00AM


jobs

Column_name | 数据类型 | 可为空 | 默认值 | 检查 | 键/索引
job_id | smallint | 否 | IDENTITY(1,1) |  | 主键，聚集
stor_id | char(4) | 否 | 是1 |  |
min_lvl | tinyint | 否 |  | 是3 |
max_lvl | tinyint | 否 |  | 是3 |

(1) DEFAULT 约束定义为 ("New Position - title not formalized yet")。
(2) min_lvl CHECK 约束定义为 (min_lvl >= 10)。
(3) max_lvl CHECK 约束定义为 (max_lvl <= 250)。

下表显示 jobs 表的内容。

job_id | job_desc | min_lvl | max_lvl
1 | New Hire - Job not specified | 10 | 10
2 | Chief Executive Officer | 200 | 250
3 | Business Operations Manager | 175 | 225
4 | Chief Financial Officer | 175 | 250
5 | Publisher | 150 | 250
6 | Managing Editor | 140 | 225
7 | Marketing Manager | 120 | 200
8 | Public Relations Manager | 100 | 175
9 | Acquisitions Manager | 75 | 175
10 | Productions Manager | 75 | 165
11 | Operations Manager | 75 | 150
12 | Editor | 25 | 100
13 | Sales Representative | 25 | 100
14 | Designer | 25 | 100


pub_info

Column_name | 数据类型 | 可为空 | 默认值 | 检查 | 键/索引
pub_id | char(4) | 否 |  |  | 主键，聚集，外键 publishers(pub_id)
logo | image | 是 |  |  |
pr_info | text | 是 |  |  |

下表显示 pub_info 表的内容。

pub_id | logo 1 | pr_info 2
0736 | Newmoon.bmp | This is sample text data for New Moon Books, publisher 0736 in the pubs database.New Moon Books is located in Boston, Massachusetts.
0877 | Binnet.bmp | This is sample text data for Binnet & Hardley, publisher 0877 in the pubs database.Binnet & Hardley is located in Washington, D.C.
1389 | Algodata.bmp | This is sample text data for Algodata Infosystems, publisher 1389 in the pubs database.Algodata Infosystems is located in Berkeley, California.
1622 | 5lakes.bmp | This is sample text data for Five Lakes Publishing, publisher 1622 in the pubs database.Five Lakes Publishing is located in Chicago, Illinois.
1756 | Ramona.bmp | This is sample text data for Ramona Publishers, publisher 1756 in the pubs database.Ramona Publishers is located in Dallas, Texas.
9901 | Gggg.bmp | This is sample text data for GGG&G, publisher 9901 in the pubs database.GGG&G is located in München, Germany.
9952 | Scootney.bmp | This is sample text data for Scootney Books, publisher 9952 in the pubs database.Scootney Books is located in New York City, New York.
9999 | Lucerne.bmp | This is sample text data for Lucerne Publishing, publisher 9999 in the pubs database.Lucerne Publishing is located in Paris, France.

1 此处显示的信息不是实际数据。它是从中装载位图（image 数据）的文件名。
2 此处显示的文本不完整。显示 text 数据时，仅显示有限数量的字符。此表显示 text 列的前 120 个字符。


publishers

Column_name | 数据类型 | 可为空 | 默认值 | 检查 | 键/索引
pub_id | char(4) | 否 |  | 是1 | 聚集主键
pub_name | varchar(40) | 是 |  |  |
city | varchar(20) | 是 |  |  |
state | char(2) | 是 |  |  |
country | varchar(30) | 是 | 'USA' |  |

1 pub_id CHECK 约束定义为 (pub_id = '1756' OR (pub_id = '1622'
OR (pub_id = '0877'
OR (pub_id = '0736' OR (pub_id = '1389')))) OR (pub_id LIKE '99[0-9][0-0]')。

下表显示 publishers 表的内容。

pub_id | pub_name | city | state | country
0736 | New Moon Books | Boston | MA | USA
0877 | Binnet & Hardley | Washington | DC | USA
1389 | Algodata Infosystems | Berkeley | CA | USA
1622 | Five Lakes Publishing | Chicago | IL | USA
1756 | Ramona Publishers | Dallas | TX | USA
9901 | GGG&G | München | NULL | Germany
9952 | Scootney Books | New York | NY | USA
9999 | Lucerne Publishing | Paris | NULL | France


roysched

Column_name | 数据类型 | 可为空 | 默认值 | 检查 | 键/索引
title_id | tid | 否 |  |  | 外键 titles(title_id)
lorange | int | 是 |  |  |
hirange | int | 是 |  |  |
royalty | int | 是 |  |  |

下表显示 roysched 表的内容。

title_id | lorange | hirange | royalty
BU1032 | 0 | 5000 | 10
BU1032 | 5001 | 50000 | 12
PC1035 | 0 | 2000 | 10
PC1035 | 2001 | 3000 | 12
PC1035 | 3001 | 4000 | 14
PC1035 | 4001 | 10000 | 16
PC1035 | 10001 | 50000 | 18
BU2075 | 0 | 1000 | 10
BU2075 | 1001 | 3000 | 12
BU2075 | 3001 | 5000 | 14
BU2075 | 5001 | 7000 | 16
BU2075 | 7001 | 10000 | 18
BU2075 | 10001 | 12000 | 20
BU2075 | 12001 | 14000 | 22
BU2075 | 14001 | 50000 | 24
PS2091 | 0 | 1000 | 10
PS2091 | 1001 | 5000 | 12
PS2091 | 5001 | 10000 | 14
PS2091 | 10001 | 50000 | 16
PS2106 | 0 | 2000 | 10
PS2106 | 2001 | 5000 | 12
PS2106 | 5001 | 10000 | 14
PS2106 | 10001 | 50000 | 16
MC3021 | 0 | 1000 | 10
MC3021 | 1001 | 2000 | 12
MC3021 | 2001 | 4000 | 14
MC3021 | 4001 | 6000 | 16
MC3021 | 6001 | 8000 | 18
MC3021 | 8001 | 10000 | 20
MC3021 | 10001 | 12000 | 22
MC3021 | 12001 | 50000 | 24
TC3218 | 0 | 2000 | 10
TC3218 | 2001 | 4000 | 12
TC3218 | 4001 | 6000 | 14
TC3218 | 6001 | 8000 | 16
TC3218 | 8001 | 10000 | 18
TC3218 | 10001 | 12000 | 20
TC3218 | 12001 | 14000 | 22
TC3218 | 14001 | 50000 | 24
PC8888 | 0 | 5000 | 10
PC8888 | 5001 | 10000 | 12
PC8888 | 10001 | 15000 | 14
PC8888 | 15001 | 50000 | 16
PS7777 | 0 | 5000 | 10
PS7777 | 5001 | 50000 | 12
PS3333 | 0 | 5000 | 10
PS3333 | 5001 | 10000 | 12
PS3333 | 10001 | 15000 | 14
PS3333 | 15001 | 50000 | 16
BU1111 | 0 | 4000 | 10
BU1111 | 4001 | 8000 | 12
BU1111 | 8001 | 10000 | 14
BU1111 | 12001 | 16000 | 16
BU1111 | 16001 | 20000 | 18
BU1111 | 20001 | 24000 | 20
BU1111 | 24001 | 28000 | 22
BU1111 | 28001 | 50000 | 24
MC2222 | 0 | 2000 | 10
MC2222 | 2001 | 4000 | 12
MC2222 | 4001 | 8000 | 14
MC2222 | 8001 | 12000 | 16
MC2222 | 12001 | 20000 | 18
MC2222 | 20001 | 50000 | 20
TC7777 | 0 | 5000 | 10
TC7777 | 5001 | 15000 | 12
TC7777 | 15001 | 50000 | 14
TC4203 | 0 | 2000 | 10
TC4203 | 2001 | 8000 | 12
TC4203 | 8001 | 16000 | 14
TC4203 | 16001 | 24000 | 16
TC4203 | 24001 | 32000 | 18
TC4203 | 32001 | 40000 | 20
TC4203 | 40001 | 50000 | 22
BU7832 | 0 | 5000 | 10
BU7832 | 5001 | 10000 | 12
BU7832 | 10001 | 15000 | 14
BU7832 | 15001 | 20000 | 16
BU7832 | 20001 | 25000 | 18
BU7832 | 25001 | 30000 | 20
BU7832 | 30001 | 35000 | 22
BU7832 | 35001 | 50000 | 24
PS1372 | 0 | 10000 | 10
PS1372 | 10001 | 20000 | 12
PS1372 | 20001 | 30000 | 14
PS1372 | 30001 | 40000 | 16
PS1372 | 40001 | 50000 | 18


sales

Column_name | 数据类型 | 可为空 | 键/索引
stor_id | char(4) | 否 | 组合主键，聚集索引1 ,外键 stores(stor_id)
ord_num | varchar(20) | 否 | 组合主键，聚集索引 1
ord_date | datetime | 否 |
qty | smallint | 否 |
payterms | varchar(12) | 否 |
title_id | tid | 否 | 组合主键，聚集索引1,外键 titles(title_id)

1 组合主键、聚集索引定义在 stor_id、ord_num 和 title_id 上。

下表显示 sales 表的内容。

stor_id | ord_num | ord_date | qty | payterms | title_id
6380 | 6871 | Sep 14 1994 12:00AM | 5 | Net 60 | BU1032
6380 | 722a | Sep 13 1994 12:00AM | 3 | Net 60 | PS2091
7066 | A2976 | May 24 1993 12:00AM | 50 | Net 30 | PC8888
7066 | QA7442.3 | Sep 13 1994 12:00AM | 75 | ON invoice | PS2091
7067 | D4482 | Sep 14 1994 12:00AM | 10 | Net 60 | PS2091
7067 | P2121 | Jun 15 1992 12:00AM | 40 | Net 30 | TC3218
7067 | P2121 | Jun 15 1992 12:00AM | 20 | Net 30 | TC4203
7067 | P2121 | Jun 15 1992 12:00AM | 20 | Net 30 | TC7777
7131 | N914008 | Sep 14 1994 12:00AM | 20 | Net 30 | PS2091
7131 | N914014 | Sep 14 1994 12:00AM | 25 | Net 30 | MC3021
7131 | P3087a | May 29 1993 12:00AM | 20 | Net 60 | PS1372
7131 | P3087a | May 29 1993 12:00AM | 25 | Net 60 | PS2106
7131 | P3087a | May 29 1993 12:00AM | 15 | Net 60 | PS3333
7131 | P3087a | May 29 1993 12:00AM | 25 | Net 60 | PS7777
7896 | QQ2299 | Oct 28 1993 12:00AM | 15 | Net 60 | BU7832
7896 | TQ456 | Dec 12 1993 12:00AM | 10 | Net 60 | MC2222
7896 | X999 | Feb 21 1993 12:00AM | 35 | ON invoice | BU2075
8042 | 423LL922 | Sep 14 1994 12:00AM | 15 | ON invoice | MC3021
8042 | 423LL930 | Sep 14 1994 12:00AM | 10 | ON invoice | BU1032
8042 | P723 | Mar 11 1993 12:00AM | 25 | Net 30 | BU1111
8042 | QA879.1 | May 22 1993 12:00AM | 30 | Net 30 | PC1035


stores

Column_name | 数据类型 | 可为空 | 默认值 | 检查 | 键/索引
stor_id | char(4) | 否 |  |  | 聚集主键
stor_name | varchar(40) | 是 |  |  |
stor_address | varchar(40) | 是 |  |  |
city | varchar(20) | 是 |  |  |
state | char(2) | 是 |  |  |
zip | char(5) | 是 |  |  |

下表显示 stores 表的内容。

stor_id | stor_name | stor_address | city | state | zip
6380 | Eric the Read Books | 788 Catamaugus Ave. | Seattle | WA | 98056
7066 | Barnum's | 567 Pasadena Ave. | Tustin | CA | 92789
7067 | News & Brews | 577 First St. | Los Gatos | CA | 96745
7131 | Doc-U-Mat:Quality Laundry and Books | 24-A Avrogado Way | Remulade | WA | 98014
7896 | Fricative Bookshop | 89 Madison St. | Fremont | CA | 90019
8042 | Bookbeat | 679 Carson St. | Portland | OR | 89076


titleauthor

Column_name | 数据类型 | 可为空 | 默认值 | 检查 | 键/索引
au_id | id | 否 |  |  | 组合主键，聚集索引1,外键 authors(au_id)2
title_id | tid | 否 |  |  | 组合主键，聚集索引1,外键 titles(title_id)3
au_ord | tinyint | 是 |  |  |
royaltyper | int | 是 |  |  |

1 组合主键、聚集索引定义在 au_id 和 title_id 上。
2 此外键在 au_id 上还有一个非聚集索引。
3 此外键在 title_id 上还有一个非聚集索引。

下表显示 titleauthor 表的内容。

au_id | title_id | au_ord | royaltyper
172-32-1176 | PS3333 | 1 | 100
213-46-8915 | BU1032 | 2 | 40
213-46-8915 | BU2075 | 1 | 100
238-95-7766 | PC1035 | 1 | 100
267-41-2394 | BU1111 | 2 | 40
267-41-2394 | TC7777 | 2 | 30
274-80-9391 | BU7832 | 1 | 100
409-56-7008 | BU1032 | 1 | 60
427-17-2319 | PC8888 | 1 | 50
472-27-2349 | TC7777 | 3 | 30
486-29-1786 | PC9999 | 1 | 100
486-29-1786 | PS7777 | 1 | 100
648-92-1872 | TC4203 | 1 | 100
672-71-3249 | TC7777 | 1 | 40
712-45-1867 | MC2222 | 1 | 100
722-51-5454 | MC3021 | 1 | 75
724-80-9391 | BU1111 | 1 | 60
724-80-9391 | PS1372 | 2 | 25
756-30-7391 | PS1372 | 1 | 75
807-91-6654 | TC3218 | 1 | 100
846-92-7186 | PC8888 | 2 | 50
899-46-2035 | MC3021 | 2 | 25
899-46-2035 | PS2091 | 2 | 50
998-72-3567 | PS2091 | 1 | 50
998-72-3567 | PS2106 | 1 | 100


titles

Column_name | 数据类型 | 可为空 | 默认值 | 检查 | 键/索引
title_id | tid | 否 |  |  | 聚集主键
title | varchar(80) | 否 |  |  | 非聚集
type | char(12) | 否 | 'UNDECIDED' |  |
pub_id | char(4) | 是 |  |  | 外键 publishers (pub_id)
price | money | 是 |  |  |
advance | money | 是 |  |  |
royalty | int | 是 |  |  |
ytd_sales | int | 是 |  |  |
notes | varchar(200) | 是 |  |  |
pubdate | datetime | 否 | GETDATE( ) |  |

这些表显示 titles 表的内容。第一列 (title_id) 在后两个表中重复出现，后两个表中分别还包括第 6 列到第 8 列、第 9 列到第 10 列。

title_id (1) | title (2) | type (3) | pub_id (4) | price (5)
BU1032 | The Busy Executive's Database Guide | business | 1389 | 19.99
BU1111 | Cooking with Computers:Surreptitious Balance Sheets | business | 1389 | 11.95
BU2075 | You Can Combat Computer Stress! | business | 0736 | 2.99
BU7832 | Straight Talk About Computers | business | 1389 | 19.99
MC2222 | Silicon Valley Gastronomic Treats | mod_cook | 0877 | 19.99
MC3021 | The Gourmet Microwave | mod_cook | 0877 | 2.99
MC3026 | The Psychology of Computer Cooking | UNDECIDED | 0877 | NULL
PC1035 | But Is It User Friendly? | popular_comp | 1389 | 22.95
PC8888 | Secrets of Silicon Valley | popular_comp | 1389 | 20.00
PC9999 | Net Etiquette | popular_comp | 1389 | NULL
PS1372 | Computer Phobic and Non-Phobic Individuals:Behavior Variations | psychology | 0877 | 21.59
PS2091 | Is Anger the Enemy? | psychology | 0736 | 10.95
PS2106 | Life Without Fear | psychology | 0736 | 7.00
PS3333 | Prolonged Data Deprivation:Four Case Studies | psychology | 0736 | 19.99
PS7777 | Emotional Security:A New Algorithm | psychology | 0736 | 7.99
TC3218 | Onions, Leeks, and Garlic:Cooking Secrets of the Mediterranean | trad_cook | 0877 | 20.95
TC4203 | Fifty Years in Buckingham Palace Kitchens | trad_cook | 0877 | 11.95
TC7777 | Sushi, Anyone? | trad_cook | 0877 | 14.99

title_id (1) | advance (6) | royalty (7) | ytd_sales (8)
BU1032 | 5,000.00 | 10 | 4095
BU1111 | 5,000.00 | 10 | 3876
BU2075 | 10,125.00 | 24 | 18722
BU7832 | 5,000.00 | 10 | 4095
MC2222 | 0.00 | 12 | 2032
MC3021 | 15,000.00 | 24 | 22246
MC3026 | NULL | NULL | NULL
PC1035 | 7,000.00 | 16 | 8780
PC8888 | 8,000.00 | 10 | 4095
PC9999 | NULL | NULL | NULL
PS1372 | 7,000.00 | 10 | 375
PS2091 | 2,275.00 | 12 | 2045
PS2106 | 6,000.00 | 10 | 111
PS3333 | 2,000.00 | 10 | 4072
PS7777 | 4,000.00 | 10 | 3336
TC3218 | 7,000.00 | 10 | 375
TC4203 | 4,000.00 | 14 | 15096
TC7777 | 8,000.00 | 10 | 4095

title_id (1) | notes (9) | pubdate (10)
BU1032 | An overview of available database systems with emphasis on common business applications.Illustrated. | Jun 12 1991 12:00AM
BU1111 | Helpful hints on how to use your electronic resources to the best advantage. | Jun 9 1991 12:00AM
BU2075 | The latest medical and psychological techniques for living with the electronic office.Easy-to-understand explanations. | Jun 30 1991 12:00AM
BU7832 | Annotated analysis of what computers can do for you:a no-hype guide for the critical user. | Jun 22 1991 12:00AM
MC2222 | Favorite recipes for quick, easy, and elegant meals. | Jun 9 1991 12:00AM
MC3021 | Traditional French gourmet recipes adapted for modern microwave cooking. | Jun 18 1991 12:00AM
MC3026 | NULL | Apr 28 1995 10:36AM
PC1035 | A survey of software for the naive user, focusing on "friendliness" of each. | Jun 30 1991 12:00AM
PC8888 | Muckraking reporting on the world's largest computer hardware and software manufacturers. | Jun 12 1994 12:00AM
PC9999 | A must-read for computer conferencing. | Apr 28 1995 10:36AM
PS1372 | A must for the specialist, examining the difference between those who hate and fear computers and those who don't. | Oct 21 1991 12:00AM
PS2091 | Carefully researched study of the effects of strong emotions on the body.Metabolic charts included. | Jun 15 1991 12:00AM
PS2106 | New exercise, meditation, and nutritional techniques that can reduce the shock of daily interactions.Popular audience.Sample menus included, exercise video available separately. | Oct 5 1991 12:00AM
PS3333 | What happens when the data runs dry?Searching evaluations of information-shortage effects. | Jun 12 1991 12:00AM
PS7777 | Protecting yourself and your loved ones from undue emotional stress in the modern world.Use of computer and nutritional aids emphasized. | Jun 12 1991 12:00AM
TC3218 | Profusely illustrated in color, this makes a wonderful gift book for a cuisine-oriented friend. | Oct 21 1991 12:00AM
TC4203 | More anecdotes from the Queen's favorite cook describing life among English royalty.Recipes, techniques, tender vignettes. | Jun 12 1991 12:00AM
TC7777 | Detailed instructions on how to make authentic Japanese sushi in your spare time. | Jun 12 1991 12:00AM


QUOTENAME

返回带有分隔符的 Unicode 字符串，分隔符的加入可使输入的字符串成为有效的 Microsoft® SQL Server™ 分隔标识符。

语法

QUOTENAME ( 'character_string' [ , 'quote_character' ] )

参数

'{character}[...n]'

Unicode 字符数据字符串。character_string 是 sysname 值。

'quote_character'

用作分隔符的单字符字符串。可以是单引号 (')、左括号或右括号 ([]) 或者双引号 (")。如果未指定 quote_character，则使用括号。

返回类型

nvarchar(129)

示例

本示例采用字符串"abc[]def"，并使用"["和"]"字符创建有效的 SQL Server 引用（分隔）标识符。

SELECT QUOTENAME('abc[]def')

下面是结果集：

[abc[]]def]

(1 row(s) affected)

注意，字符串"abc[]def"中的右括号有两个，用于表示转义符。

请参见

字符串函数


RADIANS

对于在数字表达式中输入的度数值返回弧度值。

语法

RADIANS ( numeric_expression )

参数

numeric_expression

精确数字或近似数字数据类型类别的表达式（bit 数据类型除外）。

返回类型

返回与 numeric_expression 相同的类型。

示例
A. 使用 RADIANS 显示 0.0

下例返回结果 0.0，因为用于转换为弧度的数字表达式对于 RADIANS 函数太小。

SELECT RADIANS(1e-307)
GO

下面是结果集：

-------------------
0.0
(1 row(s) affected)
B. 使用 RADIANS

下例使用 float 表达式并返回给定角度的弧度 (RADIANS)。

-- First value is -45.01.
DECLARE @angle float
SET @angle = -45.01
SELECT 'The RADIANS of the angle is: ' +
   CONVERT(varchar, RADIANS(@angle))
GO
-- Next value is -181.01.
DECLARE @angle float
SET @angle = -181.01
SELECT 'The RADIANS of the angle is: ' +
   CONVERT(varchar, RADIANS(@angle))
GO
-- Next value is 0.00.
DECLARE @angle float
SET @angle = 0.00
SELECT 'The RADIANS of the angle is: ' +
   CONVERT(varchar, RADIANS(@angle))
GO
-- Next value is 0.1472738.
DECLARE @angle float
SET @angle = 0.1472738
SELECT 'The RADIANS of the angle is: ' +
    CONVERT(varchar, RADIANS(@angle))
GO
-- Last value is 197.1099392.
DECLARE @angle float
SET @angle = 197.1099392
SELECT 'The RADIANS of the angle is: ' +
   CONVERT(varchar, RADIANS(@angle))
GO

下面是结果集：

---------------------------------------
The RADIANS of the angle is: -0.785573
(1 row(s) affected)
---------------------------------------
The RADIANS of the angle is: -3.15922
(1 row(s) affected)
---------------------------------------
The RADIANS of the angle is: 0
(1 row(s) affected)
---------------------------------------
The RADIANS of the angle is: 0.00257041
 (1 row(s) affected)
---------------------------------------
The RADIANS of the angle is: 3.44022
(1 row(s) affected)

请参见

CAST 和 CONVERT

decimal 和 numeric

float 和 real

int、smallint 和 tinyint

数学函数

money 和 smallmoney


RAISERROR

返回用户定义的错误信息并设系统标志，记录发生错误。通过使用 RAISERROR 语句，客户端可以从 sysmessages 表中检索条目，或者使用用户指定的严重度和状态信息动态地生成一条消息。这条消息在定义后就作为服务器错误信息返回给客户端。

语法

RAISERROR ( { msg_id | msg_str } { , severity , state }
[ , argument [ ,...n ] ] )
[ WITH option [ ,...n ] ]

参数

msg_id

存储于 sysmessages 表中的用户定义的错误信息。用户定义错误信息的错误号应大于 50,000。由特殊消息产生的错误是第 50,000 号。

msg_str

是一条特殊消息，其格式与 C 语言中使用的 PRINTF 格式样式相似。此错误信息最多可包含 400 个字符。如果该信息包含的字符超过 400 个，则只能显示前 397 个并将添加一个省略号以表示该信息已被截断。所有特定消息的标准消息 ID 是 14,000。

msg_str 支持下面的格式：

% [[flag] [width] [precision] [{h | l}]] type

可在 msg_str 中使用的参数包括：

flag

用于确定用户定义的错误信息的间距和对齐的代码。

代码 | 前缀或对齐 | 描述
-（减） | 左对齐 | 在给定字段宽度内左对齐结果。
+（加） | +（加）或 -（减）前缀 | 如果输出值为带符号类型，则在输出值的前面加上加号（+）或减号（-）。
0（零） | 零填充 | 如果宽度的前面有 0，则添加零直到满足最小宽度。若出现 0 和 -，将忽略 0。若使用整型格式（i, u, x, X, o, d）指定 0，则忽略 0。
#（数字） | 对 x 或 X 的十六进制类型使用 0x 前缀 | 当使用 o、x 或 X 格式时，# 标志在任何非零值的前面分别加上 0、0x 或 0X。当 d、i 或 u 的前面有 # 标记时，将忽略该标记。
' '（空格） | 空格填充 | 如果输出值带符号且为正，则在该值前加空格。如果包含在加号（+）标记中，则忽略该标记。

width

定义最小宽度的整数。星号 (*) 允许 precision 确定宽度。

precision

是输出字段最多输出的字符数，或为整数值输出的最小小数位数。星号 (*) 允许 argument 确定精度。

{h | l} type

与字符类型 d、i、o、x、X 或 u 一起使用，用于创建 short int (h) 或 long int (l) 类型的值。

字符类型 | 表示
d 或 I | 带符号的整数
o | 不带符号的八进制数
p | 指针型
s | String
u | 不带符号的整数
x 或 X | 不带符号的十六进制数

说明 不支持 float、双精度和单精度字符类型。

severity

用户定义的与消息关联的严重级别。用户可以使用从 0 到 18 之间的严重级别。19 到 25 之间的严重级别只能由 sysadmin 固定服务器角色成员使用。若要使用 19 到 25 之间的严重级别，必须选择 WITH LOG 选项。

注意 20 到 25 之间的严重级别被认为是致命的。如果遇到致命的严重级别，客户端连接将在收到消息后终止，并将错误记入错误日志和应用程序日志。

state

从 1 到 127 的任意整数，表示有关错误调用状态的信息。state 的负值默认为 1。

argument

是用于取代在 msg_str 中定义的变量或取代对应于 msg_id 的消息的参数。可以有 0 或更多的替代参数；然而，替代参数的总数不能超过 20 个。每个替代参数可以是局部变量或这些任意数据类型：int1、int2、int4、char、varchar、binary 或 varbinary。不支持其它数据类型。

option

错误的自定义选项。option 可以是以下值之一：

值 | 描述
LOG | 将错误记入服务器错误日志和应用程序日志。记入服务器错误日志的错误目前被限定为最多 440 字节。
NOWAIT | 将消息立即发送给客户端。
SETERROR | 将 @@ERROR 的值设置为 msg_id 或 50000，与严重级别无关。

注释

如果使用 sysmessages 错误并且是使用前面显示的 msg_str 格式创建的消息，则将给所提供的 msg_id 的消息传递提供的参数（argument1、argument2 等等）。

当使用 RAISERROR 创建和返回用户定义的错误信息时，使用 sp_addmessage 添加用户定义的错误信息，使用 sp_dropmessage 删除用户定义的错误信息。

当出现错误时，错误号将放在 @@ERROR 函数中，该函数存储最新生成的错误号。对于严重级别为 1 到 10 的消息，@@ERROR 的默认设置为0。

示例
A. 创建特定消息

下例显示可能出现的两种错误。第一种错误很简单，生成的是静态消息。第二种错误则是在尝试修改的基础上动态生成的。

CREATE TRIGGER employee_insupd
ON employee
FOR INSERT, UPDATE
AS
/* Get the range of level for this job type from the jobs table. */
DECLARE @@MIN_LVL tinyint,
   @@MAX_LVL tinyint,
   @@EMP_LVL tinyint,
   @@JOB_ID smallint
SELECT @@MIN_LVl = min_lvl,
   @@MAX_LV = max_lvl,
   @@ EMP_LVL = i.job_lvl,
   @@JOB_ID = i.job_id
FROM employee e, jobs j, inserted i
WHERE e.emp_id = i.emp_id AND i.job_id = j.job_id
IF (@@JOB_ID = 1) and (@@EMP_lVl <> 10)
BEGIN
   RAISERROR ('Job id 1 expects the default level of 10.', 16, 1)
   ROLLBACK TRANSACTION
END
ELSE
IF NOT @@ EMP_LVL BETWEEN @@MIN_LVL AND @@MAX_LVL)
BEGIN
   RAISERROR ('The level for job_id:%d should be between %d and %d.',
      16, 1, @@JOB_ID, @@MIN_LVL, @@MAX_LVL)
   ROLLBACK TRANSACTION
END
B. 在 sysmessages 中创建特殊消息

下例显示如何通过执行 employee_insupd 触发器获得与 RAISERROR 相同的效果，而 RAISERROR 使用给存储在 sysmessages 表中的消息传递参数的方法。该消息通过 sp_addmessage 系统存储过程，以消息号 50005 被添加到 sysmessages 表中。

说明 下例仅供举例说明。

RAISERROR (50005, 16, 1, @@JOB_ID, @@MIN_LVL, @@MAX_LVL)

请参见

DECLARE @local_variable

函数

PRINT

sp_addmessage

sp_dropmessage

sysmessages

xp_logevent


RAND

返回 0 到1 之间的随机float 值。

语法

RAND ( [ seed ] )

参数

seed

是给出种子值或起始值的整型表达式（tinyint、smallint 或 int）。

返回类型

float

注释

在单个查询中反复调用 RAND() 将产生相同的值。

示例

下例产生 4 个通过 RAND 函数产生的不同的随机值。

DECLARE @counter smallint
SET @counter = 1
WHILE @counter < 5
   BEGIN
      SELECT RAND(@counter) Random_Number
      SET NOCOUNT ON
      SET @counter = @counter + 1
      SET NOCOUNT OFF
   END
GO

下面是结果集：

Random_Number
-------------------
0.71359199321292355

(1 row(s) affected)

Random_Number
-------------------
0.7136106261841817

(1 row(s) affected)

Random_Number
-------------------
0.71362925915543995

(1 row(s) affected)

Random_Number
-------------------
0.7136478921266981

(1 row(s) affected)

请参见

数学函数


READTEXT

读取 text、ntext 或 image 列中的 text、ntext 或 image 值，从指定的偏移量开始读取指定的字节数。

语法

READTEXT { table.column text_ptr offset size } [ HOLDLOCK ]

参数

table.column

是从中读取的表和列的名称。表名和列名必须符合标识符的规则。必须指定表名和列名，不过可以选择是否指定数据库名称和所有者名称。

text_ptr

有效文本指针。text_ptr 必须是 binary(16)。

offset

开始读取 text、image 或 ntext 数据之前跳过的字节数（使用 text 或 image 数据类型时）或字符数（使用 ntext 数据类型时）。使用 ntext 数据类型时，offset 是在开始读取数据前跳过的字符数。使用 text 或 image 数据类型时，offset 是在开始读取数据前跳过的字节数。

size

是要读取数据的字节数（使用 text 或 image 数据类型时）或字符数（使用 ntext 数据类型时）。如果 size 是 0，则表示读取了 4 KB 字节的数据。

HOLDLOCK

使文本值一直锁定到事务结束。其他用户可以读取该值，但是不能对其进行修改。

注释

使用 TEXTPTR 函数获得有效的 text_ptr 值。如果返回不止一行，TEXTPTR 将返回指向指定行中的 text、ntext 或 image 列的指针，或返回指向查询所返回的最后一行中的 text、ntext 或 image 列的指针。由于 TEXTPTR 返回 16 字节的二进制字符串，所以最好声明一个控制文本指针的局部变量，然后在 READTEXT 中使用该变量。有关声明局部变量的更多信息，请参见 DECLARE @local_variable。

在 SQL Server 2000 中可能存在无效的文本指针。有关 text in row 选项的更多信息，请参见 sp_tableoption。有关如何使文本指针无效的更多信息，请参见 sp_invalidate_textptr。

如果 @@TEXTSIZE 函数的值小于为 READTEXT 指定的大小，它将替代为 READTEXT 指定的大小。@@TEXTSIZE 函数是对由 SET TEXTSIZE 语句设置的返回数据字节数的限制。有关如何设置 TEXTSIZE 会话设置的更多信息，请参见 SET TEXTSIZE。

权限

READTEXT 权限默认授予对指定的表具有 SELECT 权限的用户。这些权限可在传递 SELECT 权限时传递。

示例

下例读取 pub_info 表中 pr_info 列的第 2 个至第 26 个字符。

USE pubs
GO
DECLARE @ptrval varbinary(16)
SELECT @ptrval = TEXTPTR(pr_info)
   FROM pub_info pr INNER JOIN publishers p
      ON pr.pub_id = p.pub_id
      AND p.pub_name = 'New Moon Books'
READTEXT pub_info.pr_info @ptrval 1 25
GO

请参见

@@TEXTSIZE

UPDATETEXT

WRITETEXT


real

有关 real 数据类型的更多信息，请参见 float 和 real。

请参见

数据类型转换

数据类型


RECONFIGURE

更新使用 sp_configure 系统存储过程更改的配置选项的当前配置（sp_configure 结果集中的 config_value 列）值。由于有些配置选项需要服务器停止并重新启动才能更新当前运行的值，RECONFIGURE 并不总是为已更改的配置值更新当前运行的值（sp_configure 结果集中的 run_value 列）。

语法

RECONFIGURE [ WITH OVERRIDE ]

参数

RECONFIGURE

指定如果配置设置不需要服务器停止并重新启动，则更新当前运行的值。RECONFIGURE 还检查无效值（如 syscharsets 中不存在的排序次序值）或非推荐值（如将 allow updates 设置为 1）的新配置值。对于那些不需要服务器停止并重新启动的配置选项，其当前运行的值和当前配置的值在指定 RECONFIGURE 后应相同。

WITH OVERRIDE

对 allow updates、recovery interval 或 time slice 高级配置选项禁用配置值检查（检查无效值或非推荐值）。另外，RECONFIGURE WITH OVERRIDE 使用指定值强制重新配置。例如，min server memory 配置选项可使用大于 max server memory 配置选项中所指定的值来配置。然而，这被认为是致命错误。因此，指定 RECONFIGURE WITH OVERRIDE 将不禁用配置值检查。任何配置选项都可以通过 WITH OVERRIDE 选项重新配置。

注释

sp_configure 不接受超出所记录的各配置选项值有效范围的新配置选项值。

权限

默认情况下，将 RECONFIGURE 权限授予 sysadmin 和 serveradmin 固定服务器角色成员且不可转让。

示例

下例设置 network packet size 配置选项的上限并使用 RECONFIGURE WITH OVERRIDE 来安装。因为指定了 WITH OVERRIDE 选项，Microsoft® SQL Server™ 不检查指定的值 (8192) 对于 network packet size 配置选项是否有效。

EXEC sp_configure 'network packet size', 8192
RECONFIGURE WITH OVERRIDE
GO

请参见

设置配置选项

sp_configure


REPLACE

用第三个表达式替换第一个字符串表达式中出现的所有第二个给定字符串表达式。

语法

REPLACE ( 'string_expression1' , 'string_expression2' , 'string_expression3' )

参数

'string_expression1'

待搜索的字符串表达式。string_expression1 可以是字符数据或二进制数据。

'string_expression2'

待查找的字符串表达式。string_expression2 可以是字符数据或二进制数据。

'string_expression3'

替换用的字符串表达式。string_expression3 可以是字符数据或二进制数据。

返回类型

如果 string_expression（1、2 或 3）是支持的字符数据类型之一，则返回字符数据。如果 string_expression（1、2 或 3）是支持的 binary 数据类型之一，则返回二进制数据。

示例

下例用 xxx 替换 abcdefghi 中的字符串 cde。

SELECT REPLACE('abcdefghicde','cde','xxx')
GO

下面是结果集：

------------
abxxxfghixxx
(1 row(s) affected)

请参见

数据类型

字符串函数


REPLICATE

以指定的次数重复字符表达式。

语法

REPLICATE ( character_expression , integer_expression )

参数

character_expression

由字符数据组成的字母数字表达式。character_expression 可以是常量或变量，也可以是字符列或二进制数据列。

integer_expression

是正整数。如果 integer_expression 为负，则返回空字符串。

返回类型

varchar

character_expression 必须为可隐性转换为 varchar 的数据类型。否则，使用 CAST 函数显式转换 character_expression。

注释

兼容级别可能影响返回值。有关更多信息，请参见 sp_dbcmptlevel。

示例
A. 使用 REPLICATE

下例重复两遍每个作者的名字。

USE pubs
SELECT REPLICATE(au_fname, 2)
FROM authors
ORDER BY au_fname

下面是结果集：

----------------------
AbrahamAbraham
AkikoAkiko
AlbertAlbert
AnnAnn
AnneAnne
BurtBurt
CharleneCharlene
CherylCheryl
DeanDean
DirkDirk
HeatherHeather
InnesInnes
JohnsonJohnson
LiviaLivia
MarjorieMarjorie
MeanderMeander
MichaelMichael
MichelMichel
MorningstarMorningstar
ReginaldReginald
SherylSheryl
StearnsStearns
SylviaSylvia
(23 row(s) affected)
B. 使用 REPLICATE、SUBSTRING 和 SPACE

下例使用 REPLICATE、SUBSTRING 和 SPACE 生成 authors 表中的所有作者的电话和传真列表。

-- Replicate phone number twice because the fax number is identical to
-- the author telephone number.
USE pubs
GO
SELECT SUBSTRING((UPPER(au_lname) + ',' + SPACE(1) + au_fname), 1, 35)
   AS Name, phone AS Phone, REPLICATE(phone,1) AS Fax
FROM authors
ORDER BY au_lname, au_fname
GO

下面是结果集：

Name                                Phone        Fax
----------------------------------- ------------ -----------------------
BENNET, Abraham                     415 658-9932 415 658-9932
BLOTCHET-HALLS, Reginald            503 745-6402 503 745-6402
CARSON, Cheryl                      415 548-7723 415 548-7723
DEFRANCE, Michel                    219 547-9982 219 547-9982
DEL CASTILLO, Innes                 615 996-8275 615 996-8275
DULL, Ann                           415 836-7128 415 836-7128
GREEN, Marjorie                     415 986-7020 415 986-7020
GREENE, Morningstar                 615 297-2723 615 297-2723
GRINGLESBY, Burt                    707 938-6445 707 938-6445
HUNTER, Sheryl                      415 836-7128 415 836-7128
KARSEN, Livia                       415 534-9219 415 534-9219
LOCKSLEY, Charlene                  415 585-4620 415 585-4620
MACFEATHER, Stearns                 415 354-7128 415 354-7128
MCBADDEN, Heather                   707 448-4982 707 448-4982
O'LEARY, Michael                    408 286-2428 408 286-2428
PANTELEY, Sylvia                    301 946-8853 301 946-8853
RINGER, Albert                      801 826-0752 801 826-0752
RINGER, Anne                        801 826-0752 801 826-0752
SMITH, Meander                      913 843-0462 913 843-0462
STRAIGHT, Dean                      415 834-2919 415 834-2919
STRINGER, Dirk                      415 843-2991 415 843-2991
WHITE, Johnson                      408 496-7223 408 496-7223
YOKOMOTO, Akiko                     415 935-4228 415 935-4228
(23 row(s) affected)
C. 使用 REPLICATE 和 DATALENGTH

本例中，当数值从数字数据类型转换为字符型或 Unicode 型时，从左填充数字，使其达到指定的长度。

USE Northwind
GO
DROP TABLE t1
GO
CREATE TABLE t1
(
 c1 varchar(3),
 c2 char(3)
)
GO
INSERT INTO t1 VALUES ('2', '2')
INSERT INTO t1 VALUES ('37', '37')
INSERT INTO t1 VALUES ('597', '597')
GO
SELECT REPLICATE('0', 3 - DATALENGTH(c1)) + c1 AS [Varchar Column],
       REPLICATE('0', 3 - DATALENGTH(c2)) + c2 AS [Char Column]
FROM t1
GO

请参见

数据类型

字符串函数


RESTORE

还原使用 BACKUP 命令所做的备份。有关数据库备份和还原操作的更多信息，请参见备份和还原数据库。

语法

还原整个数据库：

RESTORE DATABASE { database_name | @database_name_var }
[ FROM < backup_device > [ ,...n ] ]
[ WITH
[ RESTRICTED_USER ]
[ [ , ] FILE = { file_number | @file_number } ]
[ [ , ] PASSWORD = { password | @password_variable } ]
    [ [ , ] MEDIANAME = { media_name | @media_name_variable } ]
[ [ , ] MEDIAPASSWORD = { mediapassword | @mediapassword_variable } ]
    [ [ , ] MOVE 'logical_file_name' TO 'operating_system_file_name' ]
            [ ,...n ]
[ [ , ] KEEP_REPLICATION ]
[ [ , ] { NORECOVERY | RECOVERY | STANDBY = undo_file_name } ]
    [ [ , ] { NOREWIND | REWIND } ]
[ [ , ] { NOUNLOAD | UNLOAD } ]
    [ [ , ] REPLACE ]
    [ [ , ] RESTART ]
    [ [ , ] STATS [ = percentage ] ]
]

还原数据库的部分内容：

RESTORE DATABASE { database_name | @database_name_var }
< file_or_filegroup > [ ,...n ]
[ FROM < backup_device > [ ,...n ] ]
[ WITH
{ PARTIAL }
    [ [ , ] FILE = { file_number | @file_number } ]
[ [ , ] PASSWORD = { password | @password_variable } ]
    [ [ , ] MEDIANAME = { media_name | @media_name_variable } ]
[ [ , ] MEDIAPASSWORD = { mediapassword | @mediapassword_variable } ]
    [ [ , ] MOVE 'logical_file_name' TO 'operating_system_file_name' ]
[ ,...n ]
[ [ , ] NORECOVERY ]
[ [ , ] { NOREWIND | REWIND } ]
[ [ , ] { NOUNLOAD | UNLOAD } ]
[ [ , ] REPLACE ]
[ [ , ] RESTRICTED_USER ]
[ [ , ] RESTART ]
[ [ , ] STATS [ = percentage ] ]
]

还原特定的文件或文件组：

RESTORE DATABASE { database_name | @database_name_var }
< file_or_filegroup > [ ,...n ]
[ FROM < backup_device > [ ,...n ] ]
[ WITH
[ RESTRICTED_USER ]
[ [ , ] FILE = { file_number | @file_number } ]
[ [ , ] PASSWORD = { password | @password_variable } ]
    [ [ , ] MEDIANAME = { media_name | @media_name_variable } ]
[ [ , ] MEDIAPASSWORD = { mediapassword | @mediapassword_variable } ]
    [ [ , ] MOVE 'logical_file_name' TO 'operating_system_file_name' ]
[ ,...n ]
[ [ , ] NORECOVERY ]
[ [ , ] { NOREWIND | REWIND } ]
[ [ , ] { NOUNLOAD | UNLOAD } ]
[ [ , ] REPLACE ]
[ [ , ] RESTART ]
[ [ , ] STATS [ = percentage ] ]
]

还原事务日志：

RESTORE LOG { database_name | @database_name_var }
[ FROM < backup_device > [ ,...n ] ]
[ WITH
[ RESTRICTED_USER ]
[ [ , ] FILE = { file_number | @file_number } ]
[ [ , ] PASSWORD = { password | @password_variable } ]
    [ [ , ] MOVE 'logical_file_name' TO 'operating_system_file_name' ]
            [ ,...n ]
[ [ , ] MEDIANAME = { media_name | @media_name_variable } ]
[ [ , ] MEDIAPASSWORD = { mediapassword | @mediapassword_variable } ]
    [ [ , ] KEEP_REPLICATION ]
[ [ , ] { NORECOVERY | RECOVERY | STANDBY = undo_file_name } ]
[ [ , ] { NOREWIND | REWIND } ]
[ [ , ] { NOUNLOAD | UNLOAD } ]
[ [ , ] RESTART ]
[ [ , ] STATS [= percentage ] ]
[ [ , ] STOPAT = { date_time | @date_time_var }
| [ , ] STOPATMARK = 'mark_name' [ AFTER datetime ]
| [ , ] STOPBEFOREMARK = 'mark_name' [ AFTER datetime ]
]
]

< backup_device > ::=
{
{ 'logical_backup_device_name' | @logical_backup_device_name_var }
| { DISK | TAPE } =
{ 'physical_backup_device_name' | @physical_backup_device_name_var }
}

< file_or_filegroup > ::=
{
FILE = { logical_file_name | @logical_file_name_var }
|
FILEGROUP = { logical_filegroup_name | @logical_filegroup_name_var}
}

参数

DATABASE

指定从备份还原整个数据库。如果指定了文件和文件组列表，则只还原那些文件和文件组。

{database_name | @database_name_var}

是将日志或整个数据库还原到的数据库。如果将其作为变量 (@database_name_var) 提供，则可将该名称指定为字符串常量 (@database_name_var = database name) 或字符串数据类型（ntext 或 text 数据类型除外）的变量。

FROM

指定从中还原备份的备份设备。如果没有指定 FROM 子句，则不会发生备份还原，而是恢复数据库。可用省略 FROM 子句的办法尝试恢复通过 NORECOVERY 选项还原的数据库，或切换到一台备用服务器上。如果省略 FROM 子句，则必须指定 NORECOVERY、RECOVERY 或 STANDBY。

< backup_device >

指定还原操作要使用的逻辑或物理备份设备。可以是下列一种或多种形式：

{'logical_backup_device_name' | @logical_backup_device_name_var}
是由 sp_addumpdevice 创建的备份设备（数据库将从该备份设备还原）的逻辑名称，该名称必须符合标识符规则。如果作为变量 (@logical_backup_device_name_var) 提供，则可以指定字符串常量 (@logical_backup_device_name_var = logical_backup_device_name) 或字符串数据类型（ntext 或 text 数据类型除外）的变量作为备份设备名。
{DISK | TAPE } =
'physical_backup_device_name' | @physical_backup_device_name_var
允许从命名磁盘或磁带设备还原备份。磁盘或磁带的设备类型应该用设备的真实名称（例如：完整的路径和文件名）来指定：DISK = 'C:\Program Files\Microsoft SQL Server\MSSQL\BACKUP\Mybackup.dat' 或 TAPE = '\\.\TAPE0'。如果指定为变量 (@physical_backup_device_name_var)，则设备名称可以是字符串常量 (@physical_backup_device_name_var = 'physical_backup_device_name') 或字符串数据类型（ntext 或 text 数据类型除外）的变量。

如果使用的是含有 UNC 名称的网络服务器或已重新定向的驱动器号，则请指定磁盘的设备类型。运行 SQL Server 时所使用的帐户必须具有对远程计算机或网络服务器的 READ 访问权，这样才能执行RESTORE 操作。

n

是表示可以指定多个备份设备和逻辑备份设备的占位符。备份设备或逻辑备份设备最多可以为 64 个。

RESTRICTED_USER

限制只有 db_owner、dbcreator 或 sysadmin 角色的成员才能访问新近还原的数据库。在 SQL Server 2000 中，RESTRICTED_USER 替换了选项 DBO_ONLY。提供 DBO_ONLY 只是为了向后兼容。

该选项可与 RECOVERY 选项一起使用。

有关更多信息，请参见设置数据库选项。

FILE = { file_number | @file_number }

标识要还原的备份集。例如，file_number 为 1 表示备份媒体上的第一个备份集，file_number 为 2 表示第二个备份集。

PASSWORD = { password | @password_variable }

提供备份集的密码。PASSWORD 是一个字符串。如果在创建备份集时提供了密码，则从备份集执行还原操作时必须提供密码。

有关使用密码的更多信息，请参见"权限"。

MEDIANAME = {media_name | @media_name_variable}

指定媒体名称。如果提供媒体名称，该名称必须与备份卷上的媒体名称相匹配，否则还原操作将终止。如果 RESTORE 语句没有给出媒体名称，将不对备份卷执行媒体名称匹配检查。

重要 在备份和还原操作中使用一致的媒体名称可以为用于还原操作的媒体提供额外的安全检查。

MEDIAPASSWORD = { mediapassword | @mediapassword_variable}

提供媒体集的密码。MEDIAPASSWORD 是一个字符串。

如果格式化媒体集时提供了密码，则访问该媒体集上的任何备份集时都必须提供该密码。

MOVE 'logical_file_name' TO 'operating_system_file_name'

指定应将给定的 logical_file_name 移到 operating_system_file_name。默认情况下，logical_file_name 将还原到其原始位置。如果使用 RESTORE 语句将数据库复制到相同或不同的服务器上，则可能需要使用 MOVE 选项重新定位数据库文件以避免与现有文件冲突。可以在不同的 MOVE 语句中指定数据库内的每个逻辑文件。

说明 使用 RESTORE FILELISTONLY 从备份集中获取逻辑文件列表。

有关更多信息，请参见复制数据库。

n

占位符，表示可通过指定多个 MOVE 语句移动多个逻辑文件。

NORECOVERY

指示还原操作不回滚任何未提交的事务。如果需要应用另一个事务日志，则必须指定 NORECOVERY 或 STANDBY 选项。如果 NORECOVERY、RECOVERY 和 STANDBY 均未指定，则默认为 RECOVERY。

当还原数据库备份和多个事务日志时，或在需要多个 RESTORE 语句时（例如在完整数据库备份后进行差异数据库备份），SQL Server 要求在除最后的 RESTORE 语句外的所有其它语句上使用 WITH NORECOVERY 选项。

说明 如果指定 NORECOVERY 选项，数据库将处于这个中间的未恢复状态而不可用。

当用于文件或文件组还原操作时，NORECOVERY 强制数据库在还原操作结束后保持还原状态。这在以下情况中很有用：

  • 还原脚本正在运行并且始终要应用日志。

  • 使用文件还原序列，并且在两次还原操作之间不能使用数据库。

RECOVERY

指示还原操作回滚任何未提交的事务。在恢复进程后即可随时使用数据库。

如果安排了后续 RESTORE 操作（RESTORE LOG 或从差异数据库备份 RESTORE DATABASE），则应改为指定 NORECOVERY 或 STANDBY。

如果 NORECOVERY、RECOVERY 和 STANDBY 均未指定，则默认为 RECOVERY。当从 SQL Server 早期版本中还原备份集时，可能要求将数据库升级。如果指定了 WITH RECOVERY，升级将自动进行。有关更多信息，请参见事务日志备份。

STANDBY = undo_file_name

指定撤消文件名以便可以取消恢复效果。撤消文件的大小取决于因未提交的事务所导致的撤消操作量。如果 NORECOVERY、RECOVERY 和 STANDBY 均未指定，则默认为 RECOVERY。

STANDBY 允许将数据库设定为在事务日志还原期间只能读取，并且可用于备用服务器情形，或用于需要在日志还原操作之间检查数据库的特殊恢复情形。

如果指定的撤消文件名不存在，SQL Server 将创建该文件。如果该文件已存在，则 SQL Server 将重写它。

对同一数据库的连续还原可以使用相同的撤消文件。有关更多信息，请参见使用备用服务器。

重要 如果指定的撤消文件所在的驱动器上没有可用的磁盘空间，还原操作将停止。

如果必须升级数据库，则不允许 STANDBY。

KEEP_REPLICATION

指示还原操作在将发布的数据库还原到创建它的服务器以外的服务器上时保留复制设置。当设置复制与日志传送一同使用时，需使用 KEEP_REPLICATION。这样，当在备用服务器上还原数据库或日志备份并且恢复数据库时，可防止删除复制设置。还原备份时若指定了该选项，则不能选择 NORECOVERY 选项。

NOUNLOAD

指定不在 RESTORE 后从磁带机中自动卸载磁带。设置始终为 NOUNLOAD，直到指定 UNLOAD 为止。该选项只用于磁带设备。如果对 RESTORE 使用非磁带设备，将忽略该选项。

NOREWIND

指定 SQL Server 在备份操作完成后使磁带保持打开。磁带保持打开将防止其它过程访问磁带。直到颁发 REWIND 或 UNLOAD 语句，或直到服务器关闭时，才释放该磁带。通过查询 master 数据库中的 sysopentapes 表可查找当前打开的一系列磁带。

NOREWIND 意即 NOUNLOAD。该选项只用于磁带设备。如果对 RESTORE 使用非磁带设备，将忽略该选项。

REWIND

指定 SQL Server 将释放磁带和倒带。如果 NOREWIND 和 REWIND 均未指定，则默认设置为 REWIND。该选项只用于磁带设备。如果对 RESTORE 使用非磁带设备，将忽略该选项。

UNLOAD

指定在还原完成后自动倒带并卸载磁带。启动新用户会话时其默认设置为 UNLOAD。设置始终为 UNLOAD，直到指定 NOUNLOAD 为止。该选项只用于磁带设备。如果对 RESTORE 使用非磁带设备，将忽略该选项。

REPLACE

指定即使存在另一个具有相同名称的数据库，SQL Server 也应该创建指定的数据库及其相关文件。在这种情况下将删除现有的数据库。如果没有指定 REPLACE 选项，则将进行安全检查以防止意外重写其它数据库。安全检查可确保在以下情况中，RESTORE DATABASE 语句不会将数据库还原到当前服务器：

  1. 在 RESTORE 语句中命名的数据库已经在当前服务器上存在，并且

  2. 该数据库名称与备份集中记录的数据库名称不同。

若无法验证现有文件是否属于正在还原的数据库，则 REPLACE 也允许 RESTORE 重写该文件。RESTORE通常拒绝重写已存在的文件。

RESTART

指定 SQL Server 应重新启动被中断的还原操作。RESTART 从中断点重新启动还原操作。

重要 只有当直接从磁带媒体还原以及跨越多个磁带卷还原时才能使用该选项。

STATS [= percentage]

每当另一个 percentage 结束时显示一条消息，并用于测量进度。如果省略 percentage，则 SQL Server 每完成 10 个百分比显示一条消息。

PARTIAL

指定部分还原操作。应用程序或用户错误经常影响到数据库的某个孤立部分（如表）。这类错误的例子包括无效更新或错误地除去表。为支持从这些事件恢复，SQL Server 提供可将数据库的部分内容还原到另一个位置的机制，以使损坏或丢失的数据可复制回原始数据库。

部分还原操作的粒度是数据库文件组。主要文件和文件组始终同指定的文件及其相应的文件组一起还原。还原结果是数据库的一个子集。没有还原的文件组被标记为脱机，不能对其进行访问。

有关更多信息，请参见部分数据库还原操作。

<file_or_filegroup>

指定包括在数据库还原中的逻辑文件或文件组的名称。可以指定多个文件或文件组。

FILE = {logical_file_name | @logical_file_name_var}
命名一个或更多包括在数据库还原中的文件。
FILEGROUP = {logical_filegroup_name | @logical_filegroup_name_var}
命名一个或更多包括在数据库还原中的文件组。

当使用此选项时，最后一个文件或文件组还原操作完成后，必须将事务日志应用于数据库文件，以便前滚文件使之与数据库的其余部分保持一致。如果被还原的文件自上次备份后没有一个做过修改，则不必应用事务日志。RESTORE 语句向用户通告这一情况。

n

是一个占位符，表示可以指定多个文件和文件组。对文件或文件组的最大个数没有限制。

LOG

指定对该数据库应用事务日志备份。必须按有序顺序应用事务日志。SQL Server 检查已备份的事务日志，以确保按正确的序列将事务装载到正确的数据库。若要应用多个事务日志，请在除最后一个外的所有还原操作中使用 NORECOVERY 选项。有关更多信息，请参见事务日志备份。

STOPAT = date_time | @date_time_var

指定将数据库还原到其在指定的日期和时间时的状态。如果对 STOPAT 使用变量，则该变量必须是 varchar、char、smalldatetime 或 datetime 数据类型。只有在指定的日期和时间前写入的事务日志记录才能应用于数据库。

说明 如果指定的 STOPAT 时间超出 RESTORE LOG 操作的结束范围，数据库将处于不可恢复的状态，其效果与在 RESTORE LOG 中使用 NORECOVERY 一样。

STOPATMARK = 'mark_name' [ AFTER datetime ]

指定恢复到指定的标记，包括包含该标记的事务。如果省略 AFTER datetime，恢复操作将在含有指定名称的第一个标记处停止。如果指定 AFTER datetime，恢复操作将在含有在 datetime 时或 datetime 时之后的指定名称的第一个标记处停止。

STOPBEFOREMARK = 'mark_name' [ AFTER datetime ]

指定恢复到指定的标记，但不包括包含该标记的事务。如果省略 AFTER datetime，恢复操作将在含有指定名称的第一个标记处停止。如果指定 AFTER datetime，恢复操作将在含有在 datetime 时或 datetime 时之后的指定名称的第一个标记处停止。

注释

在还原过程中，指定的数据库必须不处于使用状态。指定数据库中的任何数据将由还原的数据替换。

有关数据库恢复的更多信息，请参见备份和还原数据库。

只要操作系统支持数据库排序规则，就可以跨平台执行还原操作，即使这些平台使用不同的处理器类型。有关更多信息，请参见 SQL Server 排序规则基础知识。

还原类型

下面是 SQL Server支持的还原类型：

  • 还原整个数据库的完整数据库还原。

  • 完整数据库还原和差异数据库还原。通过使用 RESTORE DATABASE 语句还原差异备份。

  • 事务日志还原。

  • 个别文件和文件组还原。文件和文件组的还原既可以通过文件或文件组备份操作完成，也可以通过完整数据库备份操作完成。在还原文件或文件组时，必须应用事务日志。此外，文件差异备份可以在完成完整文件还原后还原。

    有关更多信息，请参见事务日志备份。

  • 创建并维护热备用服务器或备用服务器。有关备用服务器的更多信息，请参见使用备用服务器。

若要维护向后兼容性，可以在 RESTORE 语句语法中使用以下关键字：

  • LOAD 可用于代替 RESTORE 关键字。

  • TRANSACTION 关键字可用于代替 LOG 关键字。

  • DBO_ONLY 关键字可用于代替 RESTRICTED_USER 关键字。
数据库设置和还原

当使用 RESTORE DATABASE 语句时，可还原的数据库选项（除 offline 外的所有其它 ALTER DATABASE 可设置选项，以及 merge publish、published 和 subscribed 复制选项）将在 BACKUP 操作结束时大规模地重置为设置值。

说明 该行为与 Microsoft SQL Server 的早期版本不同。

但是，使用选项 WITH RESTRICTED_USER 将替代用户访问选项设置的行为。该设置总是通过在 RESTORE 语句后加上 WITH RESTRICTED_USER 选项来设置。

有关更多信息，请参见备份和还原复制数据库。

还原历史记录表

SQL Server 包含下列还原历史记录表，这些表跟踪每个计算机系统的 RESTORE 活动：

  • restorefile

  • restorefilegroup

  • restorehistory

说明 执行 RESTORE 时，将修改备份历史记录表。

还原已损坏的 master 数据库需要特殊的过程。有关更多信息，请参见还原 master 数据库。

通过 Microsoft® SQL Server™ 2000 创建的备份无法还原为 SQL Server 的早期版本。

权限

如果不存在要还原的数据库，则用户必须有 CREATE DATABASE 权限才能执行 RESTORE。如果存在该数据库，则 RESTORE 权限默认授予 sysadmin 和 dbcreator 固定服务器角色成员以及该数据库的所有者 (dbo)。

RESTORE 权限被授予那些成员资格信息始终可由服务器使用的角色。因为只有在固定数据库可以访问且没有损坏时（在执行 RESTORE 时并不会总是这样）才能检查固定数据库角色成员资格，所以 db_owner 固定数据库角色成员没有 RESTORE 权限。

此外，用户可以为媒体集、备份集或两者指定密码。如果为媒体集指定了密码，则用户若只是适当的固定服务器和数据库角色成员还不足以执行备份。用户还必须提供媒体密码才能执行这些操作。同样，除非在还原命令中指定正确的媒体集密码和备份集密码，否则不能执行还原操作。

在 BACKUP 语句中，定义备份集密码和媒体集密码为可选功能。使用密码可防止利用 SQL Server 2000 工具未经授权地执行还原操作和在媒体中添加备份集，但是，密码不能防止通过 FORMAT 选项重写媒体。

因此，尽管使用密码对防止利用 SQL Server 工具未经授权地访问媒体内容有帮助，但密码不能防止媒体内容被破坏。密码不能完全防止未经授权地访问媒体内容，原因在于备份集中的数据没有加密，理论上可以被专为此目的创建的程序所检查。对于安全性至关重要的场合，防止未经授权的个人访问媒体非常重要。

指定密码时不限定使用者的做法是错误的。

示例

说明 所有的示例均假定已执行了完整数据库备份。

A. 还原完整数据库

说明 MyNwind 数据库仅供举例说明。

下例显示还原完整数据库备份。

RESTORE DATABASE MyNwind
   FROM MyNwind_1
B. 还原完整数据库备份和差异备份

下例还原完整数据库备份后还原差异备份。另外，下例还说明如何还原媒体上的另一个备份集。差异备份追加到包含完整数据库备份的备份设备上。

RESTORE DATABASE MyNwind
   FROM MyNwind_1
   WITH NORECOVERY
RESTORE DATABASE MyNwind
   FROM MyNwind_1
   WITH FILE = 2
C. 使用 RESTART 语法还原数据库

下例使用 RESTART 选项重新启动因服务器电源故障而中断的 RESTORE 操作。

-- This database RESTORE halted prematurely due to power failure.
RESTORE DATABASE MyNwind
   FROM MyNwind_1
-- Here is the RESTORE RESTART operation.
RESTORE DATABASE MyNwind
   FROM MyNwind_1 WITH RESTART
D. 还原数据库并移动文件

下例还原完整数据库和事务日志，并将已还原的数据库移动到 C:\Program Files\Microsoft SQL Server\MSSQL\Data 目录下。

RESTORE DATABASE MyNwind
   FROM MyNwind_1
   WITH NORECOVERY,
      MOVE 'MyNwind' TO 'c:\Program Files\Microsoft SQL Server\MSSQL\Data\NewNwind.mdf',
      MOVE 'MyNwindLog1' TO 'c:\Program Files\Microsoft SQL Server\MSSQL\Data\NewNwind.ldf'
RESTORE LOG MyNwind
   FROM MyNwindLog1
   WITH RECOVERY
E. 使用 BACKUP 和 RESTORE 创建数据库的复本

下例显示使用 BACKUP 和 RESTORE 语句创建 Northwind 数据库的复本。MOVE 语句使数据和日志文件还原到指定的位置。RESTORE FILELISTONLY 语句用于确定待还原数据库内的文件数及名称。该数据库的新复本称为 TestDB。有关更多信息，请参见 RESTORE FILELISTONLY。

BACKUP DATABASE Northwind
   TO DISK = 'c:\Northwind.bak'
RESTORE FILELISTONLY
   FROM DISK = 'c:\Northwind.bak'
RESTORE DATABASE TestDB
   FROM DISK = 'c:\Northwind.bak'
   WITH MOVE 'Northwind' TO 'c:\test\testdb.mdf',
   MOVE 'Northwind_log' TO 'c:\test\testdb.ldf'
GO
F. 使用 STOPAT 语法还原到即时点和使用多个设备进行还原

下例将数据库还原到其在 1998 年 4 月 15 日中午 12 点时的状态，并显示涉及多个日志和多个备份设备的还原操作。

RESTORE DATABASE MyNwind
   FROM MyNwind_1, MyNwind_2
   WITH NORECOVERY
RESTORE LOG MyNwind
   FROM MyNwindLog1
   WITH NORECOVERY
RESTORE LOG MyNwind
   FROM MyNwindLog2
   WITH RECOVERY, STOPAT = 'Apr 15, 1998 12:00 AM'
G. 使用 TAPE 语法还原

下例显示从 TAPE 备份设备还原完整数据库备份。

RESTORE DATABASE MyNwind
   FROM TAPE = '\\.\tape0'
H. 使用 FILE 和 FILEGROUP 语法还原

下例还原一个包含两个文件、一个文件组和一个事务日志的数据库。

RESTORE DATABASE MyNwind
   FILE = 'MyNwind_data_1',
   FILE = 'MyNwind_data_2',
   FILEGROUP = 'new_customers'
   FROM MyNwind_1
   WITH NORECOVERY
-- Restore the log backup.
RESTORE LOG MyNwind
   FROM MyNwindLog1
I. 将事务日志还原到标记处

下例显示将事务日志还原到名为"RoyaltyUpdate"的标记处。

BEGIN TRANSACTION RoyaltyUpdate
   WITH MARK 'Update royalty values'
GO
USE pubs
GO
UPDATE roysched
   SET royalty = royalty * 1.10
   WHERE title_id LIKE 'PC%'
GO
COMMIT TRANSACTION RoyaltyUpdate
GO
--Time passes. Regular database
--and log backups are taken.
--An error occurs.
USE master
GO

RESTORE DATABASE pubs
FROM Pubs1
WITH FILE = 3, NORECOVERY
GO
RESTORE LOG pubs
   FROM Pubs1
   WITH FILE = 4,
   STOPATMARK = 'RoyaltyUpdate'

请参见

BACKUP

bcp 实用工具

BEGIN TRANSACTION

数据类型

RESTORE FILELISTONLY

RESTORE HEADERONLY

RESTORE LABELONLY

RESTORE VERIFYONLY

sp_addumpdevice

使用媒体集及媒体家族

使用标识符


RESTORE FILELISTONLY

返回由备份集内包含的数据库和日志文件列表组成的结果集。

语法

RESTORE FILELISTONLY
FROM < backup_device >
[ WITH
[ FILE = file_number ]
[ [ , ] PASSWORD = { password | @password_variable } ]
[ [ , ] MEDIAPASSWORD = { mediapassword | @mediapassword_variable } ]
    [ [ , ] { NOUNLOAD | UNLOAD } ]
]

< backup_device > ::=
{
{ 'logical_backup_device_name' | @logical_backup_device_name_var }
| { DISK | TAPE } =
{ 'physical_backup_device_name' | @physical_backup_device_name_var }
}

参数

< backup_device >

指定还原时要使用的逻辑或物理备份设备。可以是下列一种或多种形式：

{'logical_backup_device_name' | @logical_backup_device_name_var}
是由 sp_addumpdevice 创建的备份设备（数据库将从该备份设备还原）的逻辑名称，该名称必须符合标识符规则。如果作为变量 (@logical_backup_device_name_var) 提供，则备份设备名可以是字符串常量 (@logical_backup_device_name_var = 'logical_backup_device_name') 或字符串数据类型（ntext 或 text 数据类型除外）的变量。
{DISK | TAPE } =
'physical_backup_device_name' | @physical_backup_device_name_var

允许从命名磁盘或磁带设备还原备份。磁盘或磁带的设备类型应该用设备的真实名称（例如：完整的路径和文件名）来指定：DISK = 'C:\Program Files\Microsoft SQL Server\MSSQL\BACKUP\Mybackup.dat' 或 TAPE = '\\.\TAPE0'。如果指定为变量 (@physical_backup_device_name_var)，则设备名称可以是字符串常量 (@physical_backup_device_name_var = 'physical_backup_device_name') 或字符串数据类型（ntext 或 text 数据类型除外）的变量。

如果使用的是含有 UNC 名称的网络服务器或已重新定向的驱动器号，则请指定磁盘的设备类型。

FILE = file_number

标识要处理的备份集。例如，file_number 为 1 表示第一个备份集，file_number 为 2 表示第二个备份集。如果没有指定 file_number，则假定是指定 <backup_device> 上的第一个备份集。

PASSWORD = { password | @password_variable}

是备份集的密码。 PASSWORD 是一个字符串。如果在创建备份集时提供了密码，则从备份集执行还原操作时必须提供密码。

有关使用密码的更多信息，请参见"权限"。

MEDIAPASSWORD = { mediapassword | @mediapassword_variable}

是媒体集的密码。MEDIAPASSWORD 是一个字符串。

如果格式化媒体集时提供了密码，则在该媒体集上创建备份集时必须提供密码。另外，从该媒体集执行任何还原操作时也必须提供媒体密码。

NOUNLOAD

指定不在还原后从磁带机中自动卸载磁带。设置始终为 NOUNLOAD，直到指定 UNLOAD 为止。该选项只用于磁带设备。

UNLOAD

指定在还原完成后自动倒带并卸载磁带。启动新用户会话时其默认设置为 UNLOAD。设置始终为 UNLOAD，直到指定 NOUNLOAD 为止。该选项只用于磁带设备。

结果集

客户端可以使用 RESTORE FILELISTONLY 获得备份集内的文件列表。该信息以结果集的形式返回，在结果集中每个文件占一行。

列名 | 数据类型 | 描述
LogicalName | nvarchar(128) | 文件的逻辑名称
PhysicalName | nvarchar(260) | 文件的物理名称或操作系统名称
Type | char(1) | 数据文件 (D) 或日志文件 (L)
FileGroupName | nvarchar(128) | 包含文件的文件组名称
Size | numeric(20,0) | 当前大小（以字节为单位）
MaxSize | numeric(20,0) | 允许的最大大小（以字节为单位）

权限

任何用户都可以使用 RESTORE FILELISTONLY。

此外，用户可以为媒体集、备份集或两者指定密码。如果为媒体集指定了密码，则用户若只是适当的固定服务器和数据库角色成员还不足以执行备份。用户还必须提供媒体密码才能执行这些操作。同样，除非在还原命令中指定正确的媒体集密码和备份集密码，否则不能执行还原操作。

在 BACKUP 语句中，定义备份集密码和媒体集密码为可选功能。使用密码可防止利用 SQL Server 2000 工具未经授权地执行还原操作和在媒体中添加备份集，但是，密码不能防止通过 FORMAT 选项重写媒体。

因此，尽管使用密码对防止利用 SQL Server 工具未经授权地访问媒体内容有帮助，但密码不能防止媒体内容被破坏。密码不能完全防止未经授权地访问媒体内容，原因在于备份集中的数据没有加密，理论上可以被专为此目的创建的程序所检查。对于安全性至关重要的场合，防止未经授权的个人访问媒体非常重要。

指定密码时不限定使用者的做法是错误的。

请参见

备份和还原数据库

BACKUP

数据类型

RESTORE

RESTORE HEADERONLY

RESTORE LABELONLY

RESTORE VERIFYONLY

了解媒体集和媒体家族

使用标识符


RESTORE HEADERONLY

在特定的备份设备上检索所有备份集的所有备份首部信息。执行 RESTORE HEADERONLY 的结果是一个结果集。

语法

RESTORE HEADERONLY
FROM < backup_device >
[ WITH { NOUNLOAD | UNLOAD }
[ [ , ] FILE = file_number ]
    [ [ , ] PASSWORD = { password | @password_variable } ]
[ [ , ] MEDIAPASSWORD = { mediapassword | @mediapassword_variable } ]
]

< backup_device > ::=
{
{ 'logical_backup_device_name' | @logical_backup_device_name_var }
| { DISK | TAPE } =
{ 'physical_backup_device_name' | @physical_backup_device_name_var }
}

参数

< backup_device >

指定还原时要使用的逻辑或物理备份设备。可以是下列选项之一：

{'logical_backup_device_name' | @logical_backup_device_name_var}
是由 sp_addumpdevice 创建的备份设备（数据库将从该备份设备还原）的逻辑名称，该名称必须符合标识符规则。如果作为变量 (@logical_backup_device_name_var) 提供，则备份设备名可以是字符串常量 (@logical_backup_device_name_var = 'logical_backup_device_name') 或字符串数据类型（ntext 或 text 数据类型除外）的变量。
{DISK | TAPE } =
'physical_backup_device_name' | @physical_backup_device_name_var

允许从命名磁盘或磁带设备还原备份。磁盘或磁带的设备类型应该用设备的真实名称（例如：完整的路径和文件名）来指定：DISK = 'C:\Program Files\Microsoft SQL Server\MSSQL\BACKUP\Mybackup.dat' 或 TAPE = '\\.\TAPE0'。如果指定为变量 (@physical_backup_device_name_var)，则设备名称可以是字符串常量 (@physical_backup_device_name_var = 'physical_backup_device_name') 或字符串数据类型（ntext 或 text 数据类型除外）的变量。

如果使用的是含有 UNC 名称的网络服务器或已重新定向的驱动器号，则请指定磁盘的设备类型。

NOUNLOAD

指定不在还原后从磁带机中自动卸载磁带。设置始终为 NOUNLOAD，直到指定 UNLOAD 为止。该选项只用于磁带设备。

UNLOAD

指定在还原完成后自动倒带并卸载磁带。启动新用户会话时其默认设置为 UNLOAD。设置始终为 UNLOAD，直到指定 NOUNLOAD 为止。该选项只用于磁带设备。

FILE = file_number

标识待描述的备份集。例如，file_number 为 1 表示第一个备份集，file_number 为 2 表示第二个备份集。如果未指定，则描述设备上的所有备份集。

PASSWORD = { password | @password_variable}

是备份集的密码。 PASSWORD 是一个字符串。如果在创建备份集时提供了密码，则从备份集执行还原操作时必须提供密码。

有关使用密码的更多信息，请参见"权限"。

MEDIAPASSWORD = { mediapassword | @mediapassword_variable}

是媒体集的密码。MEDIAPASSWORD 是一个字符串。

如果格式化媒体集时提供了密码，则在该媒体集上创建备份集时必须提供密码。另外，从该媒体集执行任何还原操作时也必须提供媒体密码。

结果集

对于给定设备上的每个备份，服务器均发送一行含有以下各列的首部信息：

说明 由于 RESTORE HEADERONLY 查看媒体上的所有备份集，因此在使用高容量磁带机时可能要花一些时间生成该结果集。若只想快速查看媒体而无需了解每个备份集的信息，请使用 RESTORE LABELONLY 或指定 FILE = file_number。

由于 Microsoft 磁带格式的固有特点，来自其它软件程序的备份集可以与 Microsoft® SQL Server™ 2000 备份集在同一媒体上占有空间。在由 RESTORE HEADERONLY 返回的结果集中，这些其它备份集中的每个各占一行。

列名 | 数据类型 | SQL Server 备份集描述 | 其它备份集描述
BackupName | nvarchar(128) | 备份集名称。 | 数据集名称
BackupDescription | nvarchar(255) | 备份集描述。 | 数据集描述
BackupType | smallint | 备份类型： 1 = 数据库 2 = 事务日志 4 = 文件 5 = 差异 数据库 6 = 差异文件 | 备份类型： 1 = 标准 5 = 差异 16 = 增量 17 = 每天
ExpirationDate | datetime | 备份集的过期时间。 | NULL
Compressed | tinyint | 0 = 否。SQL Server 不支持软件压缩。 | 是否使用基于软件的压缩对备份集进行压缩： 1 = 是 0 = 否
Position | smallint | 备份集在卷中的位置（用于 FILE = 选项）。 | 备份集在卷中的位置
DeviceType | tinyint | 与用于备份操作的设备对应的编号： 磁盘 2 = 逻辑 102 = 物理 磁带 5 = 逻辑 105 = 物理 管道 6 = 逻辑 106 = 物理 虚拟设备 7 = 逻辑 107 = 物理 所有物理设备名和设备号可从 sysdevices 中查找。 | NULL
UserName | nvarchar(128) | 执行备份操作的用户名。 | 执行备份操作的用户名
ServerName | nvarchar(128) | 写入备份集的服务器名称。 | NULL
DatabaseName | nvarchar(128) | 已备份的数据库名称。 | NULL
DatabaseVersion | int | 从其中创建备份的数据库版本。 | NULL
DatabaseCreationDate | datetime | 数据库的创建日期和时间。 | NULL
BackupSize | numeric(20,0) | 备份大小（以字节为单位）。 | NULL
FirstLSN | numeric(25,0) | 备份集中第一个事务的日志序号。对文件备份为 NULL。 | NULL
LastLSN | numeric(25,0) | 备份集中最后一个事务的日志序号。对文件备份为 NULL。 | NULL
CheckpointLSN | numeric(25,0) | 创建备份时最后一个检查点的日志序号。 | NULL
DatabaseBackupLSN | numeric(25,0) | 最新的完整数据库备份的日志序列号。 | NULL
BackupStartDate | datetime | 备份操作的开始日期和时间。 | 写入媒体的日期
BackupFinishDate | datetime | 备份操作的完成日期和时间。 | 写入媒体的日期
SortOrder | smallint | 服务器排列次序。该列仅对数据库备份有效。为向后兼容性而提供。 | NULL
CodePage | smallint | 服务器使用的服务器代码页或字符集。 | NULL
UnicodeLocaleId | int | 用于 Unicode 字符数据排序的服务器 Unicode 区域设置 ID 配置选项。为向后兼容性而提供。 | NULL
UnicodeComparisionStyle | int | 服务器 Unicode 比较风格配置选项，可提供对 Unicode 数据排序的额外控制。为向后兼容性而提供。 | NULL
CompatibilityLevel | tinyint | 从其中创建备份的数据库兼容级别设置。 | NULL
SoftwareVendorId | int | 软件供应商标识号。对于 SQL Server，该号码是 4608（用十六进制表示是 0x1200）。 | 软件供应商标识号
SoftwareVersionMajor | int | 创建备份集的服务器主要版本号。 | 创建备份集的软件的主要版本号
SoftwareVersionMinor | int | 创建备份集的服务器次要版本号。 | 创建备份集的软件的次要版本号
SoftwareVersionBuild | int | 创建备份集的服务器内部版本号码。 | NULL
MachineName | nvarchar(128) | 执行备份操作的计算机名称。 | 执行备份操作的计算机的类型
Flags | int | 位 0 (X1) 表示在此日志备份中捕获大容量日志记录数据。 | NULL
BindingID | uniqueidentifier | 数据库的绑定 ID。 | NULL
RecoveryForkID | uniqueidentifier | 此备份的当前恢复派生的 ID。 | NULL
Collation | nvarchar(128) | 数据库使用的排序规则。 | NULL

说明 如果为备份集指定了密码，则 RESTORE HEADERONLY 将只显示密码与命令中指定的 PASSWORD 选项相匹配的备份集的完整信息。RESTORE HEADERONLY 还显示没有密码保护的备份集的完整信息。媒体上其它受密码保护的备份集的 BackupName 列将被设为 '***Password Protected***'，而剩下的所有列将为 NULL。

权限

任何用户都可以使用 RESTORE HEADERONLY。

此外，用户可以为媒体集、备份集或两者指定密码。如果为媒体集指定了密码，则用户若只是适当的固定服务器和数据库角色成员还不足以执行备份。用户还必须提供媒体密码才能执行这些操作。同样，除非在还原命令中指定正确的媒体集密码和备份集密码，否则不能执行还原操作。

在 BACKUP 语句中，定义备份集密码和媒体集密码为可选功能。使用密码可防止利用 SQL Server 2000 工具未经授权地执行还原操作和在媒体中添加备份集，但是，密码不能防止通过 FORMAT 选项重写媒体。

因此，尽管使用密码对防止利用 SQL Server 工具未经授权地访问媒体内容有帮助，但密码不能防止媒体内容被破坏。密码不能完全防止未经授权地访问媒体内容，原因在于备份集中的数据没有加密，理论上可以被专为此目的创建的程序所检查。对于安全性至关重要的场合，防止未经授权的个人访问媒体非常重要。

指定密码时不限定使用者的做法是错误的。

注释

客户端可以使用 RESTORE HEADERONLY 检索特殊备份设备上的所有备份的所有备份首部信息。对于表中给定备份设备上的每个备份，服务器均发送一行首部信息。

重要 为维护向后兼容性，在 RESTORE 语句语法中可以使用 LOAD 关键字代替 RESTORE 关键字。

请参见

备份和还原数据库

BACKUP

数据类型

RESTORE

RESTORE FILELISTONLY

RESTORE VERIFYONLY

RESTORE LABELONLY

使用媒体集及媒体家族

使用标识符


RESTORE LABELONLY

返回由有关给定备份设备所标识的备份媒体的信息组成的结果集。

语法

RESTORE LABELONLY
FROM < backup_device >
[ WITH { NOUNLOAD | UNLOAD } ]
[ [ , ] MEDIAPASSWORD = { mediapassword | @mediapassword_variable } ]

< backup_device > ::=
{
{ 'logical_backup_device_name' | @logical_backup_device_name_var }
| { DISK | TAPE } =
{ 'physical_backup_device_name' | @physical_backup_device_name_var }
}

参数

< backup_device >

指定还原时要使用的逻辑或物理备份设备。可以是下列选项之一：

{'logical_backup_device__name' | @logical_backup_device_name_var}
是由 sp_addumpdevice 创建的备份设备（数据库将从该备份设备还原）的逻辑名称，该名称必须符合标识符规则。如果作为变量 (@logical_backup_device_name_var) 提供，则备份设备名可以是字符串常量 (@logical_backup_device_name_var = 'logical_backup_device_name') 或字符串数据类型（ntext 或 text 数据类型除外）的变量。
{DISK | TAPE } =
'physical_backup_device_name' | @physical_backup_device_name_var

允许从命名磁盘或磁带设备还原备份。磁盘或磁带的设备类型应该用设备的真实名称（例如：完整的路径和文件名）来指定：DISK = 'C:\Program Files\Microsoft SQL Server\MSSQL\BACKUP\Mybackup.dat' 或 TAPE = '\\.\TAPE0'。如果指定为变量 (@physical_backup_device_name_var)，则设备名可以是字符串常量 (@physical_backup_device_name_var = 'physical_backup_device_name') 或字符串数据类型（ntext 或 text 数据类型除外）的变量。

如果使用的是含有 UNC 名称的网络服务器或已重新定向的驱动器号，则请指定磁盘的设备类型。

NOUNLOAD

指定不在还原后从磁带机中自动卸载磁带。设置始终为 NOUNLOAD，直到指定 UNLOAD 为止。该选项只用于磁带设备。

UNLOAD

指定在还原完成后自动倒带并卸载磁带。启动新用户会话时其默认设置为 UNLOAD。设置始终为 UNLOAD，直到指定 NOUNLOAD 为止。该选项只用于磁带设备。

MEDIAPASSWORD = { mediapassword | @mediapassword_variable}

是媒体集的密码。MEDIAPASSWORD 是一个字符串。

如果格式化媒体集时提供了密码，则在该媒体集上创建备份集时必须提供密码。另外，从该媒体集执行任何还原操作时也必须提供媒体密码。

结果集

RESTORE LABELONLY 返回的结果集由包含下列信息的一行组成。

列名 | 数据类型 | 描述
MediaName | nvarchar(128) | 媒体的名称。
MediaSetId | uniqueidentifier | 媒体集的唯一标识号。如果媒体集中只有一个媒体家族，则该列的值为 NULL。
FamilyCount | int | 媒体集中的媒体家族数。
FamilySequenceNumber | int | 该媒体家族的序号。
MediaFamilyId | uniqueidentifier | 媒体家族的唯一标识号。
MediaSequenceNumber | int | 该媒体在媒体家族中的序号。
MediaLabelPresent | tinyint | 媒体描述中是否包含： 1 = Microsoft 磁带格式媒体 标签 0 = 媒体描述
MediaDescription | nvarchar(255) | 媒体描述，以自由格式文本或 Microsoft 磁带格式媒体标签格式。
SoftwareName | nvarchar(128) | 写入标签的备份软件名称。
SoftwareVendorId | int | 写入备份的软件供应商唯一供应商标识号。
MediaDate | datetime | 标签的写入日期和时间。

说明 如果为媒体集定义了密码，则只有在命令的MEDIAPASSWORD 选项中指定了正确的媒体密码时，RESTORE LABELONLY 才返回信息。

权限

任何用户都可以使用 RESTORE LABELONLY。

此外，用户可以为媒体集、备份集或两者指定密码。如果为媒体集指定了密码，则用户若只是适当的固定服务器和数据库角色成员还不足以执行备份。用户还必须提供媒体密码才能执行这些操作。同样，除非在还原命令中指定正确的媒体集密码和备份集密码，否则不能执行还原操作。

在 BACKUP 语句中，定义备份集密码和媒体集密码为可选功能。使用密码可防止利用 SQL Server 2000 工具未经授权地执行还原操作和在媒体中添加备份集，但是，密码不能防止通过 FORMAT 选项重写媒体。

因此，尽管使用密码对防止利用 SQL Server 工具未经授权地访问媒体内容有帮助，但密码不能防止媒体内容被破坏。密码不能完全防止未经授权地访问媒体内容，原因在于备份集中的数据没有加密，理论上可以被专为此目的创建的程序所检查。对于安全性至关重要的场合，防止未经授权的个人访问媒体非常重要。

指定密码时不限定使用者的做法是错误的。

注释

执行 RESTORE LABELONLY 是找出备份媒体所含内容的快速方法。RESTORE LABELONLY 只读取媒体首部，因此即使在使用高容量磁带设备时该语句也执行得很快。

请参见

备份和还原数据库

BACKUP

数据类型

RESTORE

RESTORE FILELISTONLY

RESTORE VERIFYONLY

使用媒体集及媒体家族

使用标识符


RESTORE VERIFYONLY

验证备份但不还原备份。检查备份集是否完整以及所有卷是否都可读。但是，RESTORE VERIFYONLY 不尝试验证备份卷中的数据结构。如果备份有效，则 Microsoft® SQL Server™ 2000 返回此消息："该备份集有效"。

语法

RESTORE VERIFYONLY
FROM < backup_device > [ ,...n ]
[ WITH
[ FILE = file_number ]
[ [ , ] { NOUNLOAD | UNLOAD } ]
    [ [ , ] LOADHISTORY ]
[ [ , ] PASSWORD = { password | @password_variable } ]
[ [ , ] MEDIAPASSWORD = { mediapassword | @mediapassword_variable } ]
[ [ , ] { NOREWIND | REWIND } ]
]

< backup_device > ::=
{
{ 'logical_backup_device_name' | @logical_backup_device_name_var }
| { DISK | TAPE } =
{ 'physical_backup_device_name' | @physical_backup_device_name_var }
}

参数

< backup_device >

指定还原时要使用的逻辑或物理备份设备。可以是下列一种或多种形式：

{'logical_backup_device_name' | @logical_backup_device_name_var}
是由 sp_addumpdevice 创建的备份设备（数据库将从该备份设备还原）的逻辑名称，该名称必须符合标识符规则。如果作为变量 (@logical_backup_device_name_var) 提供，则备份设备名可以是字符串常量 (@logical_backup_device_name_var = 'logical_backup_device_name') 或字符串数据类型（ntext 或 text 数据类型除外）的变量。
{DISK | TAPE } =
'physical_backup_device_name' | @physical_backup_device_name_var

允许从命名磁盘或磁带设备还原备份。磁盘或磁带的设备类型应该用设备的真实名称（例如：完整的路径和文件名）来指定：DISK = 'C:\Program Files\Microsoft SQL Server\MSSQL\BACKUP\Mybackup.dat' 或 TAPE = '\\.\TAPE0'。如果指定为变量 (@physical_backup_device_name_var)，则设备名称可以是字符串常量 (@physical_backup_device_name_var = 'physical_backup_device_name') 或字符串数据类型（ntext 或 text 数据类型除外）的变量。

如果使用的是含有 UNC 名称的网络服务器或已重新定向的驱动器号，则请指定磁盘的设备类型。

n

表示可以指定多个备份设备和逻辑备份设备的占位符。在一个 ESTORE VERIFYONLY 语句中，备份设备或逻辑备份设备最多可以为 64 个。

说明 要为 <backup_device> 指定多个备份设备，所有指定的备份设备必须是相同媒体集的一部分。

FILE = file_number

标识要还原或处理的备份集。例如，file_number 为 1 表示第一个备份集，file_number 为 2 表示第二个备份集。如果没有指定 file_number，则假定是指定 <backup_device> 上的第一个备份集。

NOUNLOAD

指定不在还原后从磁带机中自动卸载磁带。设置始终为 NOUNLOAD，直到指定 UNLOAD 为止。该选项只用于磁带设备。如果对 RESTORE 使用非磁带设备，将忽略该选项。

UNLOAD

指定在还原完成后自动倒带并卸载磁带。启动新用户会话时其默认设置为 UNLOAD。设置始终为 UNLOAD，直到指定 NOUNLOAD 为止。该选项只用于磁带设备。如果对 RESTORE 使用非磁带设备，将忽略该选项。

LOADHISTORY

指定还原操作将信息装载到 msdb 历史记录表中。对于要验证的单个备份集，LOADHISTORY 选项将有关存储在媒体集上的 SQL Server 备份的信息装载到 msdb 数据库内的备份和还原历史记录表中。有关非 SQL Server 备份的消息不装载到这些历史记录表中。有关历史记录表的更多信息，请参见系统表。

PASSWORD = { password | @password_variable}

是备份集的密码。 PASSWORD 是一个字符串。如果在创建备份集时提供了密码，则从备份集执行还原操作时必须提供密码。

有关使用密码的更多信息，请参见"权限"。

MEDIAPASSWORD = { mediapassword | @mediapassword_variable}

是媒体集的密码。MEDIAPASSWORD 为字符串数据类型，默认设置为NULL。

如果格式化媒体集时提供了密码，则在该媒体集上创建备份集时必须提供密码。另外，从该媒体集执行任何还原操作时也必须提供媒体密码。

NOREWIND

指定 SQL Server 在备份操作完成后使磁带保持打开。NOREWIND 意即 NOUNLOAD。

REWIND

指定 SQL Server 将释放磁带和倒带。如果 NOREWIND 和 REWIND 均未指定，则默认设置为 REWIND。

权限

任何用户都可以使用 RESTORE VERIFYONLY。

此外，用户可以为媒体集、备份集或两者指定密码。如果为媒体集指定了密码，则用户若只是适当的固定服务器和数据库角色成员还不足以执行备份。用户还必须提供媒体密码才能执行这些操作。同样，除非在还原命令中指定正确的媒体集密码和备份集密码，否则不能执行还原操作。

在 BACKUP 语句中，定义备份集密码和媒体集密码为可选功能。使用密码可防止利用 SQL Server 2000 工具未经授权地执行还原操作和在媒体中添加备份集，但是，密码不能防止通过 FORMAT 选项重写媒体。

因此，尽管使用密码对防止利用 SQL Server 工具未经授权地访问媒体内容有帮助，但密码不能防止媒体内容被破坏。密码不能完全防止未经授权地访问媒体内容，原因在于备份集中的数据没有加密，理论上可以被专为此目的创建的程序所检查。对于安全性至关重要的场合，防止未经授权的个人访问媒体非常重要。

指定密码时不限定使用者的做法是错误的。

请参见

备份和还原数据库

BACKUP

数据类型

RESTORE

RESTORE FILELISTONLY

RESTORE HEADERONLY

RESTORE LABELONLY

系统表

使用媒体集及媒体家族

使用标识符


RETURN

从查询或过程中无条件退出。RETURN 即时且完全，可在任何时候用于从过程、批处理或语句块中退出。不执行位于 RETURN 之后的语句。

语法

RETURN [ integer_expression ]

参数

integer_expression

是返回的整型值。存储过程可以给调用过程或应用程序返回整型值。

返回类型

可以选择是否返回 int。

说明 除非特别指明，所有系统存储过程返回 0 值表示成功，返回非零值则表示失败。

注释

当用于存储过程时，RETURN 不能返回空值。如果过程试图返回空值（例如，使用 RETURN @status 且 @status 是 NULL），将生成警告信息并返回 0 值。

在执行当前过程的批处理或过程内，可以在后续 Transact-SQL 语句中包含返回状态值，但必须以下列格式输入：

EXECUTE @return_status = procedure_name

说明 Microsoft® SQL Server™ 2000 是将空字符串 (NULL) 解释为单个空格还是真正的空字符串取决于兼容级别设置。如果兼容级别小于或等于 65，SQL Server 就将空字符串解释为单个空格。如果兼容级别等于 70，则 SQL Server 将空字符串解释为空字符串。有关更多信息，请参见 sp_dbcmptlevel。

示例
A. 从过程返回

下例显示如果在执行 findjobs 时没有给出用户名作为参数，RETURN 则将一条消息发送到用户的屏幕上然后从过程中退出。如果给出用户名，将从适当的系统表中检索由该用户在当前数据库内创建的所有对象名。

CREATE PROCEDURE findjobs @nm sysname = NULL
AS
IF @nm IS NULL
   BEGIN
      PRINT 'You must give a username'
      RETURN
   END
ELSE
   BEGIN
      SELECT o.name, o.id, o.uid
      FROM sysobjects o INNER JOIN master..syslogins l
         ON o.uid = l.sid
      WHERE l.name = @nm
   END
B. 返回状态代码

下例检查指定作者所在州的 ID。如果所在的州是加利福尼亚州 (CA)，将返回状态代码 1。否则，对于任何其它情况（state 的值是 CA 以外的值或者 au_id 没有匹配的行），将返回状态代码 2。

CREATE PROCEDURE checkstate @param varchar(11)
AS
IF (SELECT state FROM authors WHERE au_id = @param) = 'CA'
   RETURN 1
ELSE
   RETURN 2

下例显示从 checkstate 执行中返回的状态。第一个显示的是在加利福尼亚州的作者；第二个显示的是不在加利福尼亚州的作者，第三个显示的是无效的作者。必须先声明 @return_status 局部变量后才能使用它。

DECLARE @return_status int
EXEC @return_status = checkstate '172-32-1176'
SELECT 'Return Status' = @return_status
GO

下面是结果集：

Return Status
-------------
1

再执行一次查询，指定一个不同的作者编号。

DECLARE @return_status int
EXEC @return_status = checkstate '648-92-1872'
SELECT 'Return Status' = @return_status
GO

下面是结果集：

Return Status
-------------
2

再执行一次查询，指定另一个作者编号。

DECLARE @return_status int
EXEC @return_status = checkstate '12345678901'
SELECT 'Return Status' = @return_status
GO

下面是结果集：

Return Status
-------------
2

请参见

ALTER PROCEDURE

CREATE PROCEDURE

DECLARE @local_variable

EXECUTE

SET @local_variable


REVERSE

返回字符表达式的反转。

语法

REVERSE ( character_expression )

参数

character_expression

由字符数据组成的表达式。character_expression 可以是常量、变量，也可以是字符或二进制数据的列。

返回类型

varchar

注释

character_expression 必须为可隐性转换为 varchar 的数据类型。否则，使用 CAST 显式转换 character_expression。

示例

下例返回所有名字中的字符被反转的作者。

USE pubs
GO
SELECT REVERSE(au_fname)
FROM authors
ORDER BY au_fname
GO

下面是结果集：

--------------------
maharbA
okikA
treblA
nnA
ennA
truB
enelrahC
lyrehC
naeD
kriD
rehtaeH
sennI
nosnhoJ
aiviL
eirojraM
rednaeM
leahciM
lehciM
ratsgninroM
dlanigeR
lyrehS
snraetS
aivlyS
(23 row(s) affected)

请参见

CAST 和 CONVERT

数据类型

字符串函数


REVOKE

删除以前在当前数据库内的用户上授予或拒绝的权限。

语法

语句权限：

REVOKE { ALL | statement [ ,...n ] }
FROM security_account [ ,...n ]

对象权限：

REVOKE [ GRANT OPTION FOR ]
{ ALL [ PRIVILEGES ] | permission [ ,...n ] }
{
[ ( column [ ,...n ] ) ] ON { table | view }
| ON { table | view } [ ( column [ ,...n ] ) ]
| ON { stored_procedure | extended_procedure }
| ON { user_defined_function }
}
{ TO | FROM }
security_account [ ,...n ]
[ CASCADE ]
[ AS { group | role } ]

参数

ALL

指定将删除所有适用的权限。对于语句权限，只有 sysadmin 固定服务器角色成员可以使用 ALL。对于对象权限，sysadmin 固定服务器角色成员、db_owne 固定数据库角色成员和数据库对象所有者都可以使用 ALL。

statement

是要删除其权限的授权语句。语句列表可以包括：

  • CREATE DATABASE

  • CREATE DEFAULT

  • CREATE FUNCTION

  • CREATE PROCEDURE

  • CREATE RULE

  • CREATE TABLE

  • CREATE VIEW

  • BACKUP DATABASE

  • BACKUP LOG

n

是一个占位符，表示在以逗号分隔的列表内可以重复的项目。

FROM

指定安全帐户列表。

security_account

是当前数据库内将要被删除权限的安全帐户。安全帐户可以是：

  • Microsoft® SQL Server™ 用户。

  • SQL Server 角色。

  • Microsoft Windows NT® 用户。

  • Windows NT 组。

    不能废除系统角色（如 sysadmin）的权限。当从 SQL Server 或 Windows NT 用户帐户中废除权限时，指定的 security_account 是唯一受权限影响的帐户。如果从 SQL Server 角色或 Windows NT 组废除权限，这些权限将影响当前数据库中作为组或角色成员的用户，除非用户已被显式赋予或拒绝权限。

    REVOKE 可用于两种特殊的安全帐户。在 public 角色上废除的权限适用于数据库内的所有用户。在 guest 用户上废除的权限将由数据库内所有没有用户帐户的用户使用。

    废除 Windows NT 本地组或全局组的权限时，指定在该组上定义的域名或计算机名，后面跟一个反斜线然后是组名，如 London\JoeB。但是，若要废除 Windows NT 内置本地组的权限，请指定 BUILTIN 而不是域名或计算机名，如 BUILTIN\Users。

GRANT OPTION FOR

指定要删除的 WITH GRANT OPTION 权限。在 REVOKE 中使用 GRANT OPTION FOR 关键字可消除 GRANT 语句中指定的WITH GRANT OPTION 设置的影响。用户仍然具有该权限，但是不能将该权限授予其他用户。

如果要废除的权限原先不是通过 WITH GRANT OPTION 设置授予的，则忽略 GRANT OPTION FOR（若指定了此参数）并照例废除权限。

如果要废除的权限原先是通过 WITH GRANT OPTION 设置授予的，则指定 CASCADE 和 GRANT OPTION FOR 子句；否则将返回一个错误。

PRIVILEGES

是可以包含在符合 SQL-92 标准的语句中的可选关键字。

permission

是要废除的对象权限。当废除表或试图的权限时，权限列表可以包括一个或多个这样的语句：SELECT、INSERT、DELETE 或 UPDATE。

在表上废除的对象权限还可以包括 REFERENCES，在存储过程或扩展存储过程上废除的对象权限可以是 EXECUTE。当废除列上的权限时，权限列表可包括 SELECT 或 UPDATE。

column

是当前数据库内要被删除权限的列名。

table

是当前数据库内要被删除权限的表名。

view

是当前数据库内要被删除权限的视图名称。

stored_procedure

是当前数据库内要被删除权限的存储过程名称。

extended_procedure

是要被删除权限的扩展存储过程名称。

user_defined_function

是要被删除权限的用户定义函数名。

TO

指定安全帐户列表。

CASCADE

指定删除来自 security_account 的权限时，也将删除由 security_account 授权的任何其它安全帐户。废除可授予的权限时使用 CASCADE。

如果要废除的权限原先是通过 WITH GRANT OPTION 设置授予 security_account 的，则指定 CASCADE 和 GRANT OPTION FOR 子句；否则将返回一个错误。指定 CASCADE 和 GRANT OPTION FOR 子句将只废除通过 WITH GRANT OPTION 设置授予 security_account 的权限以及由 security_account 授权的其它安全帐户。

AS {group | role}

指定当前数据库内的安全帐户（在其授权下执行 REVOKE 语句）的可选名称。如果给要组或角色授予对象权限，但需要在其他用户上废除该对象权限，则可以使用 AS。因为 REVOKE 语句只能由用户执行而不能由组或角色执行，所以组或角色的特定成员在该组或角色的授权下废除授予对象权限。

注释

REVOKE 只适用于当前数据库内的权限。

废除的权限只在被废除权限的级别（用户、组或角色）上删除授予或拒绝的权限。例如，给 Andrew 用户帐户显式授予了查看 authors 表的权限，该用户帐户只是 employees 角色的成员。如果废除了 employees 角色查看 authors 表的访问权，由于已显式授予了 Andrew 查看表的权限，因此该帐户仍能查看该表。只有当也废除了授予 Andrew 的权限时，Andrew 才不能查看 authors 表。如果从未显式授予 Andrew 查看 authors 的权限，那么废除 employees 角色的权限也将禁止 Andrew 查看该表。

说明 REVOKE 删除以前授予或拒绝了的权限。可能需要对使用 REVOKE 的 Microsoft® SQL Server™ 6.5 或更早版本中的脚本进行更改，以使用 DENY 维护行为。

如果用户激活一个应用程序角色，REVOKE 将不影响用户使用该应用程序角色访问对象。虽然可以废除用户访问当前数据库内特定对象的权限，但是如果应用程序有权访问该对象，则在激活该应用程序的期间该用户也有访问权。

使用 sp_helprotect 报告数据库对象或用户的权限。

权限

REVOKE 权限默认授予 sysadmin 固定服务器角色成员、db_owner 和 db_securityadmin 固定数据库角色成员以及数据库对象所有者。

示例
A. 废除授予用户帐户的语句权限

下例废除已授予用户 Joe 和 Corporate\BobJ 的 CREATE TABLE 权限。它删除了允许 Joe 与 Corporate\BobJ 创建表的权限。不过，如果已将 CREATE TABLE 权限授予给了包含 Joe 和 Corporate\BobJ 成员的任何角色，那么 Joe 和 Corporate\BobJ 仍可创建表。

REVOKE CREATE TABLE FROM Joe, [Corporate\BobJ]
B. 废除授予多个用户帐户的多个权限

下例废除授予多个用户的多个语句权限。

REVOKE CREATE TABLE, CREATE DEFAULT
FROM Mary, John
C. 废除拒绝的权限

用户 Mary 是 Budget 角色的成员，已给该角色授予了对 Budget_Data 表的 SELECT 权限。已对 Mary 使用 DENY 语句以防止 Mary 通过授予 Budget 角色的权限访问 Budget_Data 表。

下例删除对 Mary 拒绝的权限，并通过适用于 Budget 角色的 SELECT 权限，允许 Mary 对该表使用 SELECT 语句。

REVOKE SELECT ON Budget_Data TO Mary

请参见

向后兼容性

废除权限

DENY

GRANT

sp_helprotect


RIGHT

返回字符串中从右边开始指定个数的 integer_expression 字符。

语法

RIGHT ( character_expression , integer_expression )

参数

character_expression

由字符数据组成的表达式。character_expression 可以是常量、变量，也可以是字符或二进制数据的列。

integer_expression

是起始位置，用正整数表示。如果 integer_expression 是负数，则返回一个错误。

返回类型

varchar

character_expression 必须为可隐性转换为 varchar 的数据类型。否则，使用 CAST 显式转换 character_expression。

注释

兼容级别可能影响返回值。有关更多信息，请参见 sp_dbcmptlevel。

示例

下例返回每个作者名字中最右边的五个字符。

USE pubs
GO
SELECT RIGHT(au_fname, 5)
FROM authors
ORDER BY au_fname
GO

下面是结果集：

------------------
raham
Akiko
lbert
Ann
Anne
Burt
rlene
heryl
Dean
Dirk
ather
Innes
hnson
Livia
jorie
ander
chael
ichel
gstar
inald
heryl
earns
ylvia
(23 row(s) affected)

请参见

CAST 和 CONVERT

数据类型

字符串函数


ROLLBACK TRANSACTION

将显式事务或隐性事务回滚到事务的起点或事务内的某个保存点。

语法

ROLLBACK [ TRAN [ SACTION ]
[ transaction_name | @tran_name_variable
| savepoint_name | @savepoint_variable ] ]

参数

transaction_name

是给 BEGIN TRANSACTION 上的事务指派的名称。transaction_name 必须符合标识符规则，但只使用事务名称的前 32 个字符。嵌套事务时，transaction_name 必须是来自最远的 BEGIN TRANSACTION 语句的名称。

@tran_name_variable

是用户定义的、含有有效事务名称的变量的名称。必须用 char、varchar、nchar 或 nvarchar 数据类型声明该变量。

savepoint_name

是来自 SAVE TRANSACTION 语句的 savepoint_name。savepoint_name 必须符合标识符规则。当条件回滚只影响事务的一部分时使用 savepoint_name。

@savepoint_variable

是用户定义的、含有有效保存点名称的变量的名称。必须用 char、varchar、nchar 或 nvarchar 数据类型声明该变量。

注释

ROLLBACK TRANSACTION 清除自事务的起点或到某个保存点所做的所有数据修改。ROLLBACK 还释放由事务控制的资源。

不带 savepoint_name 和 transaction_name 的 ROLLBACK TRANSACTION 回滚到事务的起点。嵌套事务时，该语句将所有内层事务回滚到最远的 BEGIN TRANSACTION 语句。在这两种情况下，ROLLBACK TRANSACTION 均将 @@TRANCOUNT 系统函数减为 0。ROLLBACK TRANSACTION savepoint_name 不减少 @@TRANCOUNT。

ROLLBACK TRANSACTION 语句若指定 savepoint_name 则不释放任何锁。

在由 BEGIN DISTRIBUTED TRANSACTION 显式启动或从本地事务升级而来的分布式事务中，ROLLBACK TRANSACTION 不能引用 savepoint_name。

在执行 COMMIT TRANSACTION 语句后不能回滚事务。

在事务内允许有重复的保存点名称，但 ROLLBACK TRANSACTION 若使用重复的保存点名称，则只回滚到最近的使用该保存点名称的 SAVE TRANSACTION。

在存储过程中，不带 savepoint_name 和 transaction_name 的 ROLLBACK TRANSACTION 语句将所有语句回滚到最远的 BEGIN TRANSACTION。在存储过程中，ROLLBACK TRANSACTION 语句使 @@TRANCOUNT 在触发器完成时的值不同于调用该存储过程时的 @@TRANCOUNT 值，并且生成一个信息。该信息不影响后面的处理。

如果在触发器中发出 ROLLBACK TRANSACTION：

  • 将回滚对当前事务中的那一点所做的所有数据修改，包括触发器所做的修改。

  • 触发器继续执行 ROLLBACK 语句之后的所有其余语句。如果这些语句中的任意语句修改数据，则不回滚这些修改。执行其余的语句不会激发嵌套触发器。

  • 在批处理中，不执行所有位于激发触发器的语句之后的语句。

每次进入触发器，@@TRANCOUNT 就增加 1，即使在自动提交模式下也是如此。（系统将触发器视作隐性嵌套事务。）

在存储过程中，ROLLBACK TRANSACTION 语句不影响调用该过程的批处理中的后续语句；将执行批处理中的后续语句。在触发器中，ROLLBACK TRANSACTION 语句终止含有激发触发器的语句的批处理；不执行批处理中的后续语句。

ROLLBACK TRANSACTION 语句不生成显示给用户的信息。如果在存储过程或触发器中需要警告，请使用 RAISERROR 或 PRINT 语句。RAISERROR 是用于指出错误的首选语句。

ROLLBACK 对游标的影响由下面三个规则定义：

  1. 当 CURSOR_CLOSE_ON_COMMIT 设置为 ON 时，ROLLBACK 关闭但不释放所有打开的游标。

  2. 当 CURSOR_CLOSE_ON_COMMIT 设置为 OFF 时，ROLLBACK 不影响任何打开的同步 STATIC 或 INSENSITIVE 游标，也不影响已完全填充的异步 STATIC 游标。将关闭但不释放任何其它类型的打开的游标。

  3. 对于导致终止批处理并生成内部回滚的错误，将释放在含有该错误语句的批处理内声明的所有游标。不论游标的类型或 CURSOR_CLOSE_ON_COMMIT 的设置，所有游标均将被释放，其中包括在该错误批处理所调用的存储过程内声明的游标。在该错误批处理之前的批处理内声明的游标以规则 1 和 2 为准。死锁错误就属于这类错误。在触发器中发出的 ROLLBACK 语句也自动生成这类错误。
权限

ROLLBACK TRANSACTION 权限默认授予任何有效用户。

请参见

BEGIN DISTRIBUTED TRANSACTION

BEGIN TRANSACTION

COMMIT TRANSACTION

COMMIT WORK

游标锁定

ROLLBACK WORK

SAVE TRANSACTION

事务


ROLLBACK WORK

将用户定义的事务回滚到事务的起点。

语法

ROLLBACK [ WORK ]

注释

该语句的功能与 ROLLBACK TRANSACTION 相同，除非 ROLLBACK TRANSACTION 接受用户定义的事务名称。不论是否指定可选的 WORK 关键字，该 ROLLBACK 语法都遵从 SQL-92 标准。

嵌套事务时，ROLLBACK WORK 始终回滚到最远的 BEGIN TRANSACTION 语句，并将 @@TRANCOUNT 系统函数减为 0。

权限

ROLLBACK WORK 权限默认授予任何有效用户。

请参见

BEGIN DISTRIBUTED TRANSACTION

BEGIN TRANSACTION

COMMIT TRANSACTION

COMMIT WORK

ROLLBACK TRANSACTION

SAVE TRANSACTION

事务


ROUND

返回数字表达式并四舍五入为指定的长度或精度。

语法

ROUND ( numeric_expression , length [ , function ] )

参数

numeric_expression

精确数字或近似数字数据类型类别的表达式（bit 数据类型除外）。

length

是 numeric_expression 将要四舍五入的精度。length 必须是 tinyint、smallint 或int。当 length 为正数时，numeric_expression 四舍五入为 length 所指定的小数位数。当 length 为负数时，numeric_expression 则按 length 所指定的在小数点的左边四舍五入。

function

是要执行的操作类型。function 必须是 tinyint、smallint 或 int。如果省略 function 或 function 的值为 0（默认），numeric_expression 将四舍五入。当指定 0 以外的值时，将截断 numeric_expression。

返回类型

返回与 numeric_expression 相同的类型。

注释

ROUND 始终返回一个值。如果 length 是负数且大于小数点前的数字个数，ROUND 将返回 0。

示例 | 结果
ROUND(748.58, -4) | 0

当 length 是负数时，无论什么数据类型，ROUND 都将返回一个四舍五入的 numeric_expression。

示例 | 结果
ROUND(748.58, -1) | 750.00
ROUND(748.58, -2) | 700.00
ROUND(748.58, -3) | 1000.00

示例
A. 使用 ROUND 和估计值

下例显示两个表达式，说明使用 ROUND 函数且最后一个数字始终是估计值。

SELECT ROUND(123.9994, 3), ROUND(123.9995, 3)
GO

下面是结果集：

----------- -----------
123.9990    124.0000
B. 使用 ROUND 和四舍五入的近似值

下例显示四舍五入和近似值。

语句 结果
SELECT ROUND(123.4545, 2)

123.4500

SELECT ROUND(123.45, -2)

100.00

C. 使用 ROUND 截断

下例使用两个 SELECT 语句说明四舍五入和截断之间的区别。第一个语句四舍五入结果。第二个语句截断结果。

语句 结果
SELECT ROUND(150.75, 0)

151.00

SELECT ROUND(150.75, 0, 1)

150.00

请参见

CEILING

数据类型

表达式

FLOOR

数学函数


ROWCOUNT_BIG

返回受执行的最后一个语句影响的行数。该函数的功能与 @@ROWCOUNT 一样，除非 ROWCOUNT_BIG 的返回类型是 bigint。

语法

ROWCOUNT_BIG ( )

返回类型

bigint

注释

位于 SELECT 语句之后时，该函数返回由 SELECT 语句返回的行数。

位于 INSERT、UPDATE 或 DELETE 语句之后时，该函数返回受数据修改语句影响的行数。

位于 IF 这类不返回行的语句之后时，该函数返回零 (0)。

请参见

COUNT_BIG

数据类型


RTRIM

截断所有尾随空格后返回一个字符串。

语法

RTRIM ( character_expression )

参数

character_expression

由字符数据组成的表达式。character_expression 可以是常量、变量，也可以是字符或二进制数据的列。

返回类型

varchar

注释

character_expression 必须为可隐性转换为 varchar 的数据类型。否则请使用 CAST 函数显式转换 character_expression。

说明 兼容级别可能影响返回值。有关更多信息，请参见 sp_dbcmptlevel。

示例

下例显示如何使用 RTRIM 删除字符变量中的尾随空格。

DECLARE @string_to_trim varchar(60)
SET @string_to_trim = 'Four spaces are after the period in this sentence.    '
SELECT 'Here is the string without the leading spaces: ' + CHAR(13) +
   RTRIM(@string_to_trim)
GO

下面是结果集：

(1 row(s) affected)
------------------------------------------------------------------------
Here is the string without the leading spaces: Four spaces are after the period in this sentence.
(1 row(s) affected)

请参见

CAST 和 CONVERT

数据类型

字符串函数


SAVE TRANSACTION

在事务内设置保存点。

语法

SAVE TRAN [ SACTION ] { savepoint_name | @savepoint_variable }

参数

savepoint_name

是指派给保存点的名称。保存点名称必须符合标识符规则，但只使用前 32 个字符。

@savepoint_variable

是用户定义的、含有有效保存点名称的变量的名称。必须用 char、varchar、nchar 或 nvarchar 数据类型声明该变量。

注释

用户可以在事务内设置保存点或标记。保存点定义如果有条件地取消事务的一部分，事务可以返回的位置。如果将事务回滚到保存点，则必须（如果需要，使用更多的 Transact-SQL 语句和 COMMIT TRANSACTION 语句）继续完成事务，或者必须（通过将事务回滚到其起始点）完全取消事务。若要取消整个事务，请使用 ROLLBACK TRANSACTION transaction_name 格式。这将撤消事务的所有语句和过程。

在由 BEGIN DISTRIBUTED TRANSACTION 显式启动或从本地事务升级而来的分布式事务中，不支持 SAVE TRANSACTION。

重要 当事务开始时，将一直控制事务中所使用的资源直到事务完成（也就是锁定）。当将事务的一部分回滚到保存点时，将继续控制资源直到事务完成（或者回滚全部事务）。

权限

默认情况下，将 SAVE TRANSACTION 权限授予任何有效用户。

示例

下例更改分给 The Gourmet Microwave 的两位作者的版税。数据库将会在两个更新间不一致，因此必须将它们分组为用户定义的事务。

BEGIN TRANSACTION royaltychange
   UPDATE titleauthor
      SET royaltyper = 65
         FROM titleauthor, titles
            WHERE royaltyper = 75
               AND titleauthor.title_id = titles.title_id
               AND title = 'The Gourmet Microwave'
   UPDATE titleauthor
      SET royaltyper = 35
         FROM titleauthor, titles
            WHERE royaltyper = 25
               AND titleauthor.title_id = titles.title_id
               AND title = 'The Gourmet Microwave'
SAVE TRANSACTION percentchanged

/*
After having updated the royaltyper entries for the two authors, the
user inserts the savepoint percentchanged, and then determines how a
10-percent increase in the book's price would affect the authors' royalty earnings.
*/

UPDATE titles
   SET price = price * 1.1
      WHERE title = 'The Gourmet Microwave'
SELECT (price * royalty * ytd_sales) * royaltyper
   FROM titles, titleauthor
      WHERE title = 'The Gourmet Microwave'
         AND titles.title_id = titleauthor.title_id
/*
The transaction is rolled back to the savepoint
with the ROLLBACK TRANSACTION statement.
*/

ROLLBACK TRANSACTION percentchanged
COMMIT TRANSACTION

/* End of royaltychange. */

请参见

批处理

BEGIN TRANSACTION

COMMIT TRANSACTION

COMMIT WORK

CREATE PROCEDURE

CREATE TRIGGER

DELETE

INSERT

ROLLBACK TRANSACTION

ROLLBACK WORK

SELECT

事务保存点

UPDATE


SCOPE_IDENTITY

返回插入到同一作用域中的 IDENTITY 列内的最后一个 IDENTITY 值。一个作用域就是一个模块——存储过程、触发器、函数或批处理。因此，如果两个语句处于同一个存储过程、函数或批处理中，则它们位于相同的作用域中。

语法

SCOPE_IDENTITY( )

返回类型

sql_variant

注释

SCOPE_IDENTITY、IDENT_CURRENT 和 @@IDENTITY 在功能上相似，因为它们都返回插入到 IDENTITY 列中的值。

IDENT_CURRENT 不受作用域和会话的限制，而受限于指定的表。IDENT_CURRENT 返回为任何会话和作用域中的特定表所生成的值。有关更多信息，请参见 IDENT_CURRENT。

SCOPE_IDENTITY 和 @@IDENTITY 返回在当前会话中的任何表内所生成的最后一个标识值。但是，SCOPE_IDENTITY 只返回插入到当前作用域中的值；@@IDENTITY 不受限于特定的作用域。

例如，有两个表 T1 和 T2，在 T1 上定义了一个 INSERT 触发器。当将某行插入 T1 时，触发器被激发，并在 T2 中插入一行。此例说明了两个作用域：一个是在 T1 上的插入，另一个是作为触发器的结果在 T2 上的插入。

假设 T1 和 T2 都有 IDENTITY 列，@@IDENTITY 和 SCOPE_IDENTITY 将在 T1 上的 INSERT 语句的最后返回不同的值。

@@IDENTITY 返回插入到当前会话中任何作用域内的最后一个 IDENTITY 列值，该值是插入 T2 中的值。

SCOPE_IDENTITY() 返回插入 T1 中的 IDENTITY 值，该值是发生在相同作用域中的最后一个 INSERT。如果在作用域中发生插入语句到标识列之前唤醒调用 SCOPE_IDENTITY() 函数，则该函数将返回 NULL 值。

有关说明，请参见示例。

示例

下列示例将创建两个表 TZ 和 TY，并在 TZ 上创建一个 INSERT 触发器。当将某行插入表 TZ 中时，触发器 (Ztrig) 将激发并在 TY 中插入一行。

USE tempdb
GO
CREATE TABLE TZ (
   Z_id  int IDENTITY(1,1)PRIMARY KEY,
   Z_name varchar(20) NOT NULL)

INSERT TZ
   VALUES ('Lisa')
INSERT TZ
   VALUES ('Mike')
INSERT TZ
   VALUES ('Carla')

SELECT * FROM TZ

--Result set: This is how table TZ looks
Z_id   Z_name
-------------
1      Lisa
2      Mike
3      Carla

CREATE TABLE TY (
   Y_id  int IDENTITY(100,5)PRIMARY KEY,
   Y_name varchar(20) NULL)

INSERT TY (Y_name)
   VALUES ('boathouse')
INSERT TY (Y_name)
   VALUES ('rocks')
INSERT TY (Y_name)
   VALUES ('elevator')

SELECT * FROM TY
--Result set: This is how TY looks:
Y_id  Y_name
---------------
100   boathouse
105   rocks
110   elevator

/*Create the trigger that inserts a row in table TY
when a row is inserted in table TZ*/
CREATE TRIGGER Ztrig
ON TZ
FOR INSERT AS
   BEGIN
   INSERT TY VALUES ('')
   END

/*FIRE the trigger and find out what identity values you get
with the @@IDENTITY and SCOPE_IDENTITY functions*/
INSERT TZ VALUES ('Rosalie')

SELECT SCOPE_IDENTITY() AS [SCOPE_IDENTITY]
GO
SELECT   @@IDENTITY AS [@@IDENTITY]
GO

--Here is the result set.
SCOPE_IDENTITY
4
/*SCOPE_IDENTITY returned the last identity value in the same scope, which was the insert on table TZ*/

@@IDENTITY
115
/*@@IDENTITY returned the last identity value inserted to TY by the trigger, which fired due to an earlier insert on TZ*/

请参见

@@IDENTITY


SELECT

从数据库中检索行，并允许从一个或多个表中选择一个或多个行或列。虽然 SELECT 语句的完整语法较复杂，但是其主要的子句可归纳如下：

SELECT select_list
[ INTO new_table ]
FROM table_source
[ WHERE search_condition ]
[ GROUP BY group_by_expression ]
[ HAVING search_condition ]
[ ORDER BY order_expression [ ASC | DESC ] ]

可以在查询之间使用 UNION 运算符，以将查询的结果组合成单个结果集。

语法

SELECT statement ::=
< query_expression >
[ ORDER BY { order_by_expression | column_position [ ASC | DESC ] }
[ ,...n ] ]
    [ COMPUTE
{ { AVG | COUNT | MAX | MIN | SUM } ( expression ) } [ ,...n ]
        [ BY expression [ ,...n ] ]
]
    [ FOR { BROWSE | XML { RAW | AUTO | EXPLICIT }
[ , XMLDATA ]
[ , ELEMENTS ]
[ , BINARY base64 ]
}
]
    [ OPTION ( < query_hint > [ ,...n ]) ]

< query expression > ::=
{ < query specification > | ( < query expression > ) }
    [ UNION [ ALL ] < query specification | ( < query expression > ) [...n ] ]

< query specification > ::=
SELECT [ ALL | DISTINCT ]
[ { TOP integer | TOP integer PERCENT } [ WITH TIES ] ]
< select_list >
[ INTO new_table ]
[ FROM { < table_source > } [ ,...n ] ]
[ WHERE < search_condition > ]
[ GROUP BY [ ALL ] group_by_expression [ ,...n ]
[ WITH { CUBE | ROLLUP } ]
]
    [HAVING <search_condition>]

由于 SELECT 语句的复杂性，下面按子句说明详细的语法元素和参数：


SELECT 示例

A. 使用 SELECT 检索行和列

下例显示三个代码示例。第一个代码示例从 pubs 数据库内的 authors 表中返回所有行（没有指定 WHERE 子句）和所有列（使用 *）。

USE pubs
SELECT *
FROM authors
ORDER BY au_lname ASC, au_fname ASC

-- Alternate way.
USE pubs
SELECT authors.*
FROM customers
ORDER BY au_lname ASC, au_fname ASC

下例从 pubs 数据库内的 authors 表中返回所有行（没有指定 WHERE 子句）和列的一个子集（au_lname、au_fname、phone、city、state）。另外，还添加列标题。

USE pubs
SELECT au_fname, au_lname, phone AS Telephone, city, state
FROM authors
ORDER BY au_lname ASC, au_fname ASC

下例只返回居住在加利福尼亚州且不姓 McBadden 的作者列。

USE pubs
SELECT au_fname, au_lname, phone AS Telephone
FROM authors
WHERE state = 'CA' and au_lname <> 'McBadden'
ORDER BY au_lname ASC, au_fname ASC
B. 在列标题和列计算中使用 SELECT

这些示例返回 titles 内的所有行。第一个示例返回本年度截止到现在的销售总额以及应付给每个作者和出版商的金额。在第二个示例中，计算每本书的总收入。

USE pubs
SELECT ytd_sales AS Sales,
   authors.au_fname + ' '+ authors.au_lname AS Author,
   ToAuthor = (ytd_sales * royalty) / 100,
   ToPublisher = ytd_sales - (ytd_sales * royalty) / 100
FROM titles INNER JOIN titleauthor
   ON titles.title_id = titleauthor.title_id INNER JOIN authors
   ON titleauthor.au_id = authors.au_id
ORDER BY Sales DESC, Author ASC

下面是结果集：

Sales       Author                    ToAuthor    ToPublisher
----------- ------------------------- ----------- -----------
22246       Anne Ringer               5339        16907
22246       Michel DeFrance           5339        16907
18722       Marjorie Green            4493        14229
15096       Reginald Blotchet-Halls   2113        12983
8780        Cheryl Carson             1404        7376
4095        Abraham Bennet            409         3686
4095        Akiko Yokomoto            409         3686
4095        Ann Dull                  409         3686
4095        Burt Gringlesby           409         3686
4095        Dean Straight             409         3686
4095        Marjorie Green            409         3686
4095        Michael O'Leary           409         3686
4095        Sheryl Hunter             409         3686
4072        Johnson White             407         3665
3876        Michael O'Leary           387         3489
3876        Stearns MacFeather        387         3489
3336        Charlene Locksley         333         3003
2045        Albert Ringer             245         1800
2045        Anne Ringer               245         1800
2032        Innes del Castillo        243         1789
375         Livia Karsen              37          338
375         Stearns MacFeather        37          338
375         Sylvia Panteley           37          338
111         Albert Ringer             11          100
NULL        Charlene Locksley         NULL        NULL

(25 row(s) affected)

下面是用于计算每本书的总收入的查询：

USE pubs
SELECT 'Total income is', price * ytd_sales AS Revenue,
'for', title_id AS Book#
FROM titles
ORDER BY Book# ASC

下面是结果集：

Revenue                                    Book#
--------------- --------------------- ---- ------
Total income is 81859.0500            for  BU1032
Total income is 46318.2000            for  BU1111
Total income is 55978.7800            for  BU2075
Total income is 81859.0500            for  BU7832
Total income is 40619.6800            for  MC2222
Total income is 66515.5400            for  MC3021
Total income is NULL                  for  MC3026
Total income is 201501.0000           for  PC1035
Total income is 81900.0000            for  PC8888
Total income is NULL                  for  PC9999
Total income is 8096.2500             for  PS1372
Total income is 22392.7500            for  PS2091
Total income is 777.0000              for  PS2106
Total income is 81399.2800            for  PS3333
Total income is 26654.6400            for  PS7777
Total income is 7856.2500             for  TC3218
Total income is 180397.2000           for  TC4203
Total income is 61384.0500            for  TC7777

(18 row(s) affected)
C. 将 DISTINCT 与 SELECT 一起使用

下例使用 DISTINCT 防止检索重复的作者 ID 号：

USE pubs
SELECT DISTINCT au_id
FROM authors
ORDER BY au_id
D. 使用 SELECT INTO 创建表

第一个示例在tempdb 中创建一个名为 #coffeetabletitles 的临时表。为使用该表，始终用下面显示的精确名称（包括井号 (#)）引用它。

USE pubs
DROP TABLE #coffeetabletitles
GO
SET NOCOUNT ON
SELECT * INTO #coffeetabletitles
FROM titles
WHERE price < $20
SET NOCOUNT OFF
SELECT name
FROM tempdb..sysobjects
WHERE name LIKE '#c%'

下面是结果集：

name
------------------------------------------------------------------------
#coffeetabletitles__________________________________________________________________________________________________000000000028

(1 row(s) affected)

CHECKPOINTing database that was changed.

(12 row(s) affected)

name
------------------------------------------------------------------------
newtitles

(1 row(s) affected)

CHECKPOINTing database that was changed.

第二个示例创建一个名为 newtitles 的永久表。

USE pubs
IF EXISTS (SELECT table_name FROM INFORMATION_SCHEMA.TABLES
      WHERE table_name = 'newtitles')
   DROP TABLE newtitles
GO
EXEC sp_dboption 'pubs', 'select into/bulkcopy', 'true'
USE pubs
SELECT * INTO newtitles
FROM titles
WHERE price > $25 OR price < $20
SELECT name FROM sysobjects WHERE name LIKE 'new%'
USE master
EXEC sp_dboption 'pubs', 'select into/bulkcopy', 'false'

下面是结果集：

name
------------------------------
newtitles

(1 row(s) affected)
E. 使用相关子查询

下例显示在语义上相当的查询并说明使用 EXISTS 关键字和 IN 关键字的区别。下面是两个示例，显示一个有效子查询检索书名为商业书籍的每个出版商名称，还检索 titles 表和 publishers 表之间相匹配的出版商 ID 号。

USE pubs
SELECT DISTINCT pub_name
FROM publishers
WHERE EXISTS
   (SELECT *
   FROM titles
   WHERE pub_id = publishers.pub_id
   AND type = 'business')

-- Or
USE pubs
SELECT distinct pub_name
FROM publishers
WHERE pub_id IN
   (SELECT pub_id
   FROM titles
   WHERE type = 'business')

下例在一个相关（或重复）子查询中使用 IN，该查询的值取决于外部查询。它被重复执行，为外部查询可能选择的每行各执行一次。该查询在 titleauthor 表中检索每个版税为 100% 且作者标识号在 titleauthor 表和 authors 中相匹配的作者的名和姓。

USE pubs
SELECT DISTINCT au_lname, au_fname
FROM authors
WHERE 100 IN
   (SELECT royaltyper
   FROM titleauthor
   WHERE titleauthor.au_id = authors.au_id)

不能独立于外部查询对上述语句中的子查询取值。它需要一个 authors.au_id 值，但是该值随 Microsoft® SQL Server™ 检查 authors 中的不同行而改变。

相关子查询还可以用于外部查询的 HAVING 子句。下例查找那些预付款最大金额是组平均值两倍以上的书籍类型。

USE pubs
SELECT t1.type
FROM titles t1
GROUP BY t1.type
HAVING MAX(t1.advance) >= ALL
   (SELECT 2 * AVG(t2.advance)
   FROM titles t2
   WHERE t1.type = t2.type)

下例使用两个相关子查询查找作者姓名，这些作者至少参与过一本受欢迎的计算机书籍的创作。

USE pubs
SELECT au_lname, au_fname
FROM authors
WHERE au_id IN
   (SELECT au_id
   FROM titleauthor
   WHERE title_id IN
      (SELECT title_id
      FROM titles
      WHERE type = 'popular_comp'))
F. 使用 GROUP BY

下例在数据库内查找各出版商的本年度截止到现在的销售总额。

USE pubs
SELECT pub_id, SUM(ytd_sales) AS total
FROM titles
GROUP BY pub_id
ORDER BY pub_id

下面是结果集：

pub_id   total
------   -----
0736      28286
0877      44219
1389      24941

(3 row(s) affected)

由于使用了 GROUP BY 子句，只为每个出版商各返回一个含有销售总额的行。

G. 对多个组使用 GROUP BY

下例查找按类型和出版商 ID 分组的平均价格和本年度截止到现在的销售总额。

USE pubs
SELECT type, pub_id, AVG(price) AS 'avg', sum(ytd_sales) AS 'sum'
FROM titles
GROUP BY type, pub_id
ORDER BY type, pub_id

下面是结果集：

type         pub_id avg                   sum
------------ ------ --------------------- -----------
business     0736   2.9900                18722
business     1389   17.3100               12066
mod_cook     0877   11.4900               24278
popular_comp 1389   21.4750               12875
psychology   0736   11.4825               9564
psychology   0877   21.5900               375
trad_cook    0877   15.9633               19566
UNDECIDED    0877   NULL                  NULL

(8 row(s) affected)

Warning, null value eliminated from aggregate.
H. 使用 GROUP BY 和 WHERE

下例在只检索预付款多于 $5,000 的行后，将结果分成组。

USE pubs
SELECT type, AVG(price)
FROM titles
WHERE advance > $5000
GROUP BY type
ORDER BY type

下面是结果集：

type
------------ --------------------------
business     2.99
mod_cook     2.99
popular_comp 21.48
psychology   14.30
trad_cook    17.97

(5 row(s) affected)
I. 将 GROUP BY 与表达式一起使用

下例按表达式分组。如果表达式不包含聚合函数，则可以按表达式分组。

USE pubs
SELECT AVG(ytd_sales), ytd_sales * royalty
FROM titles
GROUP BY ytd_sales * royalty
ORDER BY ytd_sales * royalty

下面是结果集：

----------- -----------
NULL        NULL
111         1110
375         3750
2032        24384
2045        24540
3336        33360
3876        38760
4072        40720
4095        40950
8780        140480
15096       211344
18722       449328
22246       533904

(13 row(s) affected)
J. 比较 GROUP BY 和 GROUP BY ALL

第一个示例只为要求 10% 版税的书籍生成组。由于没有含 10% 版税的现代烹调书籍，因此结果中没有 mod_cook 类型的组。

第二个示例为所有类型均生成组，包括现代烹调书籍和 UNDECIDED，尽管现代烹调书籍组中没有任何行符合 WHERE 子句中指定的条件。

对于没有符合条件的行的组，容纳聚合值的列（平均价格）为 NULL。

USE pubs
SELECT type, AVG(price)
FROM titles
WHERE royalty = 10
GROUP BY type
ORDER BY type

下面是结果集：

type
------------ --------------------------
business     17.31
popular_comp 20.00
psychology   14.14
trad_cook    17.97

(4 row(s) affected)

-- Using GROUP BY ALL
USE pubs
SELECT type, AVG(price)
FROM titles
WHERE royalty = 10
GROUP BY all type
ORDER BY type

下面是结果集：

type
------------ --------------------------
business     17.31
mod_cook     NULL
popular_comp 20.00
psychology   14.14
trad_cook    17.97
UNDECIDED    NULL

(6 row(s) affected)
K. 将 GROUP BY 与 ORDER BY 一起使用

下例查找各类书籍的平均价格并按平均价格排序结果。

USE pubs
SELECT type, AVG(price)
FROM titles
GROUP BY type
ORDER BY AVG(price)

下面是结果集：

type
------------ --------------------------
UNDECIDED    NULL
mod_cook     11.49
psychology   13.50
business     13.73
trad_cook    15.96
popular_comp 21.48

(6 row(s) affected)
L. 使用 HAVING 子句

第一个示例显示带聚合函数的 HAVING 子句。该子句按类型分组 titles 表中的行，并且消除只包含一本书的组。第二个示例显示不带聚合函数的 HAVING 子句。该子句按类型分组 titles 表中的行，并且消除不是以字母 p 开头的类型。

USE pubs
SELECT type
FROM titles
GROUP BY type
HAVING COUNT(*) > 1
ORDER BY type

下面是结果集：

type
------------
business
mod_cook
popular_comp
psychology
trad_cook

(5 row(s) affected)

该查询在 HAVING 子句中使用 LIKE 子句。

USE pubs
SELECT type
FROM titles
GROUP BY type
HAVING type LIKE 'p%'
ORDER BY type

下面是结果集：

type
------------
popular_comp
psychology

(2 row(s) affected)
M. 使用 HAVING 和 GROUP BY

下例显示在一个 SELECT 语句中使用 GROUP BY、HAVING、WHERE 和 ORDER BY 子句。该语句生成组和汇总值，但却是在消除那些价格低于 $5 的书名后才生成组和汇总值。它还按 pub_id 组织结果。

USE pubs
SELECT pub_id, SUM(advance), AVG(price)
FROM titles
WHERE price >= $5
GROUP BY pub_id
HAVING SUM(advance) > $15000
   AND AVG(price) < $20
   AND pub_id > '0800'
ORDER BY pub_id

下面是结果集：

pub_id
------ -------------------------- --------------------------
0877   26,000.00                  17.89
1389   30,000.00                  18.98

(2 row(s) affected)
N. 将 HAVING 与 SUM 和 AVG 一起使用

下例按出版商分组 titles 表，并只包括那些支付的预付款总额超过 $25,000 且平均书价高于 $15 的出版商的组。

USE pubs
SELECT pub_id, SUM(advance), AVG(price)
FROM titles
GROUP BY pub_id
HAVING SUM(advance) > $25000
AND AVG(price) > $15

若要查看本年度截止到现在的销售额超过 $40,000 的出版商，请使用下面的查询：

USE pubs
SELECT pub_id, total = SUM(ytd_sales)
FROM titles
GROUP BY pub_id
HAVING SUM(ytd_sales) > 40000

如果想确保对每个出版商的计算中至少包含六本书，则使用 HAVING COUNT(*) > 5 消除返回的总数小于六本书的出版商。该查询是这样的：

USE pubs
SELECT pub_id, SUM(ytd_sales) AS total
FROM titles
GROUP BY pub_id
HAVING COUNT(*) > 5

下面是结果集：

pub_id   total
------   -----
0877      44219
1389      24941

(2 row(s) affected)

使用该语句，返回了两行。消除了 New Moon Books (0736)。

O. 使用 COMPUTE BY 计算组合计

下例使用两个代码示例显示 COMPUTE BY 的用法。第一个代码示例使用一个带一个聚合函数的 COMPUTE BY，第二个代码示例使用一个带两个聚合函数的 COMPUTE BY 函数。

下例先按书籍类型，再按书籍价格计算每类烹调书籍（价格高于 $10）的价格总和。

USE pubs
SELECT type, price
FROM titles
WHERE price > $10
   AND type LIKE '%cook'
ORDER BY type, price
COMPUTE SUM(price) BY type

下面是结果集：

type         price
------------ ---------------------
mod_cook     19.9900

(1 row(s) affected)

sum
---------------------
19.9900

(1 row(s) affected)

type         price
------------ ---------------------
trad_cook    11.9500
trad_cook    14.9900
trad_cook    20.9500

(3 row(s) affected)

sum
---------------------
47.8900

(1 row(s) affected)

下例检索所有烹饪书籍的书籍类型、出版商标识号和价格。COMPUTE BY 子句使用两个不同的聚合函数。

USE pubs
SELECT type, pub_id, price
FROM titles
WHERE type LIKE '%cook'
ORDER BY type, pub_id
COMPUTE SUM(price), MAX(pub_id) BY type

下面是结果集：

type         pub_id price
------------ ------ ---------------------
mod_cook     0877   19.9900
mod_cook     0877   2.9900

(2 row(s) affected)

sum                   max
--------------------- ----
22.9800               0877

(1 row(s) affected)

type         pub_id price
------------ ------ ---------------------
trad_cook    0877   20.9500
trad_cook    0877   11.9500
trad_cook    0877   14.9900

(3 row(s) affected)

sum                   max
--------------------- ----
47.8900               0877

(1 row(s) affected)
P. 使用不带 BY 的 COMPUTE 计算总计值

可以使用不带 BY 的 COMPUTE 关键字生成总计值、总计数，等等。

该语句查找超过 $20 的所有类型书籍的价格和预付款总计。

USE pubs
SELECT type, price, advance
FROM titles
WHERE price > $20
COMPUTE SUM(price), SUM(advance)

在同一查询内可以使用 COMPUTE BY 和不带 BY 的 COMPUTE。该查询按类型查找价格总和和预付款总和，然后计算所有类型书籍的价格总计和预付款总计。

USE pubs
SELECT type, price, advance
FROM titles
WHERE type LIKE '%cook'
ORDER BY type, price
COMPUTE SUM(price), SUM(advance) BY type
COMPUTE SUM(price), SUM(advance)

下面是结果集：

type         price                 advance
------------ --------------------- ---------------------
mod_cook     2.9900                15000.0000
mod_cook     19.9900               .0000

(2 row(s) affected)

sum                   sum
--------------------- ---------------------
22.9800               15000.0000

(1 row(s) affected)

type         price                 advance
------------ --------------------- ---------------------
trad_cook    11.9500               4000.0000
trad_cook    14.9900               8000.0000
trad_cook    20.9500               7000.0000

(3 row(s) affected)

sum                   sum
--------------------- ---------------------
47.8900               19000.0000

(1 row(s) affected)

sum                   sum
--------------------- ---------------------
70.8700               34000.0000

(1 row(s) affected)
Q. 计算所有行上的计算总和

下例只显示选择列表内的三列，并在结果的最后提供基于所有价格和所有预付款的合计。

USE pubs
SELECT type, price, advance
FROM titles
COMPUTE SUM(price), SUM(advance)

下面是结果集：

type         price                 advance
------------ --------------------- ---------------------
business     19.9900               5000.0000
business     11.9500               5000.0000
business     2.9900                10125.0000
business     19.9900               5000.0000
mod_cook     19.9900               .0000
mod_cook     2.9900                15000.0000
UNDECIDED    NULL                  NULL
popular_comp 22.9500               7000.0000
popular_comp 20.0000               8000.0000
popular_comp NULL                  NULL
psychology   21.5900               7000.0000
psychology   10.9500               2275.0000
psychology   7.0000                6000.0000
psychology   19.9900               2000.0000
psychology   7.9900                4000.0000
trad_cook    20.9500               7000.0000
trad_cook    11.9500               4000.0000
trad_cook    14.9900               8000.0000

(18 row(s) affected)

sum                   sum
--------------------- ---------------------
236.2600              95400.0000

(1 row(s) affected)

Warning, null value eliminated from aggregate.
R. 使用多个 COMPUTE 子句

下例查找所有心理学书籍的价格总和，以及按出版商分类的心理学书籍的价格总和。通过包含一个以上的 COMPUTE BY 子句，可以在同一语句内使用不同的聚合函数。

USE pubs
SELECT type, pub_id, price
FROM titles
WHERE type = 'psychology'
ORDER BY type, pub_id, price
COMPUTE SUM(price) BY type, pub_id
COMPUTE SUM(price) BY type

下面是结果集：

type         pub_id price
------------ ------ ---------------------
psychology   0736   7.0000
psychology   0736   7.9900
psychology   0736   10.9500
psychology   0736   19.9900

(4 row(s) affected)

sum
---------------------
45.9300

(1 row(s) affected)

type         pub_id price
------------ ------ ---------------------
psychology   0877   21.5900

(1 row(s) affected)

sum
---------------------
21.5900

(1 row(s) affected)

sum
---------------------
67.5200

(1 row(s) affected)
S. 比较 GROUP BY 与 COMPUTE

第一个示例使用 COMPUTE 子句计算不同类型烹调书籍的价格总和。第二个示例只使用 GROUP BY 生成相同的汇总信息。

USE pubs
-- Using COMPUTE
SELECT type, price
FROM titles
WHERE type like '%cook'
ORDER BY type, price
COMPUTE SUM(price) BY type

下面是结果集：

type         price
------------ ---------------------
mod_cook     2.9900
mod_cook     19.9900

(2 row(s) affected)

sum
---------------------
22.9800

(1 row(s) affected)

type         price
------------ ---------------------
trad_cook    11.9500
trad_cook    14.9900
trad_cook    20.9500

(3 row(s) affected)

sum
---------------------
47.8900

(1 row(s) affected)

下面是另一个使用 GROUP BY 的查询：

USE pubs
-- Using GROUP BY
SELECT type, SUM(price)
FROM titles
WHERE type LIKE '%cook'
GROUP BY type
ORDER BY type

下面是结果集：

type
------------ ---------------------
mod_cook     22.9800
trad_cook    47.8900

(2 row(s) affected)
T. 将 SELECT 与 GROUP BY、COMPUTE 和 ORDER BY 子句一起使用

下例只返回含有本年度截止到现在的当前销售额的行，然后按 type 以递减顺序计算书籍的平均价格和预付款总额。将返回四个数据列，包括截断的书名。所有的计算列都出现在选择列表内。

USE pubs
SELECT CAST(title AS char(20)) AS title, type, price, advance
FROM titles
WHERE ytd_sales IS NOT NULL
ORDER BY type DESC
COMPUTE AVG(price), SUM(advance) BY type
COMPUTE SUM(price), SUM(advance)

下面是结果集：

title                type         price                 advance
-------------------- ------------ --------------------- ----------------
Onions, Leeks, and G trad_cook    20.9500               7000.0000
Fifty Years in Bucki trad_cook    11.9500               4000.0000
Sushi, Anyone?       trad_cook    14.9900               8000.0000

(3 row(s) affected)

avg                   sum
--------------------- ---------------------
15.9633               19000.0000

(1 row(s) affected)

title                type         price                 advance
-------------------- ------------ --------------------- ----------------
Computer Phobic AND  psychology   21.5900               7000.0000
Is Anger the Enemy?  psychology   10.9500               2275.0000
Life Without Fear    psychology   7.0000                6000.0000
Prolonged Data Depri psychology   19.9900               2000.0000
Emotional Security:  psychology   7.9900                4000.0000

(5 row(s) affected)

avg                   sum
--------------------- ---------------------
13.5040               21275.0000

(1 row(s) affected)

title                type         price                 advance
-------------------- ------------ --------------------- ----------------
But Is It User Frien popular_comp 22.9500               7000.0000
Secrets of Silicon V popular_comp 20.0000               8000.0000

(2 row(s) affected)

avg                   sum
--------------------- ---------------------
21.4750               15000.0000

(1 row(s) affected)

title                type         price                 advance
-------------------- ------------ --------------------- ----------------
Silicon Valley Gastr mod_cook     19.9900               .0000
The Gourmet Microwav mod_cook     2.9900                15000.0000

(2 row(s) affected)

avg                   sum
--------------------- ---------------------
11.4900               15000.0000

(1 row(s) affected)

title                type         price                 advance
-------------------- ------------ --------------------- ----------------
The Busy Executive's business     19.9900               5000.0000
Cooking with Compute business     11.9500               5000.0000
You Can Combat Compu business     2.9900                10125.0000
Straight Talk About  business     19.9900               5000.0000

(4 row(s) affected)

avg                   sum
--------------------- ---------------------
13.7300               25125.0000

(1 row(s) affected)

sum                   sum
--------------------- ---------------------
236.2600              95400.0000

(1 row(s) affected)
U. 将 SELECT 语句与 CUBE 一起使用

下例显示两个代码示例。第一个示例使用 CUBE 运算符从 SELECT 语句返回结果集。SELECT 语句包含每本书的书名与销售量之间的一对多关系。通过使用 CUBE 运算符，该语句返回额外的行。

USE pubs
SELECT SUBSTRING(title, 1, 65) AS title, SUM(qty) AS 'qty'
FROM sales INNER JOIN titles
   ON sales.title_id = titles.title_id
GROUP BY title
WITH CUBE
ORDER BY title

下面是结果集：

title                                                             qty
----------------------------------------------------------------- ------
NULL                                                              493
But Is It User Friendly?                                          30
Computer Phobic AND Non-Phobic Individuals: Behavior Variations   20
Cooking with Computers: Surreptitious Balance Sheets              25
...
The Busy Executive's Database Guide                               15
The Gourmet Microwave                                             40
You Can Combat Computer Stress!                                   35

(17 row(s) affected)

NULL 代表 title 列中的所有值。结果集返回每个书名对应的销售量和所有书名对应的销售总量的值。应用 CUBE 运算符或 ROLLUP 运算符将返回相同的结果。

下例使用 cube_examples 表显示 CUBE 运算符如何影响结果集并使用聚合函数 (SUM)。cube_examples 表包含产品名称、客户名称以及每个客户对某个特定产品下的订单数。

USE pubs
CREATE TABLE cube_examples
(product_name varchar(30)  NULL,
 customer_name varchar(30) NULL,
 number_of_orders int      NULL
)

INSERT cube_examples (product_name, customer_name, number_of_orders)
   VALUES ('Filo Mix', 'Romero y tomillo', 10)
INSERT cube_examples (product_name, customer_name, number_of_orders)
   VALUES ('Outback Lager', 'Wilman Kala', 10)
INSERT cube_examples (product_name, customer_name, number_of_orders)
   VALUES ('Filo Mix', 'Romero y tomillo', 20)
INSERT cube_examples (product_name, customer_name, number_of_orders)
   VALUES ('Ikura', 'Wilman Kala', 10)
INSERT cube_examples (product_name, customer_name, number_of_orders)
   VALUES ('Ikura', 'Romero y tomillo', 10)
INSERT cube_examples (product_name, customer_name, number_of_orders)
   VALUES ('Outback Lager', 'Wilman Kala', 20)
INSERT cube_examples (product_name, customer_name, number_of_orders)
   VALUES ('Filo Mix', 'Wilman Kala', 30)
INSERT cube_examples (product_name, customer_name, number_of_orders)
   VALUES ('Filo Mix', 'Eastern Connection', 40)
INSERT cube_examples (product_name, customer_name, number_of_orders)
   VALUES ('Outback Lager', 'Eastern Connection', 10)
INSERT cube_examples (product_name, customer_name, number_of_orders)
   VALUES ('Ikura', 'Wilman Kala', 40)
INSERT cube_examples (product_name, customer_name, number_of_orders)
   VALUES ('Ikura', 'Romero y tomillo', 10)
INSERT cube_examples (product_name, customer_name, number_of_orders)
   VALUES ('Filo Mix', 'Romero y tomillo', 50)

首先，发出一个带 GROUP BY 子句和结果集的典型查询。

USE pubs
SELECT product_name, customer_name, SUM(number_of_orders)
FROM cube_examples
GROUP BY product_name, customer_name
ORDER BY product_name

GROUP BY 使结果集在组内形成组。下面是结果集：

product_name                   customer_name
------------------------------ ------------------------------ ----------
Filo Mix                       Eastern Connection             40
Filo Mix                       Romero y tomillo               80
Filo Mix                       Wilman Kala                    30
Ikura                          Romero y tomillo               20
Ikura                          Wilman Kala                    50
Outback Lager                  Eastern Connection             10
Outback Lager                  Wilman Kala                    30

(7 row(s) affected)

然后，使用 CUBE 运算符发出一个带 GROUP BY 子句的查询。结果集应包括相同的信息以及各 GROUP BY 列的超聚合信息。

USE pubs
SELECT product_name, customer_name, SUM(number_of_orders)
FROM cube_examples
GROUP BY product_name, customer_name
WITH CUBE

CUBE 运算符的结果集包含上述简单 GROUP BY 结果集的值，并为 GROUP BY 子句中的各行添加超聚合信息。NULL 代表结果集中所有计算出的聚合值。下面是结果集：

product_name                   customer_name
------------------------------ ------------------------------ ----------
Filo Mix                       Eastern Connection             40
Filo Mix                       Romero y tomillo               80
Filo Mix                       Wilman Kala                    30
Filo Mix                       NULL                           150
Ikura                          Romero y tomillo               20
Ikura                          Wilman Kala                    50
Ikura                          NULL                           70
Outback Lager                  Eastern Connection             10
Outback Lager                  Wilman Kala                    30
Outback Lager                  NULL                           40
NULL                           NULL                           260
NULL                           Eastern Connection             50
NULL                           Romero y tomillo               100
NULL                           Wilman Kala                    110

(14 row(s) affected)

结果集的第 4 行表示所有客户对 Filo Mix 总共下了 150 份订单。

结果集的第 11 行表示所有客户对所有产品下的订单总数为 260。

结果集的第 12-14 行表示每个客户对所有产品下的订单总数分别为 100、110 和 50。

V. 在包含三列的结果集上使用 CUBE

下例显示两个代码示例。第一个代码示例生成包含三列的 CUBE 结果集，第二个示例生成包含四列的 CUBE 结果集。

第一个 SELECT 语句返回所售书籍的发行名称、书名和数量。下例中的 GROUP BY 子句包含两个分别称为 pub_name 和 title 的列。在 publishers 和 titles 之间以及 titles 和 sales 之间还存在两个一对多关系。

通过使用 CUBE 运算符，使结果集中包含有关出版商售出的书名数量的更详细信息。NULL 代表书名列中的所有值。

USE pubs
SELECT pub_name, title, SUM(qty) AS 'qty'
FROM sales INNER JOIN titles
   ON sales.title_id = titles.title_id INNER JOIN publishers
   ON publishers.pub_id = titles.pub_id
GROUP BY pub_name, title
WITH CUBE

下面是结果集：

pub_name             title                                      qty
-------------------- ---------------------------------------- ------
Algodata Infosystems But Is It User Friendly?                    30
Algodata Infosystems Cooking with Computers: Surreptitious Ba    25
Algodata Infosystems Secrets of Silicon Valley                   50
Algodata Infosystems Straight Talk About Computers               15
Algodata Infosystems The Busy Executive's Database Guide         15
Algodata Infosystems NULL                                       135
Binnet & Hardley     Computer Phobic AND Non-Phobic Individu     20
Binnet & Hardley     Fifty Years in Buckingham Palace Kitche     20
...                                                ...
NULL                 Sushi, Anyone?                              20
NULL                 The Busy Executive's Database Guide         15
NULL                 The Gourmet Microwave                       40
NULL                 You Can Combat Computer Stress!             35

(36 row(s) affected)

增加 GROUP BY 子句中的列数将显示 CUBE 运算符是 n 维运算符的原因。使用 CUBE 运算符时，有两列的 GROUP BY 子句将多返回三种分组。根据列中的非重复值，分组的个数可以多于三个。

结果集先按出版商名称，然后按书名分组。右边的列中列出每个出版商售出的每个书名的数量。

title 列中的 NULL 代表所有书名。有关如何区分结果集中特定值和所有值的更多信息，请参见示例 H。CUBE 运算符从一个 SELECT 语句中返回下列几组信息：

  • 每个出版商售出的每个书名的数量

  • 售出的每个书名的数量

  • 每个出版商售出的书名数量

  • 所有出版商售出的书名总数

GROUP BY 子句中引用的每列已与 GROUP BY 中的所有其它列交叉引用，并已重新应用 SUM 聚合，这就在结果集中生成附加的行。结果集中返回的信息随 GROUP BY 子句中列数的增长在 n 维方向增长。

说明 请确保在 GROUP BY 子句后列出的列相互之间是有意义的实质关系。例如，如果使用 au_fname 和 au_lname，CUBE 运算符将返回不相关的信息，如名字相同的作者售出的书籍数目。在实质层次结构（如年度销售额和季度销售额）上使用 CUBE 运算符将在结果集中生成无意义的行。使用 ROLLUP 运算符更有效。

在第二个代码示例中，GROUP BY 子句包含由 CUBE 运算符交叉引用的三列。在 publishers 和 authors、authors 和 titles 以及 titles 和 sales 之间存在一对多关系。

使用 CUBE 运算符将返回有关出版商售出的书名数量的更详细信息。

USE pubs
SELECT pub_name, au_lname, title, SUM(qty)
FROM authors INNER JOIN titleauthor
   ON authors.au_id = titleauthor.au_id INNER JOIN titles
   ON titles.title_id = titleauthor.title_id INNER JOIN publishers
   ON publishers.pub_id = titles.pub_id INNER JOIN sales
   ON sales.title_id = titles.title_id
GROUP BY pub_name, au_lname, title
WITH CUBE

基于 CUBE 运算符返回的交叉引用分组，CUBE 运算符返回下列信息：

  • 每个出版商为每位作者售出的每个书名的数量

  • 每个出版商为每位作者售出的所有书名的数量

  • 每个出版商售出的所有书名的数量

  • 所有出版商为所有作者售出的所有书名的总数量

  • 所有出版商为每位作者售出的每个书名的数量

  • 所有出版商为每位作者售出的所有书名的数量

  • 每个出版商为所有作者售出的每个书名的数量

  • 所有出版商为每位作者售出的每个书名的数量

说明 所有出版商、所有书名和所有作者的超聚合比销售总额大，因为许多书的作者不止一位。

模式随关系数的增长而显现出来。报表中的值和 NULL 的模式显示哪些组形成了汇总聚合。有关组的显式信息由 GROUPING 函数提供。

W. 将 GROUPING 函数与 CUBE 一起使用

下例显示 SELECT 语句使用 SUM 聚合、GROUP BY 子句和 CUBE 运算符的方式。它还在 GROUP BY 子句后列出的两列上使用 GROUPING 函数。

USE pubs
SELECT pub_name, GROUPING(pub_name),title, GROUPING(title),
   SUM(qty) AS 'qty'
FROM sales INNER JOIN titles
   ON sales.title_id = titles.title_id INNER JOIN publishers
   ON publishers.pub_id = titles.pub_id
GROUP BY pub_name, title
WITH CUBE

结果集中有两个包含 0 和 1 值的列，这两列由 GROUPING(pub_name) 和 GROUPING(title) 表达式生成。

下面是结果集：

pub_name                 title                         qty
-------------------- --- ------------------------- --- -----------
Algodata Infosystems   0 But Is It User Friendly?    0          30
Algodata Infosystems   0 Cooking with Computers: S   0          25
Algodata Infosystems   0 Secrets of Silicon Valley   0          50
Algodata Infosystems   0 Straight Talk About Compu   0          15
Algodata Infosystems   0 The Busy Executive's Data   0          15
Algodata Infosystems   0 NULL                        1         135
Binnet & Hardley       0 Computer Phobic AND Non-P   0          20
Binnet & Hardley       0 Fifty Years in Buckingham   0          20
...                                                ...
NULL                   1 The Busy Executive's Data   0          15
NULL                   1 The Gourmet Microwave       0          40
NULL                   1 You Can Combat Computer S   0          35

(36 row(s) affected)
X. 使用 ROLLUP 运算符

下例显示两个代码示例。第一个示例检索产品名称、客户名称和所下的订单总数并使用 ROLLUP 运算符。

USE pubs
SELECT product_name, customer_name, SUM(number_of_orders)
   AS 'Sum orders'
FROM cube_examples
GROUP BY product_name, customer_name
WITH ROLLUP

下面是结果集：

product_name                   customer_name                  Sum orders
------------------------------ ------------------------------ ----------
Filo Mix                       Eastern Connection             40
Filo Mix                       Romero y tomillo               80
Filo Mix                       Wilman Kala                    30
Filo Mix                       NULL                          150
Ikura                          Romero y tomillo               20
Ikura                          Wilman Kala                    50
Ikura                          NULL                           70
Outback Lager                  Eastern Connection             10
Outback Lager                  Wilman Kala                    30
Outback Lager                  NULL                           40
NULL                           NULL                           260

(11 row(s) affected)

第二个示例显示在公司列和部门列上执行 ROLLUP 运算并合计出雇员总数。

ROLLUP 运算符生成聚合汇总。该运算符用在需要汇总信息但完整的 CUBE 提供的都是无关的数据时，或者用在集内有集的情况中，例如公司内的部门就是集内的集。

USE pubs
CREATE TABLE personnel
(
 company_name varchar(20),
 department   varchar(15),
 num_employees int
)

INSERT personnel VALUES ('Du monde entier', 'Finance', 10)
INSERT personnel VALUES ('Du monde entier', 'Engineering', 40)
INSERT personnel VALUES ('Du monde entier', 'Marketing', 40)
INSERT personnel VALUES ('Piccolo und mehr', 'Accounting', 20)
INSERT personnel VALUES ('Piccolo und mehr', 'Personnel', 30)
INSERT personnel VALUES ('Piccolo und mehr', 'Payroll', 40)

在该查询中，除了 ROLLUP 计算结果外，公司名称、部门和公司内所有雇员的总数也成为结果集的一部分。

SELECT company_name, department, SUM(num_employees)
FROM personnel
GROUP BY company_name, department WITH ROLLUP

下面是结果集：

company_name         department
-------------------- --------------- -----------
Du monde entier      Engineering     40
Du monde entier      Finance         10
Du monde entier      Marketing       40
Du monde entier      NULL            90
Piccolo und mehr     Accounting      20
Piccolo und mehr     Payroll         40
Piccolo und mehr     Personnel       30
Piccolo und mehr     NULL            90
NULL                 NULL            180

(9 row(s) affected)
Y. 使用 GROUPING 函数

下例将三个新行添加进 cube_examples 表中。三行中的每行都在一个或多个列中记录 NULL，以便只显示 ROLLUP 函数在分组列中生成值 1。另外，下例修改了在前面的示例中使用的 SELECT 语句。

USE pubs
-- Add first row with a NULL customer name and 0 orders.
INSERT cube_examples (product_name, customer_name, number_of_orders)
   VALUES ('Ikura', NULL, 0)

-- Add second row with a NULL product and NULL customer with real value
-- for orders.
INSERT cube_examples (product_name, customer_name, number_of_orders)
   VALUES (NULL, NULL, 50)

-- Add third row with a NULL product, NULL order amount, but a real
-- customer name.
INSERT cube_examples (product_name, customer_name, number_of_orders)
VALUES (NULL, 'Wilman Kala', NULL)

SELECT product_name AS Prod, customer_name AS Cust,
   SUM(number_of_orders) AS 'Sum Orders',
   GROUPING(product_name) AS 'Grp prod_name',
   GROUPING(customer_name) AS 'Grp cust_name'
FROM cube_examples
GROUP BY product_name, customer_name
WITH ROLLUP

GROUPING 函数只能与 CUBE 或 ROLLUP 一起使用。表达式取值为 NULL 时，GROUPING 函数返回值 1，因为列值是 NULL 且代表所有值的设置。当相应的列（不管是否是 NULL）不是来自作为语法值的 CUBE 或 ROLLUP 选项时，GROUPING 函数返回值 0。返回值的数据类型为 tinyint。

下面是结果集：

Prod          Cust               Sum Orders  Grp prod_name Grp cust_name
------------- ------------------ ----------- ------------- -------------
NULL          NULL               50          0             0
NULL          Wilman Kala        NULL        0             0
NULL          NULL               50          0             1
Filo Mix      Eastern Connection 40          0             0
Filo Mix      Romero y tomillo   80          0             0
Filo Mix      Wilman Kala        30          0             0
Filo Mix      NULL               150         0             1
Ikura         NULL               0           0             0
Ikura         Romero y tomillo   20          0             0
Ikura         Wilman Kala        50          0             0
Ikura         NULL               70          0             1
Outback Lager Eastern Connection 10          0             0
Outback Lager Wilman Kala        30          0             0
Outback Lager NULL               40          0             1
NULL          NULL               310         1             1

(15 row(s) affected)
Z. 在 SELECT 中使用 GROUP BY、聚合函数和 ROLLUP

下例使用包含聚合函数和 GROUP BY 子句的 SELECT 查询，GROUP BY 子句按顺序先后列出 pub_name、au_lname 和 title。

USE pubs
SELECT pub_name, au_lname, title, SUM(qty) AS 'SUM'
FROM authors INNER JOIN titleauthor
   ON authors.au_id = titleauthor.au_id INNER JOIN titles
   ON titles.title_id = titleauthor.title_id INNER JOIN publishers
   ON publishers.pub_id = titles.pub_id INNER JOIN sales
   ON sales.title_id = titles.title_id
GROUP BY pub_name, au_lname, title
WITH ROLLUP

通过使用 ROLLUP 运算符，沿列的列表从右到左移动以创建这些分组。

pub_name      au_lname      title   SUM(qty)
pub_name      au_lname      NULL      SUM(qty)
pub_name      NULL         NULL      SUM(qty)
NULL         NULL         NULL      SUM(qty)

NULL 代表该列中的所有值。

如果使用不带 ROLLUP 运算符的 SELECT 语句，该语句则创建单个分组。该查询返回每个 pub_name、au_lname和 title 唯一组合的总和值。

pub_name       au_lname       title   SUM(qty)

将这些示例与在同一查询上使用 CUBE 运算符所创建的分组进行比较。

pub_name      au_lname      title   SUM(qty)
pub_name      au_lname      NULL      SUM(qty)
pub_name      NULL         NULL      SUM(qty)
NULL         NULL         NULL      SUM(qty)
NULL         au_lname      title   SUM(qty)
NULL         au_lname      NULL      SUM(qty)
pub_name      NULL         title   SUM(qty)
NULL         NULL         title   SUM(qty)

分组对应于结果集中返回的信息。结果集中的 NULL 代表列中的所有值。当列（pub_name、au_lname和title）的顺序和 GROUP BY 子句中列出的顺序一样时，ROLLUP 运算符返回下列数据：

  • 每个出版商为每位作者售出的每个书名的数量

  • 每个出版商为每位作者售出的所有书名的数量

  • 每个出版商售出的所有书名的数量

  • 所有出版商为所有作者售出的所有书名的总数量

下面是结果集：

pub_name          au_lname     title                                SUM
----------------- ------------ ------------------------------------ ---
Algodata Infosys  Bennet       The Busy Executive's Database Guide  15
Algodata Infosys  Bennet       NULL                                 15
Algodata Infosys  Carson       NULL                                 30
Algodata Infosys  Dull         Secrets of Silicon Valley            50
Algodata Infosys  Dull         NULL                                 50
...                                                   ...
New Moon Books    White        Prolonged Data Deprivation: Four     15
New Moon Books    White        NULL                                 15
New Moon Books    NULL         NULL                                316
NULL              NULL         NULL                                791

(49 row(s) affected)

GROUPING 函数可以与 ROLLUP 运算符或 CUBE 运算符一起使用。该函数可以应用于选择列表中的一列。根据该列是否由 ROLLUP 运算符分组，该函数返回 1 或 0。

a. 使用 INDEX 优化程序提示

下例显示使用 INDEX 优化程序提示的两种方式。第一个示例显示强制优化程序使用非聚集索引检索表中的行，第二个示例显示强制使用 0 索引执行表扫描。

-- Use the specifically named INDEX.
USE pubs
SELECT au_lname, au_fname, phone
FROM authors WITH (INDEX(aunmind))
WHERE au_lname = 'Smith'

下面是结果集：

au_lname                               au_fname             phone
-------------------------------------- -------------------- ----------
Smith                                  Meander              913 843-0462

(1 row(s) affected)

-- Force a table scan by using INDEX = 0.
USE pubs
SELECT emp_id, fname, lname, hire_date
FROM employee (index = 0)
WHERE hire_date > '10/1/1994'
b. 使用 OPTION 和 GROUP 提示

下例显示如何与 GROUP BY 子句一起使用 OPTION (GROUP) 子句。

USE pubs
SELECT a.au_fname, a.au_lname, SUBSTRING(t.title, 1, 15)
FROM authors a INNER JOIN titleauthor ta
   ON a.au_id = ta.au_id INNER JOIN titles t
   ON t.title_id = ta.title_id
GROUP BY a.au_lname, a.au_fname, t.title
ORDER BY au_lname ASC, au_fname ASC
OPTION (HASH GROUP, FAST 10)
c. 使用 UNION 查询提示

下例显示使用 MERGE UNION 查询提示。

USE pubs
SELECT *
FROM authors a1
OPTION (MERGE UNION)
SELECT *
FROM authors a2
d. 使用简单 UNION

下例中的结果集包括 Customers 和 SouthAmericanCustomers 这两个表的 ContactName、CompanyName、City 和 Phone 列的内容。

USE Northwind
GO
IF EXISTS(SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES
      WHERE TABLE_NAME = 'SouthAmericanCustomers')
   DROP TABLE SouthAmericanCustomers
GO
-- Create SouthAmericanCustomers table.
SELECT ContactName, CompanyName, City, Phone
INTO SouthAmericanCustomers
FROM Customers
WHERE Country IN ('USA', 'Canada')
GO
-- Here is the simple union.
USE Northwind
SELECT ContactName, CompanyName, City, Phone
FROM Customers
WHERE Country IN ('USA', 'Canada')
UNION
SELECT ContactName, CompanyName, City, Phone
FROM SouthAmericanCustomers
ORDER BY CompanyName, ContactName ASC
GO
e. 将 SELECT INTO 与 UNION 一起使用

在下例中，第一个 SELECT 语句中的 INTO 子句指定名为 CustomerResults 的表包含由 Customers 和 SouthAmericanCustomers 表中指定列的并集组成的最终结果集。

USE Northwind
IF EXISTS(SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES
      WHERE TABLE_NAME = 'CustomerResults')
   DROP TABLE CustomerResults
GO
USE Northwind
SELECT ContactName, CompanyName, City, Phone INTO CustomerResults
FROM Customers
WHERE Country IN ('USA', 'Canada')
UNION
SELECT ContactName, CompanyName, City, Phone
FROM SouthAmericanCustomers
ORDER BY CompanyName, ContactName ASC
GO
f. 在两个 SELECT 语句中将 UNION 与 ORDER BY 一起使用

与 UNION 子句一起使用的某些参数的顺序非常重要。下例通过两个 SELECT 语句说明不正确和正确的 UNION 用法，并重命名这些语句输出的列。

/* INCORRECT */
USE Northwind
GO
SELECT City
FROM Customers
ORDER BY Cities
UNION
SELECT Cities = City
FROM SouthAmericanCustomers
GO

/* CORRECT */
USE Northwind
GO
SELECT Cities = City
FROM Customers
   UNION
SELECT City
FROM SouthAmericanCustomers
ORDER BY Cities
GO
g. 在三个 SELECT 语句中使用 UNION 以显示 ALL 和圆括号的作用

这些示例使用 UNION 组合三个表的结果，这三个表都有相同的 5 行数据。第一个示例使用 UNION ALL 显示重复的记录并返回全部 15 行。第二个示例使用不带 ALL 的 UNION，从组合的三个 SELECT 语句结果集中删除重复的行。

最后一个示例在第一个 UNION 中使用 ALL，在第二个不带 ALL 的 UNION 中用圆括号将 UNION 括在里面。第二个 UNION 因位于圆括号内而首先得到处理，并且因为没有使用 ALL 选项而返回 5 行且删除重复的行。这 5 行通过 UNION ALL 关键字与第一个 SELECT 的结果组合，且不删除这两个由 5 行组成的结果集之间重复的行。最终结果有 10 行。

USE Northwind
GO
IF EXISTS(SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES
      WHERE TABLE_NAME = 'CustomersOne')
   DROP TABLE CustomersOne
GO
IF EXISTS(SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES
      WHERE TABLE_NAME = 'CustomersTwo')
   DROP TABLE CustomersTwo
GO
IF EXISTS(SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES
      WHERE TABLE_NAME = 'CustomersThree')
   DROP TABLE CustomersThree
GO
USE Northwind
GO
SELECT ContactName, CompanyName, City, Phone INTO CustomersOne
FROM Customers
WHERE Country = 'Mexico'
GO
SELECT ContactName, CompanyName, City, Phone INTO CustomersTwo
FROM Customers
WHERE Country = 'Mexico'
GO
SELECT ContactName, CompanyName, City, Phone INTO CustomersThree
FROM Customers
WHERE Country = 'Mexico'
GO
-- Union ALL
SELECT ContactName
FROM CustomersOne
   UNION ALL
SELECT ContactName
FROM CustomersTwo
   UNION ALL
SELECT ContactName
FROM CustomersThree
GO

USE Northwind
GO
SELECT ContactName
FROM CustomersOne
   UNION
SELECT ContactName
FROM CustomersTwo
   UNION
SELECT ContactName
FROM CustomersThree
GO

USE Northwind
GO
SELECT ContactName
FROM CustomersOne
   UNION ALL
   (
      SELECT ContactName
      FROM CustomersTwo
         UNION
      SELECT ContactName
      FROM CustomersThree
   )
GO

请参见

CREATE TRIGGER

CREATE VIEW

DELETE

分布式查询

EXECUTE

表达式

INSERT

LIKE

sp_dboption

子查询基础知识

UNION

UPDATE

使用变量和参数

WHERE


SELECT @local_variable

指定将（使用 DECLARE @local_variable 创建的）给定的局部变量设置为指定的表达式。

建议将 SET @local_variable 而不是 SELECT @local_variable 用于变量赋值。有关更多信息，请参见 SET @local_variable。

语法

SELECT { @local_variable = expression } [ ,...n ]

参数

@local_variable

是给其赋值的声明变量。

expression

是任何有效的 Microsoft® SQL Server™ 表达式，包括标量子查询。

注释

SELECT @local_variable 通常用于将单个值返回到变量中。例如，如果 expression 为列名，则返回多个值。如果 SELECT 语句返回多个值，则将返回的最后一个值赋给变量。

如果 SELECT 语句没有返回行，变量将保留当前值。如果 expression 是不返回值的标量子查询，则将变量设为 NULL。

在第一个示例中，将变量 @var1 赋给 Generic Name 作为它的值。在 Customers 表中不存在为 CustomerID 指定的值，因此对该表的查询不返回行。该变量将保留 Generic Name 值。

USE Northwind
DECLARE @var1 nvarchar(30)
SELECT @var1 = 'Generic Name'

SELECT @var1 = CompanyName
FROM Customers
WHERE CustomerID = 'ALFKA'

SELECT @var1 AS 'Company Name'

结果如下：

Company Name
----------------------------------------
Generic Name

在下例中，子查询用于给 @var1 赋值。为 CustomerID 请求的值不存在，因此子查询不返回值并将该变量设为 NULL。

USE Northwind
DECLARE @var1 nvarchar(30)
SELECT @var1 = 'Generic Name'

SELECT @var1 =
   (SELECT CompanyName
   FROM Customers
   WHERE CustomerID = 'ALFKA')

SELECT @var1 AS 'Company Name'

结果如下：

Company Name
----------------------------
NULL

一个 SELECT 语句可以初始化多个局部变量。

说明 也不能使用包含变量赋值的 SELECT 语句执行规范结果集检索操作。

请参见

DECLARE @local_variable

表达式

SELECT


SELECT 子句

指定由查询返回的列。

语法

SELECT [ ALL | DISTINCT ]
[ TOP n [ PERCENT ] [ WITH TIES ] ]
< select_list >

< select_list > ::=

{ *
        | { table_name | view_name | table_alias }.*
|     { column_name | expression | IDENTITYCOL | ROWGUIDCOL }
            [ [ AS ] column_alias ]
 | column_alias = expression
 } [ ,...n ]

参数

ALL

指定在结果集中可以显示重复行。ALL 是默认设置。

DISTINCT

指定在结果集中只能显示唯一行。为了 DISTINCT 关键字的用途，空值被认为相等。

TOP n [PERCENT]

指定只从查询结果集中输出前 n 行。n 是介于 0 和 4294967295 之间的整数。如果还指定了 PERCENT，则只从结果集中输出前百分之 n 行。当指定时带 PERCENT 时，n 必须是介于 0 和 100 之间的整数。

如果查询包含 ORDER BY 子句，将输出由 ORDER BY 子句排序的前 n 行（或前百分之 n 行）。如果查询没有 ORDER BY 子句，行的顺序将任意。

WITH TIES

指定从基本结果集中返回附加的行，这些行包含与出现在 TOP n (PERCENT) 行最后的 ORDER BY 列中的值相同的值。如果指定了 ORDER BY 子句，则只能指定 TOP ...WITH TIES。

< select_list >

为结果集选择的列。选择列表是以逗号分隔的一系列表达式。

*
指定在 FROM 子句内返回所有表和视图内的所有列。列按 FROM 子句所指定的由表或视图返回，并按它们在表或视图中的顺序返回。
table_name | view_name | table_alias.*
将 * 的作用域限制为指定的表或视图。
column_name
是要返回的列名。限定 column_name 以避免二义性引用，当 FROM 子句中的两个表内有包含重复名的列时会出现这种情况。例如，Northwind 数据库中的 Customers 和 Orders 表内都有名为 ColumnID 的列。如果在查询中联接这两个表，可以在选择列表中将客户 ID 指定为 Customers.CustomerID。
expression
是列名、常量、函数以及由运算符连接的列名、常量和函数的任意组合，或者是子查询。
IDENTITYCOL
返回标识列。有关更多信息，请参见 IDENTITY（属性）、ALTER TABLE 和 CREATE TABLE。

如果 FROM 子句中的多个表内有包含 IDENTITY 属性的列，则必须用特定的表名（如 T1.IDENTITYCOL）限定 IDENTITYCOL。

ROWGUIDCOL
返回行全局唯一标识列。

如果在 FROM 子句中有多个表具有 ROWGUIDCOL 属性，则必须用特定的表名（如 T1.ROWGUIDCOL）限定 ROWGUIDCOL。

column_alias
是查询结果集内替换列名的可选名。例如，可以为名为 quantity 的列指定别名，如"Quantity"或"Quantity to Date"或"Qty"。

别名还可用于为表达式结果指定名称，例如：

USE Northwind
SELECT AVG(UnitPrice) AS 'Average Price'
FROM [Order Details]

column_alias 可用于 ORDER BY 子句。然而，不能用于 WHERE、GROUP BY 或 HAVING 子句。如果查询表达式是 DECLARE CURSOR 语句的一部分，则 column_alias 不能用在 FOR UPDATE 子句中。

INTO 子句

创建新表并将结果行从查询插入新表中。

用户若要执行带 INTO 子句的 SELECT 语句，必须在目的数据库内具有 CREATE TABLE 权限。SELECT...INTO 不能与 COMPUTE 子句一起使用。有关更多信息，请参见事务和显式事务。

通过在 WHERE 子句中包含 FALSE 条件，可以使用 SELECT...INTO 创建没有数据的相同表定义（不同表名）。

语法

[ INTO new_table ]

参数

new_table

根据选择列表中的列和 WHERE 子句选择的行，指定要创建的新表名。new_table 的格式通过对选择列表中的表达式进行取值来确定。new_table 中的列按选择列表指定的顺序创建。new_table 中的每列有与选择列表中的相应表达式相同的名称、数据类型和值。

当选择列表中包含计算列时，新表中的相应列不是计算列。新列中的值是在执行 SELECT...INTO 时计算出的。

在此次发布的 SQL Server 版本中，select into/bulkcopy 数据库选项对是否可以使用 SELECT INTO 创建永久表没有影响。对包括 SELECT INTO 在内的某些大容量操作的记录量，取决于对数据库有效的恢复模式。有关更多信息，请参见使用恢复模型。

在以前发布的版本中，如果设置了 select into/bulk copy，则可用 SELECT INTO 创建永久表。

select into/bulk copy 用于向后兼容，但在以后的版本中可能不支持该选项。有关更多信息，请参考"恢复模式"和"向后兼容性"主题以及 ALTER DATABASE 主题。


SERVERPROPERTY

返回有关服务器实例的属性信息。

语法

SERVERPROPERTY ( propertyname )

参数

propertyname

是包含要返回的服务器属性信息的表达式。Propertyname 可以是下列值中的一个。

属性名称 | 返回的值
Collation | 服务器的默认排序规则名称。 如果输入无效或发生错误，则返回 NULL。 基本数据类型：nvarchar
Edition | 安装在服务器上的 Microsoft® SQL Server™ 实例版本。 返回： 'Desktop Engine' 'Developer Edition' 'Enterprise Edition' 'Enterprise Evaluation Edition' 'Personal Edition' 'Standard Edition' 基本数据类型：nvarchar(128)
Engine Edition | 安装在服务器上的 SQL Server 实例引擎版本。 1 = 个人或 Desktop Engine 2 = 标准 3 = 企业（适用于企业版、企业评估版和开发版） 基本数据类型：int
InstanceName | 用户连接到的实例的名称。 如果实例名称是默认实例，或者输入无效或发生错误，则返回 NULL。 基本数据类型：nvarchar
IsClustered | 在故障转移群集中配置服务器实例。 1 = 聚集。 0 = 非聚集。 NULL = 输入无效或发生错误。 基本数据类型：int
IsFullTextInstalled | 在 SQL Server 的当前实例中安装全文组件。 1 = 已安装全文组件。 0 = 未安装全文组件。 NULL = 输入无效或发生错误。 基本数据类型：int
IsIntegratedSecurityOnly | 服务器为集成安全模式。 1 = 集成安全模式。 0 = 非集成安全模式。 NULL = 输入无效或发生错误。 基本数据类型：int
IsSingleUser | 服务器为单用户模式。 1 = 单用户。 0 = 非单用户 NULL = 无效输入或错误。 基本数据类型：int
IsSyncWithBackup | 数据库为发布数据库或分发数据库，并且在还原时不用中断事务复制。 1 = 真。 0 = 假。 基本数据类型：int
LicenseType | SQL Server实例模式。 PER_SEAT = 单机模式 PER_PROCESSOR = 单处理器模式 DISABLED = 禁用许可。 基本数据类型：nvarchar(128)
MachineName | 服务器实例在其上运行的 Windows NT 计算机名称。 对于聚集实例，即在 Microsoft Cluster Server 的虚拟服务器上运行的 SQL Server 实例，返回虚拟服务器的名称。 如果输入无效或发生错误，则返回 NULL。 基本数据类型：nvarchar
NumLicenses | 如果是单机模式，则为该 SQL Server 实例的注册客户端许可数。 如果是单处理器模式，则为该 SQL Server 实例的许可处理器数。 如果不是上述模式，则返回 NULL 值。 基本数据类型：int
ProcessID | SQL Server 服务的进程 ID。（ProcessID 在标识属于该实例的 sqlservr.exe 方面很有用。） 如果输入无效或发生错误，则返回 NULL。 基本数据类型：int
ProductVersion | SQL Server 实例的版本，格式为"major.minor.build"。 基本数据类型：varchar(128)
ProductLevel | SQL Server 实例的版本级别。 返回： 'RTM' = 发售版。 'SPn' = 服务包版 'Bn', = beta 测试版 基本数据类型：nvarchar(128)。
ServerName | Windows NT 服务器和与指定的 SQL Server 实例关联的实例信息。 如果输入无效或发生错误，则返回 NULL。 基本数据类型：nvarchar

返回类型

sql_variant

注释

SERVERPROPERTY 函数的 ServerName 属性与 @@SERVERNAME 返回相似的信息。ServerName 属性提供 Windows NT 服务器和实例名称，两者共同构成唯一的服务器实例。@@SERVERNAME 提供当前配置的本地服务器名称。

如果安装时未更改默认服务器名称，则 ServerName 属性和 @@SERVERNAME 返回相同的信息。通过执行 sp_addserver 和 sp_dropserver 可以配置本地服务器名称。

如果在安装时已将本地服务器名称从默认服务器名称更改成其它名称，则 @@SERVERNAME 返回更改后的新名称。

示例

该示例在 SELECT 语句中使用 SERVERPROPERTY 函数返回有关当前服务器的信息。如果 Windows NT 服务器安装了多个 SQL Server 实例，而且客户端需要打开另一个到当前连接所使用的同一实例的连接时，此方案很有用。

SELECT   CONVERT(char(20), SERVERPROPERTY('servername'))

请参见

@@SERVERNAME


SESSION_USER

是一个 niladic 函数，允许在未指定默认值时将系统为当前会话的用户名提供的值插入到表中。还允许在查询、错误信息等中使用用户名。

语法

SESSION_USER

返回类型

nchar

注释

SESSION_USER 可在 CREATE TABLE 或 ALTER TABLE 语句中与 DEFAULT 约束一起使用，或者用作任何标准函数。

示例
A. 使用 SESSION_USER 返回会话的当前用户名

下例声明一个 char 类型的变量，并将 SESSION_USER 赋为当前值，然后输出该变量并带有文本描述。

DECLARE @session_usr char(30)
SET @session_usr = SESSION_USER
SELECT 'This session''s current user is: '+ @session_usr
GO

下面是结果集：

--------------------------------------------------------------
This session's current user is: dbo

(1 row(s) affected)
B. 将 SESSION_USER 与 DEFAULT 约束一起使用

下例将 SESSION_USER niladic 函数用作 DEFAULT 约束为交货人创建表。

USE pubs
GO
CREATE TABLE deliveries2
(
 order_id int IDENTITY(5000, 1) NOT NULL,
 cust_id  int NOT NULL,
 order_date datetime NOT NULL DEFAULT GETDATE(),
 delivery_date datetime NOT NULL DEFAULT DATEADD(dd, 10, GETDATE()),
 delivery_person char(30) NOT NULL DEFAULT SESSION_USER
)
GO
INSERT deliveries2 (cust_id)
VALUES (7510)
INSERT deliveries2 (cust_id)
VALUES (7231)
INSERT deliveries2 (cust_id)
VALUES (7028)
INSERT deliveries2 (cust_id)
VALUES (7392)
INSERT deliveries2 (cust_id)
VALUES (7452)
GO

以下查询选择 deliveries2 表中的全部信息。

SELECT order_id AS 'Ord#', cust_id AS 'Cust#', order_date,
   delivery_date, delivery_person AS 'Delivery'
FROM deliveries2
ORDER BY order_id
GO

下面是结果集：

Ord#  Cust#  order_date          delivery_date        Delivery
----  ------ ------------------  -------------------- ----------------
5000  7510   Mar 4 1998 10:21AM  Mar 14 1998 10:21AM  dbo
5001  7231   Mar 4 1998 10:21AM  Mar 14 1998 10:21AM  dbo
5002  7028   Mar 4 1998 10:21AM  Mar 14 1998 10:21AM  dbo
5003  7392   Mar 4 1998 10:21AM  Mar 14 1998 10:21AM  dbo
5004  7452   Mar 4 1998 10:21AM  Mar 14 1998 10:21AM  dbo

(5 row(s) affected)

请参见

ALTER TABLE

CREATE TABLE

CURRENT_TIMESTAMP

CURRENT_USER

SYSTEM_USER

系统函数

USER

USER_NAME


SESSIONPROPERTY

返回会话的 SET 选项设置。

语法

SESSIONPROPERTY ( option )

参数

option

是该会话的当前选项设置。option 可以是下列值中的一个。

选项 | 描述
ANSI_NULLS | 指定是否对空值上的等号 (=) 和不等号 (<>)应用遵从 SQL-92 标准行为。 1 = ON 0 = OFF
ANSI_PADDING | 控制列存储小于定义的列大小的值的方式，以及列存储在字符串和 binary 数据中有尾随空格的值的方式。 1 = ON 0 = OFF
ANSI_WARNINGS | 指定是否对某些情况（包括被零除和算术溢出）生成错误信息或警告应用 SQL-92 标准行为。 1 = ON 0 = OFF
ARITHABORT | 确定在执行查询过程中发生溢出或被零除的错误时是否终止查询。 1 = ON 0 = OFF
CONCAT_NULL_YIELDS_ NULL | 控制是将串联结果视为空值还是空字符串值。 1 = ON 0 = OFF
NUMERIC_ROUNDABORT | 指定当表达式中的四舍五入导致精度降低时是否生成错误信息和警告。 1 = ON 0 = OFF
QUOTED_IDENTIFIER | 指定是否遵从 SQL-92 关于使用引号分隔标识符和文字字符串的规则。 1 = ON 0 = OFF
<任何其它字符串> | NULL = 无效的输入

返回类型

sql_variant

注释

通过组合服务器级别、数据库级别和用户指定的选项对 SET 选项进行配置。

示例

下例返回 CONCAT_NULL_YIELDS_NULL 选项的设置。

SELECT   SESSIONPROPERTY ('CONCAT_NULL_YIELDS_NULL')

请参见

sql_variant


SET

Transact-SQL 程序设计语言提供了一些 SET 语句，这些语句可以更改特定信息的当前会话处理。

SET 语句可分为以下几类：

分类 | 更改以下各项的当前会话设置
日期和时间 | 处理日期和时间数据。
锁定 | 处理 Microsoft® SQL Server™ 锁定。
杂项 | SQL Server 的杂项功能。
查询执行 | 执行和处理查询。
SQL-92 设置 | 使用 SQL-92 默认设置。
统计信息 | 显示统计信息。
事务 | 处理 SQL Server 事务。

日期和时间语句

SET DATEFIRST

SET DATEFORMAT

锁定语句

SET DEADLOCK_PRIORITY

SET LOCK_TIMEOUT

杂项语句

SET CONCAT_NULL_YIELDS_NULL

SET CURSOR_CLOSE_ON_COMMIT

SET DISABLE_DEF_CNST_CHK

SET FIPS_FLAGGER

SET IDENTITY_INSERT

SET LANGUAGE

SET OFFSETS

SET QUOTED_IDENTIFIER

查询执行语句

SET ARITHABORT

SET ARITHIGNORE

SET FMTONLY

SET NOCOUNT

SET NOEXEC

SET NUMERIC_ROUNDABORT

SET PARSEONLY

SET QUERY_GOVERNOR_COST_LIMIT

SET ROWCOUNT

SET TEXTSIZE

SQL-92 设置语句

SET ANSI_DEFAULTS

SET ANSI_NULL_DFLT_OFF

SET ANSI_NULL_DFLT_ON

SET ANSI_NULLS

SET ANSI_PADDING

SET ANSI_WARNINGS

统计语句

SET FORCEPLAN

SET SHOWPLAN_ALL

SET SHOWPLAN_TEXT

SET STATISTICS IO

SET STATISTICS PROFILE

SET STATISTICS TIME

事务语句

SET IMPLICIT_TRANSACTIONS

SET REMOTE_PROC_TRANSACTIONS

SET TRANSACTION ISOLATION LEVEL

SET XACT_ABORT

使用 SET 语句时的注意事项
  • 除 SET FIPS_FLAGGER、SET OFFSETS、SET PARSEONLY 和 SET QUOTED_IDENTIFIER 外，所有其它 SET 语句均在执行或运行时设置。SET FIPS_FLAGGER、SET OFFSETS、SET PARSEONLY 和 SET QUOTED_IDENTIFIER 语句在分析时设置。

  • 如果在存储过程中设置 SET 语句，则从存储过程返回控制后将还原 SET 选项的值。因此，在动态 SQL 中指定的 SET 语句不影响动态 SQL 语句之后的语句。

  • 存储过程与在执行时指定的 SET 设置一起执行，但 SET ANSI_NULLS 和 SET QUOTED_IDENTIFIER 除外。指定 SET ANSI_NULLS 或 SET QUOTED_IDENTIFIER 的存储过程使用在存储过程创建时指定的设置。如果在存储过程内使用任何 SET 设置，则都将忽略该设置。

  • sp_configure 的 user options 设置允许服务器范围的设置，并可以跨多个数据库运行。该设置的行为还类似于显式 SET 语句，在登录时出现该设置的情况除外。

  • 数据库设置（使用 sp_dboption 设置的）仅在数据库级上有效，并且只有在未显式设置的情况下才生效。数据库设置替代服务器选项设置（使用 sp_configure 设置）。

  • 对于任何带 ON 和 OFF 设置的 SET 语句，可以为多个 SET 选项指定 ON 或 OFF 设置。例如：
    SET QUOTED_IDENTIFIER, ANSI_NULLS ON

    将 QUOTED_IDENTIFIER 和 ANSI_NULLS 均设置为 ON。

  • SET 语句设置将替代数据库选项设置（使用 sp_dboption 设置的）。另外，如果用户在连接到数据库时所基于的值是由于先前使用 sp_configure user options 设置而生效的，或者所基于的值适用于所有 ODBC 和 OLE/DB 连接，则一些连接设置将自动设置为 ON。

  • 当全局或快捷 SET 语句（如 SET ANSI_DEFAULTS）设置多个设置时，发出快捷 SET 语句将为所有受快捷 SET 语句影响的选项重置先前的设置。如果在发出快捷 SET 语句后显式设置受快捷 SET 语句影响的个别 SET 选项，则个别 SET 语句将替代相应的快捷设置。

  • 当使用批处理时，数据库上下文由使用 USE 语句建立的批处理决定。在存储过程的外部执行的以及批处理中的特殊查询和所有其它语句，继承使用 USE 语句建立的数据库和连接的选项设置。

  • 当从批处理或另一个存储过程执行某个存储过程时，该存储过程将根据所在的数据库中当前设置的选项值执行。例如，当存储过程 db1.dbo.sp1 调用存储过程 db2.dbo.sp2 时，存储过程 sp1 根据数据库 db1 的当前兼容级别设置去执行，存储过程 sp2 根据数据库 db2 的当前兼容级别设置去执行。

  • 当 Transact-SQL 语句引用驻留在多个数据库中的对象时，当前数据库上下文和当前连接上下文（如果位于批处理中，则是由 USE 语句定义的数据库；如果位于存储过程中，则是包含该存储过程的数据库）将应用于该语句。

  • 当在计算列或索引视图上创建和操作索引时，必须将 SET 选项 ARITHABORT、CONCAT_NULL_YIELDS_NULL、QUOTED_IDENTIFIER、ANSI_NULLS、ANSI_PADDING 和 ANSI_WARNINGS 设置为 ON。必须将选项 NUMERIC_ROUNDABORT 设置为 OFF。

    如果这些选项中的任何一个没有设置为所要求的值，则在索引视图上或在计算列带索引的表上进行的 INSERT、UPDATE 和 DELETE 操作将失败。SQL Server 将发出一个错误，列出所有设置不正确的选项。同时，SQL Server 将在这些表或索引视图上处理 SELECT 语句，仿佛计算列或视图上不存在索引一样。


SET ANSI_DEFAULTS

控制一组可共同指定某些 SQL-92 标准行为的 Microsoft® SQL Server™ 设置。

语法

SET ANSI_DEFAULTS { ON | OFF }

注释

当启用 (ON) 时，该选项将启用下列 SQL-92 设置：

SET ANSI_NULLS | SET CURSOR_CLOSE_ON_COMMIT
SET ANSI_NULL_DFLT_ON | SET IMPLICIT_TRANSACTIONS
SET ANSI_PADDING | SET QUOTED_IDENTIFIER
SET ANSI_WARNINGS |

这些 SQL-92 标准 SET 选项共同为用户工作会话、运行的触发器或存储过程定义执行期间的查询处理环境。然而，这些 SET 选项不包括遵从 SQL-92 标准所需的所有选项。

在处理计算列和索引视图上的索引时，必须将这四个默认选项（ANSI_NULLS、ANSI_PADDING、ANSI_WARNINGS 和 QUOTED_IDENTIFIER）设置为 ON。这些默认选项是在计算列和索引视图上创建和操作索引时必须赋给所需值的七个 SET 选项中的一部分。另外三个 SET 选项是：ARITHABORT (ON)、CONCAT_NULL_YIELDS_NULL (ON) 和 NUMERIC_ROUNDABORT (OFF)。有关计算列上的索引视图和索引所必需的 SET 选项设置的更多信息，请参见 SET 中的"使用 SET 语句时的注意事项"。

SQL Server ODBC 驱动程序和用于 SQL Server 的 Microsoft OLE DB 提供程序在连接时自动将 ANSI_DEFAULTS 设置为 ON。然后，驱动程序和提供程序将 CURSOR_CLOSE_ON_COMMIT 和 IMPLICIT_TRANSACTIONS 设置为 OFF。SET CURSOR_CLOSE_ON_COMMIT 和 SET IMPLICIT_TRANSACTIONS 的 OFF 设置可以在 ODBC 数据源、ODBC 连接特性或 OLE DB 连接属性（它们在连接到 SQL Server 之前在应用程序中设置）中进行配置。对来自 DB-Library 应用程序的连接，SET ANSI_DEFAULTS 默认为 OFF。

当发出 SET ANSI_DEFAULTS 时，SET QUOTED_IDENTIFIER 在分析时设置，下列选项则在执行时设置：

SET ANSI_NULLS | SET ANSI_WARNINGS
SET ANSI_NULL_DFLT_ON | SET CURSOR_CLOSE_ON_COMMIT
SET ANSI_PADDING | SET IMPLICIT_TRANSACTIONS

权限

SET ANSI_DEFAULTS 权限默认授予所有用户。

示例

下例设置 SET ANSI_DEFAULTS ON，并使用 DBCC USEROPTIONS 语句显示受影响的设置。

-- SET ANSI_DEFAULTS ON.
SET ANSI_DEFAULTS ON
GO
-- Display the current settings.
DBCC USEROPTIONS
GO
-- SET ANSI_DEFAULTS OFF.
SET ANSI_DEFAULTS OFF
GO

请参见

DBCC USEROPTIONS

SET

SET ANSI_NULL_DFLT_ON

SET ANSI_NULLS

SET ANSI_PADDING

SET ANSI_WARNINGS

SET CURSOR_CLOSE_ON_COMMIT

SET IMPLICIT_TRANSACTIONS

SET QUOTED_IDENTIFIER


SET ANSI_NULL_DFLT_OFF

当数据库的 ANSI null default 选项是 true 时，更改会话行为以替代新列的默认为空性。有关设置 ANSI null default 值的更多信息，请参见 sp_dboption 和设置数据库选项。

语法

SET ANSI_NULL_DFLT_OFF {ON | OFF}

注释

当在 CREATE TABLE 和 ALTER TABLE 语句中没有指定列的为空性时，该设置仅影响新列的为空性。当 SET ANSI_NULL_DFLT_OFF 为 ON 时，如果没有显式指定列的为空性状态，默认情况下，使用 ALTER TABLE 和 CREATE TABLE 语句创建的新列将为 NOT NULL。SET ANSI_NULL_DFLT_OFF 对使用显式 NULL 或 NOT NULL 创建的列无效。

不能将 SET ANSI_NULL_DFLT_OFF 和 SET ANSI_NULL_DFLT_ON 同时设置为 ON。如果将一个选项设置为 ON，则将另一个选项设置为 OFF。因此，可以或者将 ANSI_NULL_DFLT_OFF 或 SET ANSI_NULL_DFLT_ON 设置为 ON，或者将二者都设置为 OFF。如果有一个选项为 ON，则该选项（SET ANSI_NULL_DFLT_OFF 或 SET ANSI_NULL_DFLT_ON）生效。如果两个选项都设置为 OFF，则 Microsoft® SQL Server™ 将使用 sp_dboption 的 ANSI null default 选项值。

为使 Transact-SQL 脚本在具有不同为空性设置的数据库中获得最可靠的操作，最好始终在 CREATE TABLE 和 ALTER TABLE 语句中指定 NULL 或 NOT NULL。

SET ANSI_NULL_DFLT_OFF 的设置是在执行或运行时设置，而不是在分析时设置。

权限

SET ANSI_NULL_DFLT_OFF 权限默认授予所有用户。

示例

下例显示 SET ANSI_NULL_DFLT_OFF 使用 ANSI null default 数据库选项的两个设置时的效果。

USE pubs
GO
-- Set the 'ANSI null default' database option to true by executing
-- sp_dboption.
GO
EXEC sp_dboption 'pubs','ANSI null default','true'
GO
-- Create table t1.
CREATE TABLE t1 (a tinyint)
GO
-- NULL INSERT should succeed.
INSERT INTO t1 (a) VALUES (null)
GO
-- SET ANSI_NULL_DFLT_OFF to ON and create table t2.
SET ANSI_NULL_DFLT_OFF ON
GO
CREATE TABLE t2 (a tinyint)
GO
-- NULL INSERT should fail.
INSERT INTO t2 (a) VALUES (null)
GO
-- SET ANSI_NULL_DFLT_OFF to OFF and create table t3.
SET ANSI_NULL_DFLT_OFF off
GO
CREATE TABLE t3 (a tinyint)
GO
-- NULL INSERT should succeed.
INSERT INTO t3 (a) VALUES (null)
GO
-- This illustrates the effect of having both the sp_dboption and SET
-- option disabled.
-- Set the 'ANSI null default' database option to false.
EXEC sp_dboption 'pubs','ANSI null default','false'
GO
-- Create table t4.
CREATE TABLE t4 (a tinyint)
GO
-- NULL INSERT should fail.
INSERT INTO t4 (a) VALUES (null)
GO
-- SET ANSI_NULL_DFLT_OFF to ON and create table t5.
SET ANSI_NULL_DFLT_OFF ON
GO
CREATE TABLE t5 (a tinyint)
GO
-- NULL insert should fail.
INSERT INTO t5 (a) VALUES (null)
GO
-- SET ANSI_NULL_DFLT_OFF to OFF and create table t6.
SET ANSI_NULL_DFLT_OFF OFF
GO
CREATE TABLE t6 (a tinyint)
GO
-- NULL insert should fail.
INSERT INTO t6 (a) VALUES (null)
GO
-- Drop tables t1 through t6.
DROP TABLE t1
DROP TABLE t2
DROP TABLE t3
DROP TABLE t4
DROP TABLE t5
DROP TABLE t6
GO

请参见

ALTER TABLE

CREATE TABLE

SET

SET ANSI_NULL_DFLT_ON


SET ANSI_NULL_DFLT_ON

当数据库的 ANSI null default选项为 false 时，更改会话行为以替代新列的默认为空性。有关设置 ANSI null default 值的更多信息，请参见 sp_dboption 和设置数据库选项。

语法

SET ANSI_NULL_DFLT_ON {ON | OFF}

注释

当在 CREATE TABLE 和 ALTER TABLE 语句中没有指定列的为空性时，该设置仅影响新列的为空性。当 SET ANSI_NULL_DFLT_ON 为 ON 时，如果没有显式指定列的为空性状态，则使用 ALTER TABLE 和 CREATE TABLE 语句创建的新列可以使用空值。SET ANSI_NULL_DFLT_ON 对使用显式 NULL 或 NOT NULL 创建的列无效。

不能将 SET ANSI_NULL_DFLT_OFF 和 SET ANSI_NULL_DFLT_ON 同时设置为 ON。如果将一个选项设置为 ON，则将另一个选项设置为 OFF。因此，可以或者将 ANSI_NULL_DFLT_OFF 或 ANSI_NULL_DFLT_ON 设置为 ON，或者将二者都设置为 OFF。如果有一个选项为 ON，则该选项（SET ANSI_NULL_DFLT_OFF 或 SET ANSI_NULL_DFLT_ON）生效。如果两个选项都设置为 OFF，则 Microsoft® SQL Server™ 将使用 sp_dboption 的 ANSI null default 选项值。

为使 Transact-SQL 脚本在含有不同为空性设置的数据库中获得最可靠的操作，最好始终在 CREATE TABLE 和 ALTER TABLE 语句中指定 NULL 或 NOT NULL。

SQL Server ODBC 驱动程序和用于 SQL Server 的 Microsoft OLE DB 提供程序在连接时自动将 ANSI_NULL_DFLT_ON 设置为 ON。对来自 DB-Library 应用程序的连接，SET ANSI_NULL_DFLT_ON 默认为 OFF。

当 SET ANSI_DEFAULTS 为 ON 时，将启用 SET ANSI_NULL_DFLT_ON。

SET ANSI_NULL_DFLT_ON 的设置是在执行或运行时设置，而不是在分析时设置。

权限

SET ANSI_NULL_DFLT_ON 权限默认授予所有用户。

示例

下例显示 SET ANSI_NULL_DFLT_ON 使用 ANSI null default 数据库选项的两个设置时的效果。

USE pubs
GO
-- The code from this point on demonstrates that SET ANSI_NULL_DFLT_ON
-- has an effect when the 'ANSI null default' for the database is false.
-- Set the 'ANSI null default' database option to false by executing
-- sp_dboption.
EXEC sp_dboption 'pubs','ANSI null default','false'
GO
-- Create table t1.
CREATE TABLE t1 (a tinyint)
GO
-- NULL INSERT should fail.
INSERT INTO t1 (a) VALUES (null)
GO
-- SET ANSI_NULL_DFLT_ON to ON and create table t2.
SET ANSI_NULL_DFLT_ON ON
GO
CREATE TABLE t2 (a tinyint)
GO
-- NULL insert should succeed.
INSERT INTO t2 (a) VALUES (null)
GO
-- SET ANSI_NULL_DFLT_ON to OFF and create table t3.
SET ANSI_NULL_DFLT_ON OFF
GO
CREATE TABLE t3 (a tinyint)
GO
-- NULL insert should fail.
INSERT INTO t3 (a) VALUES (null)
GO
-- The code from this point on demonstrates that SET ANSI_NULL_DFLT_ON
-- has no effect when the 'ANSI null default' for the database is true.
-- Set the 'ANSI null default' database option to true.
EXEC sp_dboption 'pubs','ANSI null default','true'
GO
-- Create table t4.
CREATE TABLE t4 (a tinyint)
GO
-- NULL INSERT should succeed.
INSERT INTO t4 (a) VALUES (null)
GO
-- SET ANSI_NULL_DFLT_ON to ON and create table t5.
SET ANSI_NULL_DFLT_ON ON
GO
CREATE TABLE t5 (a tinyint)
GO
-- NULL INSERT should succeed.
INSERT INTO t5 (a) VALUES (null)
GO
-- SET ANSI_NULL_DFLT_ON to OFF and create table t6.
SET ANSI_NULL_DFLT_ON OFF
GO
CREATE TABLE t6 (a tinyint)
GO
-- NULL INSERT should succeed.
INSERT INTO t6 (a) VALUES (null)
GO
-- Set the 'ANSI null default' database option to false.
EXEC sp_dboption 'pubs','ANSI null default','false'
GO
-- Drop tables t1 through t6.
DROP TABLE t1
DROP TABLE t2
DROP TABLE t3
DROP TABLE t4
DROP TABLE t5
DROP TABLE t6
GO

请参见

ALTER TABLE

CREATE TABLE

SET

SET ANSI_DEFAULTS

SET ANSI_NULL_DFLT_OFF


SET ANSI_NULLS

指定在对空值使用等于 (=) 和不等于 (<>) 比较运算符时，这些运算符的 SQL-92 遵从行为。

语法

SET ANSI_NULLS {ON | OFF}

注释

SQL-92 标准要求对空值的等于 (=) 或不等于 (<>) 比较取值为 FALSE。当 SET ANSI_NULLS 为 ON 时，即使 column_name 中存在空值，使用 WHERE column_name = NULL 的 SELECT 语句仍返回零行。即使 column_name 中存在非空值，使用 WHERE column_name <> NULL 的 SELECT 语句仍返回零行。

当 SET ANSI_NULLS 为 OFF 时，等于 (=) 和不等于 (<>) 比较运算符不遵从 SQL-92 标准。使用 WHERE column_name = NULL 的 SELECT 语句返回 column_name 中含有空值的行。使用 WHERE column_name <> NULL 的 SELECT 语句返回列中含有非空值的行。此外，使用 WHERE column_name <> XYZ_value 的 SELECT 语句返回所有非 XYZ 值和非 NULL的行。

说明 Microsoft® SQL Server™ 是将空字符串解释为单个空格还是真正的空字符串，取决于 sp_dbcmptlevel 的兼容级别设置。如果兼容级别小于或等于 65，SQL Server 就将空字符串解释为单个空格。如果兼容级别等于 70，则 SQL Server 将空字符串解释为空字符串。有关更多信息，请参见 sp_dbcmptlevel。

当 SET ANSI_NULLS 为 ON 时，所有对空值的比较均取值为 UNKNOWN。当 SET ANSI_NULLS 为 OFF 时，如果数据值是 NULL，则所有数据对空值的比较将取值为 TRUE。如果未指定，则应用当前数据库的 ANSI nulls 选项的设置。有关 ANSI nulls 数据库选项的更多信息，请参见 sp_dboption 和设置数据库选项。

为使脚本按预期运行，不管 ANSI nulls 数据库选项或 SET ANSI_NULLS 的设置是什么，在可能包含空值的比较中使用 IS NULL 和 IS NOT NULL。

对于存储过程，SQL Server 使用最初创建存储过程时的 SET ANSI_NULLS 设置值。无论随后何时执行存储过程，SET ANSI_NULLS 的设置都还原为其最初使用的值并生效。当在存储过程内唤醒调用 SET ANSI_NULLS 时，其设置不更改。

在执行分布式查询时应将 SET ANSI_NULLS 设置为 ON。

在计算列或索引视图上创建或操作索引时，SET ANSI_NULLS 也必须为 ON。如果 SET ANSI_NULLS 为 OFF，计算列或索引视图上带索引的表上的 CREATE、UPDATE、INSERT 和 DELETE 语句将失败。SQL Server 将返回一个错误，列出所有违反所需值的 SET 选项。另外，在执行 SELECT 语句时，如果 SET ANSI_NULLS 为 OFF，则 SQL Server 将忽略计算列或视图上的索引值并解析选择，就好象表或视图上没有这样的索引一样。

说明 ANSI_NULLS 是在处理计算列或索引视图上的索引时必须设置为所需值的七个 SET 选项之一。还必须将选项 ANSI_PADDING、ANSI_WARNINGS、ARITHABORT、QUOTED_IDENTIFIER 和 CONCAT_NULL_YIELDS_NULL 设置为 ON，而必须将 NUMERIC_ROUNDABORT 设置为 OFF。

SQL Server ODBC 驱动程序和用于 SQL Server 的 Microsoft OLE DB 提供程序在连接时自动将 ANSI_NULLS 设置为 ON。该设置可以在 ODBC 数据源、ODBC 连接特性或 OLE DB 连接属性（它们在连接到 SQL Server 之前在应用程序中设置）中进行配置。对来自 DB-Library 应用程序的连接，SET ANSI_NULLS 默认为 OFF。

当 SET ANSI_DEFAULTS 为 ON 时，将启用 SET ANSI_NULLS。

SET ANSI_NULLS 的设置是在执行或运行时设置，而不是在分析时设置。

权限

SET ANSI_NULLS 权限默认授予所有用户。

示例

下例使用等于 (=) 和不等于 (<>) 比较运算符对表中的 NULL 值和非空值进行比较。下例还显示 IS NULL 不受 SET ANSI_NULLS 设置的影响。

-- Create table t1 and insert values.
CREATE TABLE t1 (a int null)
INSERT INTO t1 values (NULL)
INSERT INTO t1 values (0)
INSERT INTO t1 values (1)
GO
-- Print message and perform SELECT statements.
PRINT 'Testing default setting'
DECLARE @varname int
SELECT @varname = NULL
SELECT *
FROM t1
WHERE a = @varname
SELECT *
FROM t1
WHERE a <> @varname
SELECT *
FROM t1
WHERE a IS NULL
GO
-- SET ANSI_NULLS to ON and test.
PRINT 'Testing ANSI_NULLS ON'
SET ANSI_NULLS ON
GO
DECLARE @varname int
SELECT @varname = NULL
SELECT *
FROM t1
WHERE a = @varname
SELECT *
FROM t1
WHERE a <> @varname
SELECT *
FROM t1
WHERE a IS NULL
GO
-- SET ANSI_NULLS to OFF and test.
PRINT 'Testing SET ANSI_NULLS OFF'
SET ANSI_NULLS OFF
GO
DECLARE @varname int
SELECT @varname = NULL
SELECT *
FROM t1
WHERE a = @varname
SELECT *
FROM t1
WHERE a <> @varname
SELECT *
FROM t1
WHERE a IS NULL
GO
-- Drop table t1.
DROP TABLE t1
GO

请参见

=（等于）

IF...ELSE

<>（不等于）

SET

SET ANSI_DEFAULTS

WHERE

WHILE


SET ANSI_PADDING

控制列对小于定义列大小的值的存储方式，以及列对 char、varchar、binary 和 varbinary 数据中含有尾随空格的值的存储方式。

语法

SET ANSI_PADDING { ON | OFF }

注释

使用 char、varchar、binary 和 varbinary 数据类型定义的列具有某一定义的大小。

该设置只影响新列的定义。创建了列后，Microsoft® SQL Server™ 基于创建列时的设置存储值。现有的列不受该设置以后更改的影响。

警告 建议始终将 ANSI_PADDING 设置为 ON。

下表显示在将值插入含有 char、varchar、binary 和 varbinary 数据类型的列时，SET ANSI_PADDING 设置的效果。

设置 | char(n) NOT NULL 或 binary(n) NOT NULL | char(n) NULL 或 binary(n) NULL | varchar(n) 或 varbinary(n)
ON | 将起始值（含有 char 列的尾随空格和 binary 列的尾随零）填充到列的长度。 | 当 SET ANSI_PADDING 为 ON 时，遵从与 char(n) 或 binary(n) NOT NULL 相同的规则。 | 不剪裁插入 varchar 列中的字符值的尾随空格。不剪裁插入 varbinary 列中的二进制值的尾随零。不将值填充到列的长度。
OFF | 将起始值（含有 char 列的尾随空格和 binary 列的尾随零）填充到列的长度。 | 当 SET ANSI_PADDING 为 OFF 时，遵从与 varchar 或 varbinary 相同的规则。 | 剪裁插入 varchar 列中的字符值的尾随空格。剪裁插入 varbinary 列中的二进制值的尾随零。

说明 当进行填充时，char 列由空格填充，binary 列由零填充。当进行剪裁时，char 列的尾随空格被剪裁，binary 列的尾随零被剪裁。

在计算列或索引视图上创建或操作索引时，SET ANSI_PADDING 必须为 ON。有关计算列上的索引视图和索引所必需的 SET 选项设置的更多信息，请参见 SET 中的"使用 SET 语句时的注意事项"。

SQL Server ODBC 驱动程序和用于 SQL Server 的 Microsoft OLE DB 提供程序在连接时自动将 ANSI_PADDING 设置为 ON。这可以在 ODBC 数据源、ODBC 连接特性或 OLE DB 连接属性（它们在连接前在应用程序中设置）中进行配置。对来自 DB-Library 应用程序的连接，ANSI_PADDING 默认为 OFF。

nchar、nvarchar 和 ntext 列始终显示 SET ANSI_PADDING ON 行为，与 SET ANSI_PADDING 的当前设置无关。

当 SET ANSI_DEFAULTS 为 ON 时，将启用 SET ANSI_PADDING。

SET ANSI_PADDING 的设置是在执行或运行时设置，而不是在分析时设置。

权限

SET ANSI_PADDING 权限默认授予所有用户。

示例

下例演示该设置如何影响这些数据类型中的每一个。

SET ANSI_PADDING ON
GO
PRINT 'Testing with ANSI_PADDING ON'
GO

CREATE TABLE t1
(charcol char(16) NULL,
varcharcol varchar(16) NULL,
varbinarycol varbinary(8))
GO
INSERT INTO t1 VALUES ('No blanks', 'No blanks', 0x00ee)
INSERT INTO t1 VALUES ('Trailing blank ', 'Trailing blank ', 0x00ee00)

SELECT 'CHAR'='>' + charcol + '<', 'VARCHAR'='>' + varcharcol + '<',
   varbinarycol
FROM t1
GO

SET ANSI_PADDING OFF
GO
PRINT 'Testing with ANSI_PADDING OFF'
GO

CREATE TABLE t2
(charcol char(16) NULL,
varcharcol varchar(16) NULL,
varbinarycol varbinary(8))
GO
INSERT INTO t2 VALUES ('No blanks', 'No blanks', 0x00ee)
INSERT INTO t2 VALUES ('Trailing blank ', 'Trailing blank ', 0x00ee00)

SELECT 'CHAR'='>' + charcol + '<', 'VARCHAR'='>' + varcharcol + '<',
   varbinarycol
FROM t2
GO

DROP TABLE t1
DROP TABLE t2
GO

请参见

CREATE TABLE

INSERT

SET

SET ANSI_DEFAULTS


SET ANSI_WARNINGS

指定几种错误情况下的 SQL-92 标准行为。

语法

SET ANSI_WARNINGS { ON | OFF }

注释

SET ANSI_WARNINGS 影响以下情况：

  • 当设置为 ON 时，如果聚合函数（如 SUM、AVG、MAX、MIN、STDEV、STDEVP、VAR、VARP 或 COUNT）中出现空值，将生成警告信息。当设置为 OFF 时，不发出警告。

  • 当设置为 ON 时，被零除错误和算术溢出错误将导致回滚语句并生成错误信息。当设置为 OFF 时，被零除错误和算术溢出错误将导致返回空值。如果在 character、Unicode 或 binary 列上尝试执行 INSERT 或 UPDATE 操作，而这些列中的新值长度超出最大列大小，则被零除错误和算术溢出错误将导致返回空值。如果 SET ANSI_WARNINGS 为 ON，则按 SQL-92 标准的指定将取消 INSERT 或 UPDATE。将忽略字符列的尾随空格，忽略二进制列的尾随零。当设置为 OFF 时，数据将剪裁为列的大小，并且语句执行成功。

    说明 在 binary 或 varbinary 数据转换中发生截断时，不管 SET 选项的设置是什么，都不发出警告或错误信息。

可以使用 sp_configure 的 user options 选项，为与服务器的所有连接设置 ANSI_WARNINGS 的默认设置。有关更多信息，请参见 sp_configure 或设置配置选项。

创建或操作索引视图或计算列上的索引时，SET ANSI_WARNINGS 必须为 ON。如果 SET ANSI_WARNINGS 为 OFF，计算列或索引视图上带索引的表上的 CREATE、UPDATE、INSERT 和 DELETE 语句将失败。有关计算列上的索引视图和索引所必需的 SET 选项设置的更多信息，请参见 SET 中的"使用 SET 语句时的注意事项"。

Microsoft® SQL Server™ 包含 ANSI warnings 数据库选项，该选项等同于 SET ANSI_WARNINGS。当 SET ANSI_WARNINGS 为 ON 时，如发生被零除、字符串超出数据库列及其它类似错误，将产生错误信息或警告。当 SET ANSI_WARNINGS 为 OFF 时，不产生这些错误和警告。model 数据库中的 SET ANSI_WARNINGS 默认值是 OFF。如果未指定，则应用 ANSI warnings 设置。如果 SET ANSI_WARNINGS 为 OFF，SQL Server 将使用 sp_dboption 的 ANSI warnings 设置。有关更多信息，请参见 sp_dboption 或设置数据库选项。

在执行分布式查询时应将 ANSI_WARNINGS 设置为 ON。

SQL Server ODBC 驱动程序和用于 SQL Server 的 Microsoft OLE DB 提供程序在连接时自动将 ANSI_WARNINGS 设置为 ON。这可以在 ODBC 数据源、ODBC 连接特性或 OLE DB 连接属性（它们在连接前在应用程序中设置）中进行配置。对来自 DB-Library 应用程序的连接，SET ANSI_WARNINGS 默认为 OFF。

当 SET ANSI_DEFAULTS 为 ON 时，将启用 SET ANSI_WARNINGS。

SET ANSI_WARNINGS 的设置是在执行或运行时设置，而不是在分析时设置。

如果 SET ARITHABORT 或 SET ARITHIGNORE 为 OFF，并且 SET ANSI_WARNINGS 为 ON，则当遇到被零除或溢出错误时，SQL Server 仍返回错误信息。

权限

SET ANSI_WARNINGS 权限默认授予所有用户。

示例

下例演示 SET ANSI_WARNINGS 为 ON 和 OFF 时的上述三种情况。

USE pubs
GO
CREATE TABLE T1 ( a int, b int NULL, c varchar(20) )
GO
SET NOCOUNT ON
GO
INSERT INTO T1 VALUES (1, NULL, '')
INSERT INTO T1 VALUES (1, 0, '')
INSERT INTO T1 VALUES (2, 1, '')
INSERT INTO T1 VALUES (2, 2, '')
GO
SET NOCOUNT OFF
GO

PRINT '**** Setting ANSI_WARNINGS ON'
GO

SET ANSI_WARNINGS ON
GO

PRINT 'Testing NULL in aggregate'
GO
SELECT a, SUM(b) FROM T1 GROUP BY a
GO

PRINT 'Testing String Overflow in INSERT'
GO
INSERT INTO T1 VALUES (3, 3, 'Text string longer than 20 characters')
GO

PRINT 'Testing Divide by zero'
GO
SELECT a/b FROM T1
GO

PRINT '**** Setting ANSI_WARNINGS OFF'
GO
SET ANSI_WARNINGS OFF
GO

PRINT 'Testing NULL in aggregate'
GO
SELECT a, SUM(b) FROM T1 GROUP BY a
GO

PRINT 'Testing String Overflow in INSERT'
GO
INSERT INTO T1 VALUES (4, 4, 'Text string longer than 20 characters')
GO

PRINT 'Testing Divide by zero'
GO
SELECT a/b FROM T1
GO
DROP TABLE T1
GO

请参见

INSERT

SELECT

SET

SET ANSI_DEFAULTS


SET ARITHABORT

在查询执行过程中发生溢出或被零除错误时终止查询。

语法

SET ARITHABORT { ON | OFF }

注释

如果 SET ARITHABORT 为 ON，则这些错误情况将导致查询或批处理终止。如果在事务内发生错误，则回滚事务。如果 SET ARITHABORT 为 OFF 并且发生了这些错误之一，则显示一条警告消息，并给算术运算的结果赋以空值。

说明 如果 SET ARITHABORT 和 SET ARITHIGNORE 都没有设置，则 Microsoft® SQL Server™ 将在执行查询后返回 NULL 和一条警告信息。

如果 SET ARITHABORT 为 OFF 并且在对表达式的求值过程中 INSERT、DELETE 或 UPDATE 语句遇到算术错误（溢出、被零除或域错误），SQL Server 将插入或更新 NULL 值。如果目标列不可为空，则插入或更新操作失败并且用户收到错误信息。

如果 SET ARITHABORT 或 SET ARITHIGNORE 为 OFF，并且 SET ANSI_WARNINGS 为 ON，则当遇到被零除或溢出错误时，SQL Server 仍返回错误信息。

SET ARITHABORT 的设置是在执行或运行时设置，而不是在分析时设置。

在计算列或索引视图上创建或操作索引时，SET ARITHABORT 必须为 ON。如果 SET ARITHABORT 为 OFF，计算列或索引视图上带索引的表上的 CREATE、UPDATE、INSERT 和 DELETE 语句将失败。有关计算列上的索引视图和索引所必需的 SET 选项设置的更多信息，请参见 SET 中的"使用 SET 语句时的注意事项"。

权限

SET ARITHABORT 权限默认授予所有用户。

示例

下例演示两种 SET ARITHABORT 设置下的被零除和溢出错误。

-- Create tables t1 and t2 and insert data values.
CREATE TABLE t1 (a tinyint, b tinyint)
CREATE TABLE t2 (a tinyint)
GO
INSERT INTO t1 VALUES (1, 0)
INSERT INTO t1 VALUES (255, 1)
GO

PRINT '*** SET ARITHABORT ON'
GO
-- SET ARITHABORT ON and testing.
SET ARITHABORT ON
GO

PRINT '*** Testing divide by zero during SELECT'
GO
SELECT a/b
FROM t1
GO
PRINT '*** Testing divide by zero during INSERT'
GO
INSERT INTO t2
SELECT a/b
FROM t1
GO

PRINT '*** Testing tinyint overflow'
GO
INSERT INTO t2
SELECT a+b
FROM t1
GO

PRINT '*** Resulting data - should be no data'
GO
SELECT *
FROM t2
GO

-- Truncate table t2.
TRUNCATE TABLE t2
GO

-- SET ARITHABORT OFF and testing.
PRINT '*** SET ARITHABORT OFF'
GO
SET ARITHABORT OFF
GO
-- This works properly.
PRINT '*** Testing divide by zero during SELECT'
GO
SELECT a/b
FROM t1
GO
-- This works as if SET ARITHABORT was ON.
PRINT '*** Testing divide by zero during INSERT'
GO
INSERT INTO t2
SELECT a/b
FROM t1
GO
PRINT '*** Testing tinyint overflow'
GO
INSERT INTO t2
SELECT a+b
FROM t1
GO

PRINT '*** Resulting data - should be 0 rows'
GO
SELECT *
FROM t2
GO
-- Drop tables t1 and t2.
DROP TABLE t1
DROP TABLE t2
GO

请参见

SET

SET ARITHIGNORE


SET ARITHIGNORE

控制在查询执行过程中是否从溢出或被零除错误返回错误信息。

语法

SET ARITHIGNORE { ON | OFF }

注释

SET ARITHIGNORE 设置仅控制是否返回错误信息。不论该设置是什么，Microsoft® SQL Server™ 都将在包含溢出或被零除错误的计算中返回 NULL。可以使用 SET ARITHABORT 设置确定是否终止查询。该设置不影响在 INSERT、UPDATE 和 DELETE 语句执行过程中发生的错误。

如果 SET ARITHABORT 或 SET ARITHIGNORE 为 OFF，并且 SET ANSI_WARNINGS 为 ON，则当遇到被零除或溢出错误时，SQL Server 仍返回错误信息。

SET ARITHIGNORE 的设置是在执行或运行时设置，而不是在分析时设置。

权限

SET ARITHIGNORE 权限默认授予所有用户。

示例

下例演示两种 SET ARITHIGNORE 设置下的两类查询错误。

PRINT 'Setting ARITHIGNORE ON'
GO
-- SET ARITHIGNORE ON and testing.
SET ARITHIGNORE ON
GO
SELECT 1/0
GO
SELECT CAST(256 AS tinyint)
GO

PRINT 'Setting ARITHIGNORE OFF'
GO
-- SET ARITHIGNORE OFF and testing.
SET ARITHIGNORE OFF
GO
SELECT 1/0
GO
SELECT CAST(256 AS tinyint)
GO

请参见

SET

SET ARITHABORT


SET CONCAT_NULL_YIELDS_NULL

控制是将串联结果视为空值还是空字符串值。

语法

SET CONCAT_NULL_YIELDS_NULL { ON | OFF }

注释

当 SET CONCAT_NULL_YIELDS_NULL 为 ON 时，串联空值与字符串将输出 NULL 结果。例如，SELECT 'abc' + NULL 输出 NULL。当 SET CONCAT_NULL_YIELDS_NULL 为 OFF 时，串联空值与字符串将输出字符串本身（空值作为空字符串处理）。例如，SELECT 'abc' + NULL 输出 abc。

如果未指定，则应用 concat null yields null 数据库选项。

说明 SET CONCAT_NULL_YIELDS_NULL 的设置与 sp_dboption 的 concat null yields null 设置相同。

SET CONCAT_NULL_YIELDS_NULL 的设置是在执行或运行时设置，而不是在分析时设置。

当在计算列或索引视图上创建或操作索引时，SET CONCAT_NULL_YIELDS_NULL 必须为 ON。如果 SET CONCAT_NULL_YIELDS_NULL 为 OFF，则计算列或索引视图上带索引的表上的 CREATE、UPDATE、INSERT 和 DELETE 语句将失败。有关计算列上的索引视图和索引所必需的 SET 选项设置的更多信息，请参见 SET 中的"使用 SET 语句时的注意事项"。

请参见

SET

设置数据库选项

sp_dboption


SET CONTEXT_INFO

将最多 128 字节的二进制信息与当前会话或连接关联。

语法

SET CONTEXT_INFO { binary | @binary_var }

参数

binary | @binary_var

指定与当前会话或连接关联的二进制常量或 binary 或 varbinary 变量。

注释

会话上下文信息存储在 master.dbo.sysprocesses 表内的 context_info 列中。这是 varbinary(128) 列。

不能在用户定义函数中指定 SET CONTEXT_INFO。sysprocesses 表不允许空值，因此不能给 SET CONTEXT_INFO 提供空值。

SET CONTEXT_INFO 不接受常量名或变量名以外的表达式。为设置函数调用结果的上下文信息，必须先将函数调用结果放在 binary 或 varbinary 变量中。

与其它 SET 语句不同，当在存储过程或触发器中发出 SET CONTEXT_INFO 时，为上下文信息设置的新值在存储过程或触发器完成后继续存在。


SET CURSOR_CLOSE_ON_COMMIT

控制在提交事务时是否关闭游标。

语法

SET CURSOR_CLOSE_ON_COMMIT { ON | OFF }

注释

当 SET CURSOR_CLOSE_ON_COMMIT 为 ON 时，该设置遵从 SQL-92 标准，在提交或回滚时关闭任何打开的游标。当 SET CURSOR_CLOSE_ON_COMMIT 为 OFF 时，提交事务时不关闭游标。

当 SET CURSOR_CLOSE_ON_COMMIT 为 OFF 时，ROLLBACK 语句将只关闭打开的未完全填充的异步游标。如果回滚修改，在进行修改后打开的 STATIC 或 INSENSITIVE 游标将不再反映数据的状态。

当 SET CURSOR_CLOSE_ON_COMMIT 为 ON 时，ROLLBACK 语句关闭所有打开的游标。当 SET CURSOR_CLOSE_ON_COMMIT 为 OFF 时，ROLLBACK 语句将关闭所有打开的游标，那些被定义为 INSENSITIVE 或 STATIC 的游标除外；但未完全填充的异步 STATIC 游标将关闭。如果回滚修改，在进行修改后打开的 STATIC 或 INSENSITIVE 游标将不再反映数据的状态。

SET CURSOR_CLOSE_ON_COMMIT 控制与 sp_dboption 的 cursor close on commit 数据库选项相同的行为。如果 CURSOR_CLOSE_ON_COMMIT 设置为 ON 或 OFF，则在连接上使用该设置。如果未指定 SET CURSOR_CLOSE_ON_COMMIT，则应用 sp_dboption 的 cursor close on commit 设置。

SQL Server ODBC 驱动程序和用于 SQL Server 的 Microsoft OLE DB 提供程序均在连接时将 CURSOR_CLOSE_ON_COMMIT 设置为 OFF。DB-Library 不自动设置 CURSOR_CLOSE_ON_COMMIT 值。

当 SET ANSI_DEFAULTS 为 ON 时，将启用 SET CURSOR_CLOSE_ON_COMMIT。

SET CURSOR_CLOSE_ON_COMMIT 的设置是在执行或运行时设置，而不是在分析时设置。

权限

SET CURSOR_CLOSE_ON_COMMIT 权限默认授予所有用户。

示例

下例在事务中定义一个游标并尝试在提交事务后使用该游标。

SET NOCOUNT ON

CREATE TABLE t1 ( a int )
GO

INSERT INTO t1 values (1)
INSERT INTO t1 values (2)
GO

PRINT '-- SET CURSOR_CLOSE_ON_COMMIT ON'
GO
SET CURSOR_CLOSE_ON_COMMIT ON
GO

PRINT '-- BEGIN TRAN'
BEGIN TRAN

PRINT '-- Declare and open cursor'
DECLARE testcursor CURSOR FOR
SELECT a
FROM t1

OPEN testcursor

PRINT '-- Commit tran'
COMMIT TRAN

PRINT '-- Try to use cursor'

FETCH NEXT FROM testcursor

CLOSE testcursor
DEALLOCATE testcursor
GO

PRINT '-- SET CURSOR_CLOSE_ON_COMMIT OFF'
GO
SET CURSOR_CLOSE_ON_COMMIT OFF
GO

PRINT '-- BEGIN TRAN'
BEGIN TRAN

PRINT '-- Declare and open cursor'
DECLARE testcursor CURSOR FOR
SELECT a
FROM t1

OPEN testcursor

PRINT '-- Commit tran'
COMMIT TRAN

PRINT '-- Try to use cursor'

FETCH NEXT FROM testcursor

CLOSE testcursor
DEALLOCATE testcursor
GO

DROP TABLE t1
GO

请参见

BEGIN TRANSACTION

CLOSE

COMMIT TRANSACTION

ROLLBACK TRANSACTION

SET

SET ANSI_DEFAULTS

设置数据库选项

sp_dboption


SET DATEFIRST

将一周的第一天设置为从 1 到 7 之间的一个数字。

语法

SET DATEFIRST { number | @number_var }

参数

number | @number_var

是一个整数，表示一周的第一天，可以是下列值中的一个。

值 | 一周的第一天是
1 | 星期一
2 | 星期二
3 | 星期三
4 | 星期四
5 | 星期五
6 | 星期六
7（默认值，美国英语） | 星期日

注释

使用 @@DATEFIRST 函数检查 SET DATEFIRST 的当前设置。

SET DATEFIRST 的设置是在执行或运行时设置，而不是在分析时设置。

权限

SET DATEFIRST 权限默认授予所有用户。

示例

下例显示一个日期值对应的一周中的某一天，并显示更改 DATEFIRST 设置的效果。

-- SET DATEFIRST to U.S. English default value of 7.
SET DATEFIRST 7
GO
SELECT CAST('1/1/99' AS datetime), DATEPART(dw, '1/1/99')
-- January 1, 1999 is a Friday. Because the U.S. English default
-- specifies Sunday as the first day of the week, DATEPART of 1/1/99
-- (Friday) yields a value of 6, because Friday is the sixth day of the
-- week when starting with Sunday as day 1.
SET DATEFIRST 3
-- Because Wednesday is now considered the first day of the week,
-- DATEPART should now show that 1/1/99 (a Friday) is the third day of the -- week. The following DATEPART function should return a value of 3.
SELECT CAST('1/1/99' AS datetime), DATEPART(dw, '1/1/99')
GO

请参见

数据类型

@@DATEFIRST

datetime 和 smalldatetime

SET


SET DATEFORMAT

设置用于输入 datetime 或 smalldatetime 数据的日期部分（月/日/年）的顺序。

语法

SET DATEFORMAT { format | @format_var }

参数

format | @format_var

是日期部分的顺序。可以是 Unicode 或转换为 Unicode 的 DBCS。有效参数包括 mdy、dmy、ymd、ydm、myd 和 dym。美国英语默认值是 mdy。

注释

该设置仅用在将字符串转换为日期值时的解释中。它对日期值的显示没有影响。

SET DATEFORMAT 的设置是在执行或运行时设置，而不是在分析时设置。

权限

SET DATEFORMAT 权限默认授予所有用户。

示例

下例使用不同的日期格式处理不同格式的日期字符串。

SET DATEFORMAT mdy
GO
DECLARE @datevar datetime
SET @datevar = '12/31/98'
SELECT @datevar
GO

SET DATEFORMAT ydm
GO
DECLARE @datevar datetime
SET @datevar = '98/31/12'
SELECT @datevar
GO

SET DATEFORMAT ymd
GO
DECLARE @datevar datetime
SET @datevar = '98/12/31'
SELECT @datevar
GO

请参见

数据类型

datetime 和 smalldatetime

SET


SET DEADLOCK_PRIORITY

控制在发生死锁情况时会话的反应方式。如果两个进程都锁定数据，并且直到其它进程释放自己的锁时，每个进程才能释放自己的锁，即发生死锁情况。

语法

SET DEADLOCK_PRIORITY { LOW | NORMAL | @deadlock_var }

参数

LOW

指定当前会话为首选死锁牺牲品。Microsoft® SQL Server™ 自动回滚死锁牺牲品的事务，并给客户端应用程序返回 1205 号死锁错误信息。

NORMAL

指定会话返回到默认的死锁处理方法。

@deadlock_var

是指定死锁处理方法的字符变量。如果指定 LOW，则 @deadlock_var 为 3；如果指定 NORMAL，则 @deadlock_var 为 6。

注释

SET DEADLOCK_PRIORITY 的设置是在执行或运行时设置，而不是在分析时设置。

权限

SET DEADLOCK_PRIORITY 权限默认授予所有用户。

请参见

@@LOCK_TIMEOUT

SET

SET LOCK_TIMEOUT


SET DISABLE_DEF_CNST_CHK

指定临时延迟侵犯检查，在 Microsoft® SQL Server™ 6.x 版中用于提高效率。

重要 包含 SET DISABLE_DEF_CNST_CHK 只是为了向后兼容。该语句的功能现已内置在 Microsoft SQL Server 2000 中。在 SQL Server 的未来版本中，可能不支持 SET DISABLE_DEF_CNST_CHK。

注释

如果兼容级别的设置为 60 或 65，则执行该语句将无效。但是，如果兼容级别的设置为 70，则执行该语句仍无效，而 SQL Server 将返回警告信息。有关设置兼容级别的更多信息，请参见 sp_dbcmptlevel。

请参见

CREATE TABLE

DELETE

INSERT

SET

UPDATE


SET FIPS_FLAGGER

指定检查是否遵从 FIPS 127-2 标准，该标准基于 SQL-92 标准。

语法

SET FIPS_FLAGGER level

参数

level

是对 FIPS 127-2 标准的遵从级别，将检查所有数据库操作是否达到该级别。如果数据库操作与选定的 SQL-92 标准级别冲突，则 Microsoft® SQL Server™ 将生成一个警告。

level 必须是下列值中的一个。

值 | 描述
ENTRY | 针对 SQL-92 入口级检查是否遵从标准。
FULL | 针对 SQL-92 完全级检查是否遵从标准。
INTERMEDIATE | 针对 SQL-92 中间级检查是否遵从标准。
OFF | 不检查是否遵从标准。

注释

SET FIPS_FLAGGER 的设置是在分析时设置，而不是在执行或运行时设置。在分析时进行设置意味着：SET 语句只要出现在批处理或存储过程中即生效，与代码执行实际上是否到达该点无关；并且 SET 语句在任何语句执行之前生效。例如，假设 SET 语句在 IF...ELSE 语句块中，而在执行过程中从未到达过该语句块，但由于分析了 IF...ELSE 语句块，因此 SET 语句仍生效。

如果在存储过程中设置 SET FIPS_FLAGGER，则从存储过程返回控制后将还原 SET FIPS_FLAGGER 的值。因此，在动态 SQL 中指定的 SET FIPS_FLAGGER 语句对动态 SQL 语句之后的任何语句无效。

权限

SET FIPS_FLAGGER 权限默认授予所有用户。

请参见

SET


SET FMTONLY

只将元数据返回给客户端。

语法

SET FMTONLY { ON | OFF }

注释

当 SET FMTONLY 为 ON 时，将不对行进行处理，也不将行作为请求的结果发送到客户端。

SET FMTONLY 的设置是在执行或运行时设置，而不是在分析时设置。

权限

SET FMTONLY 权限默认授予所有用户。

示例

下例将 SET FMTONLY 的设置更改为 ON 并执行 SELECT 语句。该设置使该语句只返回列信息，而不返回数据行。

SET FMTONLY ON
GO
USE pubs
GO
SELECT *
FROM pubs.dbo.authors
GO

请参见

SET


SET FORCEPLAN

使 Microsoft® SQL Server™ 查询优化器以与 SELECT 语句的 FROM 子句中表出现的相同顺序来处理联接。

语法

SET FORCEPLAN { ON | OFF }

注释

SET FORCEPLAN 从本质上替代查询优化器处理 Transact-SQL SELECT 语句所使用的逻辑。SELECT 语句返回的数据同样与该设置无关。唯一的差别是 SQL Server 为满足查询对表进行处理的方式。

在查询中也可以使用查询优化器提示影响 SQL Server 处理 SELECT 语句的方式。

SET FORCEPLAN 的设置是在执行或运行时设置，而不是在分析时设置。

权限

SET FORCEPLAN 权限默认授予所有用户。

示例

下例在三个表之间执行联接。由于启用了 SHOWPLAN_TEXT 设置，所以 SQL Server 返回有关在启用 SET FORCE_PLAN 设置后如何以不同的方式处理查询的信息。

-- SET SHOWPLAN_TEXT to ON.
SET SHOWPLAN_TEXT ON
GO
USE pubs
GO
-- Inner join.
SELECT a.au_lname, a.au_fname, t.title
FROM authors a INNER JOIN titleauthor ta
   ON a.au_id = ta.au_id INNER JOIN titles t
   ON ta.title_id = t.title_id
GO
-- SET FORCEPLAN to ON.
SET FORCEPLAN ON
GO
-- Reexecute inner join to see the effect of SET FORCEPLAN ON.
SELECT a.au_lname, a.au_fname, t.title
FROM authors a INNER JOIN titleauthor ta
   ON a.au_id = ta.au_id INNER JOIN titles t
   ON ta.title_id = t.title_id
GO
SET SHOWPLAN_TEXT OFF
GO
SET FORCEPLAN OFF
GO

请参见

SELECT

SET

SET SHOWPLAN_ALL

SET SHOWPLAN_TEXT


SET IDENTITY_INSERT

允许将显式值插入表的标识列中。

语法

SET IDENTITY_INSERT [ database.[ owner.] ] { table } { ON | OFF }

参数

database

是指定的表所驻留的数据库名称。

owner

是表所有者的名称。

table

是含有标识列的表名。

注释

任何时候，会话中只有一个表的 IDENTITY_INSERT 属性可以设置为 ON。如果某个表已将此属性设置为 ON，并且为另一个表发出了 SET IDENTITY_INSERT ON 语句，则 Microsoft® SQL Server™ 返回一个错误信息，指出 SET IDENTITY_INSERT 已设置为 ON 并报告此属性已设置为 ON 的表。

如果插入值大于表的当前标识值，则 SQL Server 自动将新插入值作为当前标识值使用。

SET IDENTITY_INSERT 的设置是在执行或运行时设置，而不是在分析时设置。

权限

执行权限默认授予 sysadmin 固定服务器角色和 db_owner 及 db_ddladmin 固定数据库角色以及对象所有者。

示例

下例创建一个含有标识列的表，并显示如何使用 SET IDENTITY_INSERT 设置填充由 DELETE 语句导致的标识值中的空隙。

-- Create products table.
CREATE TABLE products (id int IDENTITY PRIMARY KEY, product varchar(40))
GO
-- Inserting values into products table.
INSERT INTO products (product) VALUES ('screwdriver')
INSERT INTO products (product) VALUES ('hammer')
INSERT INTO products (product) VALUES ('saw')
INSERT INTO products (product) VALUES ('shovel')
GO

-- Create a gap in the identity values.
DELETE products
WHERE product = 'saw'
GO

SELECT *
FROM products
GO

-- Attempt to insert an explicit ID value of 3;
-- should return a warning.
INSERT INTO products (id, product) VALUES(3, 'garden shovel')
GO
-- SET IDENTITY_INSERT to ON.
SET IDENTITY_INSERT products ON
GO

-- Attempt to insert an explicit ID value of 3
INSERT INTO products (id, product) VALUES(3, 'garden shovel').
GO

SELECT *
FROM products
GO
-- Drop products table.
DROP TABLE products
GO

请参见

CREATE TABLE

IDENTITY（属性）

INSERT

SET


SET IMPLICIT_TRANSACTIONS

为连接设置隐性事务模式。

语法

SET IMPLICIT_TRANSACTIONS { ON | OFF }

注释

当设置为 ON 时，SET IMPLICIT_TRANSACTIONS 将连接设置为隐性事务模式。当设置为 OFF 时，则使连接返回到自动提交事务模式。

当连接是隐性事务模式且当前不在事务中时，执行下列语句将启动事务：

ALTER TABLE | FETCH | REVOKE
CREATE | GRANT | SELECT
DELETE | INSERT | TRUNCATE TABLE
DROP | OPEN | UPDATE

如果连接已经在打开的事务中，则上述语句不启动新事务。

对于因为该设置为 ON 而自动打开的事务，用户必须在该事务结束时将其显式提交或回滚。否则当用户断开连接时，事务及其所包含的所有数据更改将回滚。在事务提交后，执行上述任一语句即可启动新事务。

隐性事务模式将保持有效，直到连接执行 SET IMPLICIT_TRANSACTIONS OFF 语句使连接返回到自动提交模式。在自动提交模式下，如果各个语句成功完成则提交。

在进行连接时，SQL Server ODBC 驱动程序和用于 SQL Server 的 Microsoft OLE DB 提供程序自动将 IMPLICIT_TRANSACTIONS 设置为 OFF。对来自 DB-Library 应用程序的连接，SET IMPLICIT_TRANSACTIONS 默认为 OFF。

当 SET ANSI_DEFAULTS 为 ON 时，将启用 SET IMPLICIT_TRANSACTIONS。

SET IMPLICIT_TRANSACTIONS 的设置是在执行或运行时设置，而不是在分析时设置。

示例

下例演示在将 IMPLICIT_TRANSACTIONS 设置为 ON 时显式或隐式启动事务。它使用 @@TRANCOUNT 函数演示打开的事务和关闭的事务。

USE pubs
GO

CREATE table t1 (a int)
GO
INSERT INTO t1 VALUES (1)
GO

PRINT 'Use explicit transaction'
BEGIN TRAN
INSERT INTO t1 VALUES (2)
SELECT 'Tran count in transaction'= @@TRANCOUNT
COMMIT TRAN
SELECT 'Tran count outside transaction'= @@TRANCOUNT
GO

PRINT 'Setting IMPLICIT_TRANSACTIONS ON'
GO
SET IMPLICIT_TRANSACTIONS ON
GO

PRINT 'Use implicit transactions'
GO
-- No BEGIN TRAN needed here.
INSERT INTO t1 VALUES (4)
SELECT 'Tran count in transaction'= @@TRANCOUNT
COMMIT TRAN
SELECT 'Tran count outside transaction'= @@TRANCOUNT
GO

PRINT 'Use explicit transactions with IMPLICIT_TRANSACTIONS ON'
GO
BEGIN TRAN
INSERT INTO t1 VALUES (5)
SELECT 'Tran count in transaction'= @@TRANCOUNT
COMMIT TRAN
SELECT 'Tran count outside transaction'= @@TRANCOUNT
GO

SELECT * FROM t1
GO

-- Need to commit this tran too!
DROP TABLE t1
COMMIT TRAN
GO

请参见

ALTER TABLE

BEGIN TRANSACTION

CREATE TABLE

DELETE

DROP TABLE

FETCH

GRANT

隐性事务

INSERT

OPEN

REVOKE

SELECT

SET

SET ANSI_DEFAULTS

@@TRANCOUNT

事务

TRUNCATE TABLE

UPDATE


SET LANGUAGE

指定会话的语言环境。会话语言确定 datetime 格式和系统信息。

语法

SET LANGUAGE { [ N ] 'language' | @language_var }

参数

[N]'language' | @language_var

是存储在 syslanguages 中的语言名称。该参数可以是 Unicode，或者是转换为 Unicode 的 DBCS。若要指定使用 Unicode 的语言，请使用 N'language'。如果将语言指定为变量，则变量的数据类型必须为 sysname。

注释

SET LANGUAGE 的设置是在执行或运行时设置，而不是在分析时设置。

权限

SET LANGUAGE 权限默认授予所有用户。

示例

下例将默认语言设置为 us_english。

SET LANGUAGE us_english
GO

请参见

数据类型

sp_helplanguage

SET

SQL Server 语言支持

syslanguages（仅限于 master 数据库）


SET LOCK_TIMEOUT

指定语句等待锁释放的毫秒数。

语法

SET LOCK_TIMEOUT timeout_period

参数

timeout_period

是在 Microsoft® SQL Server™ 返回锁定错误前经过的毫秒数。值为 -1（默认值）时表示没有超时期限（即无限期等待）。

当锁等待超过超时值时，将返回错误。值为 0 时表示根本不等待，并且一遇到锁就返回信息。

注释

在连接开始时，该设置的值为 -1。设置更改后，新设置在其余的连接时间里一直有效。

SET LOCK_TIMEOUT 的设置是在执行或运行时设置，而不是在分析时设置。

READPAST 锁定提示为该 SET 选项提供了另一种方式。

权限

SET LOCK_TIMEOUT 权限默认授予所有用户。

示例

下例将锁超时期限设置为 1,800 毫秒。

SET LOCK_TIMEOUT 1800
GO

请参见

锁定提示

@@LOCK_TIMEOUT

SET


SET NOCOUNT

使返回的结果中不包含有关受 Transact-SQL 语句影响的行数的信息。

语法

SET NOCOUNT { ON | OFF }

注释

当 SET NOCOUNT 为 ON 时，不返回计数（表示受 Transact-SQL 语句影响的行数）。当 SET NOCOUNT 为 OFF 时，返回计数。

即使当 SET NOCOUNT 为 ON 时，也更新 @@ROWCOUNT 函数。

当 SET NOCOUNT 为 ON 时，将不给客户端发送存储过程中的每个语句的 DONE_IN_PROC 信息。当使用 Microsoft® SQL Server™ 提供的实用工具执行查询时，在 Transact-SQL 语句（如 SELECT、INSERT、UPDATE 和 DELETE）结束时将不会在查询结果中显示"nn rows affected"。

如果存储过程中包含的一些语句并不返回许多实际的数据，则该设置由于大量减少了网络流量，因此可显著提高性能。

SET NOCOUNT 设置是在执行或运行时设置，而不是在分析时设置。

权限

SET NOCOUNT 权限默认授予所有用户。

示例

下例在 osql 实用工具或 SQL Server 查询分析器中执行时，可防止显示有关受影响的行数的信息。

USE pubs
GO
-- Display the count message.
SELECT au_lname
FROM authors
GO
USE pubs
GO
-- SET NOCOUNT to ON and no longer display the count message.
SET NOCOUNT ON
GO
SELECT au_lname
FROM authors
GO
-- Reset SET NOCOUNT to OFF.
SET NOCOUNT OFF
GO

请参见

@@ROWCOUNT

SET


SET NOEXEC

编译每个查询但不执行查询。

语法

SET NOEXEC { ON | OFF }

注释

当 SET NOEXEC 为 ON 时，Microsoft® SQL Server™ 编译每个批处理 Transact-SQL 语句但并不执行它们。当 SET NOEXEC 为 OFF 时，所有批处理将在编译后执行。

在 SQL Server 中，语句的执行包括两个阶段：编译和执行。该设置可用于让 SQL Server 在执行 Transact-SQL 代码时，验证代码中的语法和对象名。它也可以用于调试通常是较大的批处理语句一部分的语句。

SET NOEXEC 设置是在执行或运行时设置，而不是在分析时设置。

权限

SET NOEXEC 权限默认授予所有用户。

示例

下例在有效查询、含有无效对象名的查询以及含有不正确语法的查询中使用 NOEXEC。

USE pubs
GO
PRINT 'Valid query'
GO
-- SET NOEXEC to ON.
SET NOEXEC ON
GO
-- Inner join.
SELECT a.au_lname, a.au_fname, t.title
FROM authors a INNER JOIN titleauthor ta
   ON a.au_id = ta.au_id INNER JOIN titles t
   ON ta.title_id = t.title_id
GO
-- SET NOEXEC to OFF.
SET NOEXEC OFF
GO
PRINT 'Invalid object name'
GO
-- SET NOEXEC to ON.
SET NOEXEC ON
GO
-- Function name used is a reserved keyword.

USE pubs
GO
CREATE FUNCTION values (@storeid varchar(30))
RETURNS TABLE
AS
RETURN (SELECT title, qty
   FROM sales s, titles t
   WHERE s.stor_id = @storeid and
   t.title_id = s.title_id)
-- SET NOEXEC to OFF.
SET NOEXEC OFF
GO
PRINT 'Invalid syntax'
GO
-- SET NOEXEC to ON.
SET NOEXEC ON
GO
-- Built-in function incorrectly invoked
SELECT *
FROM fn_helpcollations()
-- Reset SET NOEXEC to OFF.
SET NOEXEC OFF
GO

请参见

SET

SET SHOWPLAN_ALL

SET SHOWPLAN_TEXT


SET NUMERIC_ROUNDABORT

指定当表达式中的四舍五入导致精度损失时生成的错误报告级别。

语法

SET NUMERIC_ROUNDABORT { ON | OFF }

注释

当 SET NUMERIC_ROUNDABORT 为 ON 时，当表达式中出现精度损失时生成错误。当设置为 OFF 时，精度损失不生成错误信息，并且将结果四舍五入为存储结果的列或变量的精度。

在精度较低的列或变量中，当试图以固定精度存储一个值时，将出现精度损失。

如果 SET NUMERIC_ROUNDABORT 为 ON，则 SET ARITHABORT 决定生成错误的严重度。下表显示当出现精度损失时这两个设置的效果。

设置 | SET NUMERIC_ROUNDABORT ON | SET NUMERIC_ROUNDABORT OFF
SET ARITHABORT ON | 生成错误；不返回结果集。 | 没有错误和警告；将结果四舍五入。
SET ARITHABORT OFF | 返回警告；表达式返回 NULL。 | 没有错误和警告；将结果四舍五入。

SET NUMERIC_ROUNDABORT 的设置是在执行或运行时设置，而不是在分析时设置。

当在计算列或索引视图上创建或操作索引时，SET NUMERIC_ROUNDABORT 必须为 OFF。如果 SET NUMERIC_ROUNDABORT 为 ON，则计算列或索引视图上带索引的表上的 CREATE、UPDATE、INSERT 和 DELETE 语句将失败。有关计算列上的索引视图和索引所必需的 SET 选项设置的更多信息，请参见 SET 中的"使用 SET 语句时的注意事项"。

权限

SET NUMERIC_ROUNDABORT 权限默认授予所有用户。

示例

下例显示将两个精度为四位小数的值添加和存储在一个精度为两位小数的变量中。下列表达式演示不同的 SET NUMERIC_ROUNDABORT 和 SET ARITHABORT 设置的效果。

-- SET NOCOUNT to ON,
-- SET NUMERIC_ROUNDABORT to ON, and SET ARITHABORT to ON.
SET NOCOUNT ON
PRINT 'SET NUMERIC_ROUNDABORT ON'
PRINT 'SET ARITHABORT ON'
SET NUMERIC_ROUNDABORT ON
SET ARITHABORT ON
GO
DECLARE @result decimal(5,2),
@value_1 decimal(5,4), @value_2 decimal(5,4)
SET @value_1 = 1.1234
SET @value_2 = 1.1234
SELECT @result = @value_1 + @value_2
SELECT @result
GO
-- SET NUMERIC_ROUNDABORT to ON and SET ARITHABORT to OFF.
PRINT 'SET NUMERIC_ROUNDABORT ON'
PRINT 'SET ARITHABORT OFF'
SET NUMERIC_ROUNDABORT ON
SET ARITHABORT OFF
GO
DECLARE @result decimal(5,2),
@value_1 decimal(5,4), @value_2 decimal(5,4)
SET @value_1 = 1.1234
SET @value_2 = 1.1234
SELECT @result = @value_1 + @value_2
SELECT @result
GO
-- SET NUMERIC_ROUNDABORT to OFF and SET ARITHABORT to ON.
PRINT 'SET NUMERIC_ROUNDABORT OFF'
PRINT 'SET ARITHABORT ON'
SET NUMERIC_ROUNDABORT OFF
SET ARITHABORT ON
GO
DECLARE @result decimal(5,2),
@value_1 decimal(5,4), @value_2 decimal(5,4)
SET @value_1 = 1.1234
SET @value_2 = 1.1234
SELECT @result = @value_1 + @value_2
SELECT @result
GO
-- SET NUMERIC_ROUNDABORT to OFF and SET ARITHABORT to OFF.
PRINT 'SET NUMERIC_ROUNDABORT OFF'
PRINT 'SET ARITHABORT OFF'
SET NUMERIC_ROUNDABORT OFF
SET ARITHABORT OFF
GO
DECLARE @result decimal(5,2),
@value_1 decimal(5,4), @value_2 decimal(5,4)
SET @value_1 = 1.1234
SET @value_2 = 1.1234
SELECT @result = @value_1 + @value_2
SELECT @result
GO

请参见

数据类型

SET

SET ARITHABORT


SET OFFSETS

将 Transact-SQL 语句中指定关键字的偏移量（相对于语句起始点的位置）返回给 DB-Library 应用程序。

语法

SET OFFSETS keyword_list

参数

keyword_list

是用逗号分隔的 Transact-SQL 构造列表（包括 SELECT、FROM、ORDER、COMPUTE、TABLE、PROCEDURE、STATEMENT、PARAM 和 EXECUTE）。

注释

SET OFFSETS 只用在 DB-Library 应用程序中。

SET OFFSETS 的设置是在分析时设置，而不是在执行或运行时设置。在分析时进行设置意味着：SET 语句只要出现在批处理或存储过程中即生效，与代码执行实际上是否到达该点无关；并且 SET 语句在任何语句执行之前生效。例如，假设 SET 语句在 IF...ELSE 语句块中，而在执行过程中从未到达过该语句块，但由于分析了 IF...ELSE 语句块，因此 SET 语句仍生效。

如果在存储过程中设置 SET OFFSETS，则从存储过程返回控制后将还原 SET OFFSETS 的值。因此，动态 SQL 中指定的 SET OFFSETS 语句对动态 SQL 语句之后的任何语句无效。

权限

SET OFFSETS 权限默认授予所有用户。

请参见

SET

SET PARSEONLY


SET PARSEONLY

检查每个 Transact-SQL 语句的语法并返回任何错误信息，但不编译和执行语句。

语法

SET PARSEONLY { ON | OFF }

注释

当 SET PARSEONLY 为 ON 时，Microsoft® SQL Server™ 仅分析语句。当 SET PARSEONLY 为 OFF 时，SQL Server 编译并执行语句。

SET PARSEONLY 的设置是在分析时设置，而不是在执行或运行时设置。

在存储过程或触发器中不要使用 PARSEONLY。如果 OFFSETS 选项为 ON 而且没有出现错误，则 SET PARSEONLY 返回偏移量。

权限

SET PARSEONLY 权限默认授予所有用户。

请参见

SET

SET OFFSETS


SET QUERY_GOVERNOR_COST_LIMIT

替代当前连接的当前配置值。

语法

SET QUERY_GOVERNOR_COST_LIMIT value

参数

value

是数字值或整型值，表示是否允许所有查询运行（0 值），或者是否不允许任何预计成本大于指定非零值的查询运行。如果指定数值，则 Microsoft® SQL Server™ 将其截断为整数。

注释

仅限于在当前连接中使用 SET QUERY_GOVERNOR_COST_LIMIT，且只在当前连接期间有效。使用 sp_configure 的 query governor cost limit 选项更改服务器范围的查询调控器成本限定值。有关配置该选项的更多信息，请参见 sp_configure 和设置配置选项。

SET QUERY_GOVERNOR_COST_LIMIT 的设置是在执行或运行时设置，而不是在分析时设置。

权限

SET QUERY_GOVERNOR_COST_LIMIT 权限默认授予 sysadmin 固定服务器角色成员。

请参见

SET


SET QUOTED_IDENTIFIER

使 Microsoft® SQL Server™ 遵从关于引号分隔标识符和文字字符串的 SQL-92 规则。由双引号分隔的标识符可以是 Transact-SQL 保留关键字，或者可以包含 Transact-SQL 标识符语法规则通常不允许的字符。

语法

SET QUOTED_IDENTIFIER { ON | OFF }

注释

当 SET QUOTED_IDENTIFIER 为 ON 时，标识符可以由双引号分隔，而文字必须由单引号分隔。当 SET QUOTED_IDENTIFIER 为 OFF 时，标识符不可加引号，且必须遵守所有 Transact-SQL 标识符规则。有关更多信息，请参见使用标识符。文字可以由单引号或双引号分隔。

当 SET QUOTED_IDENTIFIER 为 ON 时，由双引号分隔的所有字符串都被解释为对象标识符。因此，加引号的标识符不必遵守 Transact-SQL 标识符规则。它们可以是保留关键字，并且可以包含 Transact-SQL 标识符中通常不允许的字符。不能使用双引号分隔文字字符串表达式，而必须用单引号括住文字字符串。如果单引号 (') 是文字字符串的一部分，则可以由两个单引号 ('') 表示。当对数据库中的对象名使用保留关键字时，SET QUOTED_IDENTIFIER 必须为 ON。

当 SET QUOTED_IDENTIFIER 为 OFF（默认值）时，表达式中的文字字符串可以由单引号或双引号分隔。如果文字字符串由双引号分隔，则可以在字符串中包含嵌入式单引号，如省略号。

当在计算列或索引视图上创建或操作索引时，SET QUOTED_IDENTIFIER 必须为 ON。如果 SET QUOTED_IDENTIFIER 为 OFF，则计算列或索引视图上带索引的表上的 CREATE、UPDATE、INSERT 和 DELETE 语句将失败。有关计算列上的索引视图和索引所必需的 SET 选项设置的更多信息，请参见 SET 中的"使用 SET 语句时的注意事项"。

在进行连接时，SQL Server ODBC 驱动程序和用于 SQL Server 的 Microsoft OLE DB 提供程序自动将 QUOTED_IDENTIFIER 设置为 ON。这可以在 ODBC 数据源、ODBC 连接特性或 OLE DB 连接属性中进行配置。对来自 DB-Library 应用程序的连接，SET QUOTED_IDENTIFIER 设置默认为 OFF。

当创建存储过程时，将捕获 SET QUOTED_IDENTIFIER 和 SET ANSI_NULLS 设置，用于该存储过程的后续调用。

当在存储过程内执行 SET QUOTED_IDENTIFIER 时，其设置不更改。

当 SET ANSI_DEFAULTS 为 ON时，将启用 SET QUOTED_IDENTIFIER。

SET QUOTED_IDENTIFIER 还与 sp_dboption 的 quoted identifier 设置相对应。如果 SET QUOTED_IDENTIFIER 为 OFF，则 SQL Server 使用 sp_dboption 的 quoted identifier 设置。有关数据库设置的更多信息，请参见 sp_dboption 和设置数据库选项。

SET QUOTED_IDENTIFIER 是在分析时进行设置的。在分析时进行设置意味着：SET 语句只要出现在批处理或存储过程中即生效，与代码执行实际上是否到达该点无关；并且 SET 语句在任何语句执行之前生效。

权限

SET QUOTED_IDENTIFIER 权限默认授予所有用户。

示例
A. 使用被引用的标识符设置和保留字对象名

下例显示 SET QUOTED_IDENTIFIER 设置必须为 ON，而且表名内的关键字必须在双引号内，才能创建和使用带保留关键字的对象名。

SET QUOTED_IDENTIFIER OFF
GO
-- Attempt to create a table with a reserved keyword as a name
-- should fail.
CREATE TABLE "select" ("identity" int IDENTITY, "order" int)
GO

SET QUOTED_IDENTIFIER ON
GO

-- Will succeed.
CREATE TABLE "select" ("identity" int IDENTITY, "order" int)
GO

SELECT "identity","order"
FROM "select"
ORDER BY "order"
GO

DROP TABLE "SELECT"
GO

SET QUOTED_IDENTIFIER OFF
GO
B. 在被引用的标识符设置中使用单引号和双引号

下例显示将 SET QUOTED_IDENTIFIER 设置为 ON 和 OFF 时，在字符串表达式中使用单引号和双引号的方式。

SET QUOTED_IDENTIFIER OFF
GO
USE pubs
IF EXISTS(SELECT TABLE_NAME FROM INFORMATION_SCHEMA.VIEWS
      WHERE TABLE_NAME = 'Test')
   DROP TABLE Test
GO
USE pubs
CREATE TABLE Test ( Id int, String varchar (30) )
GO

-- Literal strings can be in single or double quotation marks.
INSERT INTO Test VALUES (1,"'Text in single quotes'")
INSERT INTO Test VALUES (2,'''Text in single quotes''')
INSERT INTO Test VALUES (3,'Text with 2 '''' single quotes')
INSERT INTO Test VALUES (4,'"Text in double quotes"')
INSERT INTO Test VALUES (5,"""Text in double quotes""")
INSERT INTO Test VALUES (6,"Text with 2 """" double quotes")
GO

SET QUOTED_IDENTIFIER ON
GO

-- Strings inside double quotation marks are now treated
-- as object names, so they cannot be used for literals.
INSERT INTO "Test" VALUES (7,'Text with a single '' quote')
GO

-- Object identifiers do not have to be in double quotation marks
-- if they are not reserved keywords.
SELECT *
FROM Test
GO

DROP TABLE Test
GO

SET QUOTED_IDENTIFIER OFF
GO

下面是结果集：

Id          String
----------- ------------------------------
1           'Text in single quotes'
2           'Text in single quotes'
3           Text with 2 '' single quotes
4           "Text in double quotes"
5           "Text in double quotes"
6           Text with 2 "" double quotes
7           Text with a single ' quote

请参见

CREATE DATABASE

CREATE DEFAULT

CREATE PROCEDURE

CREATE RULE

CREATE TABLE

CREATE TRIGGER

CREATE VIEW

数据类型

EXECUTE

SELECT

SET

sp_rename

SET ANSI_DEFAULTS


SET REMOTE_PROC_TRANSACTIONS

指定当本地事务活动时，如果执行远程存储过程，将启动由 Microsoft 分布式事务管理器 (MS DTC) 管理的 Transact-SQL 分布式事务。

语法

SET REMOTE_PROC_TRANSACTIONS { ON | OFF }

参数

ON | OFF

当设置为 ON 时，从本地事务执行远程存储过程时将启动 Transact-SQL 分布式事务。当设置为 OFF 时，从本地事务调用远程存储过程将不启动 Transact-SQL 分布式事务。

注释

当 REMOTE_PROC_TRANSACTIONS 设置为 ON 时，调用远程存储过程将启动分布式事务，并用 MS DTC 登记该事务。调用远程存储过程的服务器是事务创建者，负责控制事务的完成。当连接发出后续 COMMIT TRANSACTION 或 ROLLBACK TRANSACTION 语句时，主控服务器请求 MS DTC 在所涉及的服务器间管理分布式事务的完成。

启动 Transact-SQL 分布式事务后，可以对其它远程服务器调用远程存储过程。远程服务器全部登记在 Transact-SQL 分布式事务中，而 MS DTC 确保在每台服务器上完成该事务。

REMOTE_PROC_TRANSACTIONS 是可用于替代服务器级 sp_configure remote proc trans 选项的连接级设置。

当 REMOTE_PROC_TRANSACTIONS 设置为 OFF 时，远程存储过程调用不能成为本地事务的一部分。远程存储过程所做的修改将在存储过程完成时提交或回滚。由调用远程存储过程的连接发出的后续 COMMIT TRANSACTION 或 ROLLBACK TRANSACTION 语句对该过程所做的处理无效。

REMOTE_PROC_TRANSACTIONS 选项是一个兼容性选项，只影响对使用 sp_addserver 定义的远程服务器所进行的远程存储过程调用。有关更多信息，请参见远程存储过程构架。该选项不适用于在使用 sp_addlinkedserver 定义的链接服务器上执行存储过程的分布式查询。有关更多信息，请参见分布式查询构架。

SET REMOTE_PROC_TRANSACTIONS 的设置是在执行或运行时设置，而不是在分析时设置。

权限

SET REMOTE_PROC_TRANSACTIONS 权限默认授予所有用户。

请参见

BEGIN DISTRIBUTED TRANSACTION

分布式事务

SET

事务


SET ROWCOUNT

使 Microsoft® SQL Server™ 在返回指定的行数之后停止处理查询。

语法

SET ROWCOUNT { number | @number_var }

参数

number | @number_var

是在停止给定查询之前要处理的行数（整数）。

注释

建议将当前使用 SET ROWCOUNT 的 DELETE、INSERT 和 UPDATE 语句重新编写为使用 TOP 语法。有关更多信息，请参见 DELETE、INSERT 或 UPDATE。

对于在远程表和本地及远程分区视图上执行的 INSERT、UPDATE 和 DELETE 语句，忽略 SET ROWCOUNT 选项设置。

若要关闭该选项（以便返回所有的行），请将 SET ROWCOUNT 指定为 0。

说明 设置 SET ROWCOUNT 选项将使大多数 Transact-SQL 语句在已受指定数目的行影响后停止处理。这包括触发器和 INSERT、UPDATE 及 DELETE 等数据修改语句。ROWCOUNT 选项对动态游标无效，但限制键集的行集和不感知游标。使用该选项时应谨慎，它主要与 SELECT 语句一起使用。

如果行数的值较小，则 SET ROWCOUNT 替代 SELECT 语句 TOP 关键字。

SET ROWCOUNT 的设置是在执行或运行时设置，而不是在分析时设置。

权限

SET ROWCOUNT 权限默认授予所有用户。

示例

SET ROWCOUNT 在指定的行数后停止处理。在下例中，注意有 x 行满足预付款少于或等于 $5,000 的条件；但是，从更新所返回的行数中可以看出并非所有的行都得到处理。ROWCOUNT 影响所有的 Transact-SQL 语句。

USE pubs
GO
SELECT count(*) AS Cnt
FROM titles
WHERE advance >= 5000
GO

下面是结果集：

Cnt
-----------
11

(1 row(s) affected)

现在，将 ROWCOUNT 设置为 4，并更新预付款等于或大于 $5,000 的所有行。

-- SET ROWCOUNT to 4.
SET ROWCOUNT 4
GO
UPDATE titles
SET advance = 5000
WHERE advance >= 5000
GO

请参见

SET


SET SHOWPLAN_ALL

使 Microsoft® SQL Server™ 不执行 Transact-SQL 语句。相反，SQL Server 返回有关语句执行方式和语句预计所需资源的详细信息。

语法

SET SHOWPLAN_ALL { ON | OFF }

注释

SET SHOWPLAN_ALL 的设置是在执行或运行时设置，而不是在分析时设置。

当 SET SHOWPLAN_ALL 为 ON 时，SQL Server 返回每个语句的执行信息但不执行语句，而且 Transact-SQL 语句将不执行。将该选项设置为 ON 后，将返回有关所有后续 Transact-SQL 语句的信息，直到将该选项设置为 OFF 为止。例如，如果在 SET SHOWPLAN_ALL 为 ON 时执行 CREATE TABLE 语句，则 SQL Server 从涉及同一个表的后续 SELECT 语句返回错误信息；指定的表不存在。因此，对该表的后续引用将失败。当 SET SHOWPLAN_ALL 为 OFF 时，SQL Server 执行语句但不生成报表。

SET SHOWPLAN_ALL 是供为处理其输出而编写的应用程序使用的。使用 SET SHOWPLAN_TEXT 返回可由 Microsoft MS-DOS® 应用程序（如 osql 实用工具）读取的输出。

在存储过程内不能指定 SET SHOWPLAN_TEXT 和 SET SHOWPLAN_ALL，它们必须是批处理中的语句。

SET SHOWPLAN_ALL 将信息作为行集返回，行集形成一个层次结构树，用以表示 SQL Server 查询处理器在执行每个语句时所采取的步骤。输出中反映的每个语句都包含一个含有语句文本的行，后面跟有几个含有执行步骤详细信息的行。下表显示输出中包含的列。

列名 | 描述
StmtText | 对于不是 PLAN_ROW 类型的行，该列包含 Transact-SQL 语句的文本。对于 PLAN_ROW 类型的行，该列包含对操作的描述。该列包含物理运算符，也可以选择包含逻辑运算符。该列还可以跟有由物理运算符决定的描述。有关更多信息，请参见逻辑运算符和物理运算符。
StmtId | 当前批处理中的语句数。
NodeId | 当前查询内的节点 ID。
Parent | 上一级步骤的节点 ID。
PhysicalOp | 节点的物理实现算法。仅限于 PLAN_ROWS 类型的行。
LogicalOp | 该节点表示的关系代数运算符。仅限于 PLAN_ROWS 类型的行。
Argument | 提供有关所执行操作的辅助信息。该列的内容取决于物理运算符。
DefinedValues | 包含该运算符所引入值的用逗号分隔的列表。这些值可以是出现在当前查询（例如，在 SELECT 列表或 WHERE 子句中）内的计算表达式，或者是由查询处理器为处理该查询而引入的内部值。以后在该查询内的任何其它地方都可以引用这些定义的值。仅限于 PLAN_ROWS 类型的行。
EstimateRows | 由该运算符输出的预计行数。仅限于 PLAN_ROWS 类型的行。
EstimateIO | 该运算符的预计 I/O 成本。仅限于 PLAN_ROWS 类型的行。
EstimateCPU | 该运算符的预计 CPU 成本。仅限于 PLAN_ROWS 类型的行。
AvgRowSize | 正通过该运算符传递的行的预计平均行大小（以字节为单位）。
TotalSubtreeCost | 该操作和所有下一级操作的预计（累积）成本。
OutputList | 包含当前操作所计划的列的用逗号分隔的列表。
Warnings | 包含与当前操作相关的警告信息的用逗号分隔的列表。警告信息可以在列的列表中包含字符串"NO STATS:()"。该警告信息表示查询优化器曾尝试根据该列的统计做决策，但没有可用的统计。因此，查询优化器不得不进行推测，这可能已导致选择低效的查询计划。有关创建或更新列统计（这些统计有助于查询优化器选择更高效的查询计划）的更多信息，请参见 UPDATE STATISTICS。该列可以选择包含字符串"MISSING JOIN PREDICATE"，这表示正在进行的联接（与表有关）未使用联接谓词。意外地除去联接谓词可能导致查询的时间比预期长得多，并返回巨大的结果集。如果出现该警告，请验证是否有意除去了联接谓词。
Type | 节点类型。对于每个查询的父节点，这是 Transact-SQL 语句类型（如 SELECT、INSERT、EXECUTE 等）。对于表示执行计划的子节点，这是 PLAN_ROW 类型。
Parallel | 0 = 运算符没有以并行方式运行。 1 = 运算符正在以并行方式运行。
EstimateExecutions | 该运算符预计在当前查询运行期间将执行的次数。

权限

SET SHOWPLAN_ALL 权限默认授予所有用户。

示例

下面两个语句使用 SET SHOWPLAN_ALL 设置，显示 SQL Server 在查询内对索引的使用进行分析和优化的方法。

第一个查询在索引列上的 WHERE 子句中使用等于比较运算符 (=)。这在 LogicalOp 列内产生聚集索引查找值，在 Argument 列内产生索引名。

第二个查询在 WHERE 子句中使用 LIKE 运算符。这将强制 SQL Server 使用聚集索引扫描并查找满足 WHERE 子句条件的数据。这在含有 Argument 列内索引名的 LogicalOp 列内产生聚集索引扫描值，在含有 Argument 列内 WHERE 子句条件的 LogicalOp 列内产生筛选值。

EstimateRows 和 TotalSubtreeCost 列内用于第一个基于索引的查询的值较小，这表示与非索引查询相比，该查询的处理速度快得多且使用更少的资源。

USE pubs
GO
SET SHOWPLAN_ALL ON
GO
-- First query.
SELECT au_id
FROM authors
WHERE au_id = '409-56-7008'
GO
-- Second query.
SELECT city
FROM authors
WHERE city LIKE 'San%'
GO
SET SHOWPLAN_ALL OFF
GO

请参见

SET

SET SHOWPLAN_TEXT


SET SHOWPLAN_TEXT

使 Microsoft® SQL Server™ 不执行 Transact-SQL 语句。相反，SQL Server 返回有关如何执行语句的详细信息。

语法

SET SHOWPLAN_TEXT { ON | OFF }

注释

SET SHOWPLAN_TEXT 的设置是在执行或运行时设置，而不是在分析时设置。

当 SET SHOWPLAN_TEXT 为 ON 时，SQL Server 返回各个 Transact-SQL 语句的执行信息但不执行语句。将该选项设置为 ON 后，将返回有关所有后续 Transact-SQL 语句的信息，直到将该选项设置为 OFF 为止。例如，如果在 SET SHOWPLAN_TEXT 为 ON 时执行 CREATE TABLE 语句，SQL Server 将从涉及同一个表的后续 SELECT 语句返回错误信息；指定的表不存在。因此，对该表的后续引用将失败。当 SET SHOWPLAN_TEXT 为 OFF 时，SQL Server 执行语句但不生成报表。

SET SHOWPLAN_TEXT 用于返回可由 Microsoft MS-DOS® 应用程序（如 osql 实用工具）读取的输出。SET SHOWPLAN_ALL 返回更详细的输出供处理输出的程序使用。

在存储过程内不能指定 SET SHOWPLAN_TEXT 和 SET SHOWPLAN_ALL，它们必须是批处理中的语句。

SET SHOWPLAN_TEXT 将信息作为行集返回，行集形成一个层次结构树，用以表示 SQL Server 查询处理器在执行各语句时所采取的步骤。输出中反映的每个语句都包含一个含有语句文本的行，后面跟有几个含有执行步骤详细信息的行。下表显示输出中包含的列。

列名 | 描述
StmtText | 对于不是 PLAN_ROW 类型的行，该列包含 Transact-SQL 语句的文本。对于 PLAN_ROW 类型的行，该列包含对操作的描述。该列包含物理运算符，也可以选择包含逻辑运算符。该列的后面还可以跟有由物理运算符决定的描述。有关物理运算符的更多信息，请参见 SET SHOWPLAN_ALL 中的 Argument 列。

有关可以在显示计划输出中看到的物理和逻辑运算符的更多信息，请参见逻辑运算符和物理运算符。

权限

SET SHOWPLAN_TEXT 权限默认授予所有用户。

示例

下例显示 SQL Server 在处理语句时如何使用索引。

下面是使用索引的查询：

SET SHOWPLAN_TEXT ON
GO
USE pubs
SELECT *
FROM roysched
WHERE title_id = 'PS1372'
GO
SET SHOWPLAN_TEXT OFF
GO

下面是结果集：

StmtText
------------------------------------------------------
USE pubs

SELECT *
FROM roysched
WHERE title_id = 'PS1372'

(2 row(s) affected)

StmtText
------------------------------------------------------------------------
  |--Bookmark Lookup(BOOKMARK:([Bmk1000]), OBJECT:([pubs].[dbo].[roysched]))
       |--Index Seek(OBJECT:([pubs].[dbo].[roysched].[titleidind]), SEEK:([roysched].[title_id]='PS1372') ORDERED)

(2 row(s) affected)

下面是不使用索引的查询：

SET SHOWPLAN_TEXT ON
GO
USE pubs
SELECT *
FROM roysched
WHERE lorange < 5000
GO
SET SHOWPLAN_TEXT OFF
GO

下面是结果集：

StmtText
-------------------------------------------------
USE pubs

SELECT *
FROM roysched
WHERE lorange < 5000

(2 row(s) affected)

StmtText
------------------------------------------------------------------------
  |--Table Scan(OBJECT:([pubs].[dbo].[roysched]), WHERE:([roysched].[lorange]<5000))

(1 row(s) affected)

请参见

运算符

SET

SET SHOWPLAN_ALL


SET STATISTICS IO

使 Microsoft® SQL Server™ 显示关于 Transact-SQL 语句生成的磁盘活动量的信息。

语法

SET STATISTICS IO { ON | OFF }

注释

当 STATISTICS IO 为 ON 时，显示统计信息。为 OFF 时，不显示统计信息。

将该选项设置为 ON 后，所有的后续 Transact-SQL 语句将返回统计信息，直到将该选项设置为 OFF 为止。

有五个输出项。

输出项 | 含义
Table | 表的名称。
scan count | 执行的扫描次数。
logical reads | 从数据高速缓存读取的页数。
physical reads | 从磁盘读取的页数。
read-ahead reads | 为查询放入高速缓存的页数。

SET STATISTICS IO 是在执行或运行时设置，而不是在分析时设置。

权限

SET STATISTICS IO 权限默认授予所有用户。

请参见

SET

SET SHOWPLAN_ALL

SET STATISTICS TIME


SET STATISTICS PROFILE

显示语句的配置文件信息。STATISTICS PROFILE 对特殊查询、视图、触发器和存储过程有效。

语法

SET STATISTICS PROFILE { ON | OFF }

注释

当 STATISTICS PROFILE 为 ON 时，执行的各个查询都返回其常规结果集，后面跟一个附加结果集显示查询执行的配置文件。

附加结果集包含查询的 SHOWPLAN_ALL 列和下面这些附加列。

列名 | 描述
Rows | 各运算符生成的实际行数
Executes | 运算符执行的次数

权限

SET STATISTICS PROFILE 权限默认授予所有用户。

请参见

SET

SET SHOWPLAN_ALL

SET STATISTICS TIME

SET STATISTICS IO


SET STATISTICS TIME

显示分析、编译和执行各语句所需的毫秒数。

语法

SET STATISTICS TIME { ON | OFF }

注释

当 SET STATISTICS TIME 为 ON 时，显示语句的时间统计。为 OFF 时，不显示时间统计。

SET STATISTICS TIME 的设置是在执行或运行时设置，而不是在分析时设置。

Microsoft® SQL Server™ 不能在纤程模式下提供准确的统计，而纤程模式在启用 lightweight pooling 配置选项时激活。

只有当使用 SET STATISTICS TIME ON 执行查询时才更新 sysprocesses 表中的 cpu 列。当 SET STATISTICS TIME 为 OFF 时，将返回 0。

ON 和 OFF 设置也影响 SQL Server 企业管理器内的"当前活动的进程信息视图"中的 CPU 列。

权限

SET STATISTICS TIME 权限默认授予所有用户。

请参见

SET

SET STATISTICS IO


SET TEXTSIZE

指定由 SELECT 语句返回的 text 和 ntext 数据的大小。

语法

SET TEXTSIZE { number }

参数

number

是 text 数据的大小（一个整数），以字节为单位。SET TEXTSIZE 的最大设置为 2 GB（以字节为单位指定）。设置值为 0 时将大小重置为默认值 (4 KB)。

注释

设置 SET TEXTSIZE 会影响 @@TEXTSIZE 函数。

DB-Library 变量 DBTEXTLIMIT 也限制由 SELECT 语句返回的 text 数据大小。如果将 DBTEXTLIMIT 设置为小于 TEXTSIZE 的大小，将只返回 DBTEXTLIMIT 所指定的数量。有关更多信息，请参见 SQL Server 联机丛书中的"用于 C 语言的 DB-Library 程序设计"。

SQL Server ODBC 驱动程序和用于 SQL Server 的 Microsoft OLE DB 提供程序在连接时自动将 TEXTSIZE 设置为 2147483647。

SET TEXTSIZE 的设置是在执行或运行时设置，而不是在分析时设置。

权限

SET TEXTSIZE 权限默认授予所有用户。

请参见

数据类型

SET

@@TEXTSIZE


SET TRANSACTION ISOLATION LEVEL

控制由连接发出的所有 Microsoft® SQL Server™ SELECT 语句的默认事务锁定行为。

语法

SET TRANSACTION ISOLATION LEVEL
{ READ COMMITTED
| READ UNCOMMITTED
| REPEATABLE READ
| SERIALIZABLE
    }

参数

READ COMMITTED

指定在读取数据时控制共享锁以避免脏读，但数据可在事务结束前更改，从而产生不可重复读取或幻像数据。该选项是 SQL Server 的默认值。

READ UNCOMMITTED

执行脏读或 0 级隔离锁定，这表示不发出共享锁，也不接受排它锁。当设置该选项时，可以对数据执行未提交读或脏读；在事务结束前可以更改数据内的数值，行也可以出现在数据集中或从数据集消失。该选项的作用与在事务内所有语句中的所有表上设置 NOLOCK 相同。这是四个隔离级别中限制最小的级别。

REPEATABLE READ

锁定查询中使用的所有数据以防止其他用户更新数据，但是其他用户可以将新的幻像行插入数据集，且幻像行包括在当前事务的后续读取中。因为并发低于默认隔离级别，所以应只在必要时才使用该选项。

SERIALIZABLE

在数据集上放置一个范围锁，以防止其他用户在事务完成之前更新数据集或将行插入数据集内。这是四个隔离级别中限制最大的级别。因为并发级别较低，所以应只在必要时才使用该选项。该选项的作用与在事务内所有 SELECT 语句中的所有表上设置 HOLDLOCK 相同。

注释

一次只能设置这些选项中的一个，而且设置的选项将一直对那个连接保持有效，直到显式更改该选项为止。这是默认行为，除非在语句的 FROM 子句中在表级上指定优化选项。

SET TRANSACTION ISOLATION LEVEL 的设置是在执行或运行时设置，而不是在分析时设置。

示例

下例为会话设置 TRANSACTION ISOLATION LEVEL。对于每个后续 Transact-SQL 语句，SQL Server 将所有共享锁一直控制到事务结束为止。

SET TRANSACTION ISOLATION LEVEL REPEATABLE READ
GO
BEGIN TRANSACTION
SELECT * FROM publishers
SELECT * FROM authors
...
COMMIT TRANSACTION

请参见

调整事务隔离级别

DBCC USEROPTIONS

隔离级别

SELECT

SET


SET XACT_ABORT

指定当 Transact-SQL 语句产生运行时错误时，Microsoft® SQL Server™ 是否自动回滚当前事务。

语法

SET XACT_ABORT { ON | OFF }

注释

当 SET XACT_ABORT 为 ON 时，如果 Transact-SQL 语句产生运行时错误，整个事务将终止并回滚。为 OFF 时，只回滚产生错误的 Transact-SQL 语句，而事务将继续进行处理。编译错误（如语法错误）不受 SET XACT_ABORT 的影响。

对于大多数 OLE DB 提供程序（包括 SQL Server），隐性或显式事务中的数据修改语句必须将 XACT_ABORT 设置为 ON。唯一不需要该选项的情况是提供程序支持嵌套事务时。有关更多信息，请参见分布式查询和分布式事务。

SET XACT_ABORT 的设置是在执行或运行时设置，而不是在分析时设置。

示例

下例导致在含有其它 Transact-SQL 语句的事务中发生违反外键错误。在第一个语句集中产生错误，但其它语句均成功执行且事务成功提交。在第二个语句集中，SET XACT_ABORT 设置为 ON。这导致语句错误使批处理终止，并使事务回滚。

CREATE TABLE t1 (a int PRIMARY KEY)
CREATE TABLE t2 (a int REFERENCES t1(a))
GO
INSERT INTO t1 VALUES (1)
INSERT INTO t1 VALUES (3)
INSERT INTO t1 VALUES (4)
INSERT INTO t1 VALUES (6)
GO
SET XACT_ABORT OFF
GO
BEGIN TRAN
INSERT INTO t2 VALUES (1)
INSERT INTO t2 VALUES (2) /* Foreign key error */
INSERT INTO t2 VALUES (3)
COMMIT TRAN
GO

SET XACT_ABORT ON
GO

BEGIN TRAN
INSERT INTO t2 VALUES (4)
INSERT INTO t2 VALUES (5) /* Foreign key error */
INSERT INTO t2 VALUES (6)
COMMIT TRAN
GO

/* Select shows only keys 1 and 3 added.
   Key 2 insert failed and was rolled back, but
   XACT_ABORT was OFF and rest of transaction
   succeeded.
   Key 5 insert error with XACT_ABORT ON caused
   all of the second transaction to roll back. */

SELECT *
FROM t2
GO

DROP TABLE t2
DROP TABLE t1
GO

请参见

BEGIN TRANSACTION

COMMIT TRANSACTION

ROLLBACK TRANSACTION

SET

@@TRANCOUNT


SET @local_variable

将先前使用 DECLARE @local_variable 语句创建的指定局部变量设置为给定的值。

语法

SET { { @local_variable = expression }
| { @cursor_variable = { @cursor_variable | cursor_name
| { CURSOR [ FORWARD_ONLY | SCROLL ]
[ STATIC | KEYSET | DYNAMIC | FAST_FORWARD ]
[ READ_ONLY | SCROLL_LOCKS | OPTIMISTIC ]
[ TYPE_WARNING ]
FOR select_statement
[ FOR { READ ONLY | UPDATE [ OF column_name [ ,...n ] ] }
                    ]
                }
        } }
    }

参数

@local_variable

是除 cursor、text、ntext 或 image 外的任何类型变量的名称。变量名必须以 at 符 (@) 开头。变量名必须符合标识符规则。有关更多信息，请参见使用标识符。

expression

是任何有效的 Microsoft® SQL Server™ 表达式。

cursor_variable

是游标变量的名称。如果目标游标变量先前引用了一个不同的游标，则删除先前的引用。

cursor_name

使用 DECLARE CURSOR 语句声明的游标名。

CURSOR

指定 SET 语句包含游标声明。

SCROLL

指定游标支持所有的提取选项（FIRST、LAST、NEXT、PRIOR、RELATIVE 和 ABSOLUTE）。如果指定 SCROLL，则不能也指定 FAST_FORWARD。

FORWARD_ONLY

指定游标仅支持 FETCH NEXT 选项。只能以一个方向、从第一行到最后一行检索游标。如果没有使用 STATIC、KEYSET 或 DYNAMIC 关键字指定 FORWARD_ONLY，游标将作为 DYNAMIC 实现。如果 FORWARD_ONLY 和 SCROLL 均未指定，除非指定 STATIC、KEYSET 或 DYNAMIC 关键字，否则默认为 FORWARD_ONLY。STATIC、KEYSET 和 DYNAMIC 游标默认为 SCROLL。FAST_FORWARD 和 FORWARD_ONLY 是互斥的；如果指定一个，则不能指定另一个。

STATIC

定义一个游标，以创建将由该游标使用的数据的临时复本。对游标的所有请求都从 tempdb 中的这一临时表中得到应答；因此，在对该游标进行提取操作时返回的数据中不反映对基表所做的修改，并且该游标不允许修改。

KEYSET

指定当游标打开时，游标中行的成员资格和顺序已经固定。对行进行唯一标识的键集内置在 tempdb 内一个称为 keyset 的表中。对基表中的非键值所做的更改（由游标所有者更改或由其它用户提交）在用户滚动游标时是可视的。其他用户进行的插入是不可视的（不能通过 Transact-SQL 服务器游标进行插入）。如果某行已删除，则对该行的提取操作将返回 @@FETCH_STATUS 值 -2。从游标外更新键值类似于删除旧行后接着插入新行的操作。含有新值的行不可视，对含有旧值的行的提取操作将返回 @@FETCH_STATUS 值 -2。如果通过指定 WHERE CURRENT OF 子句用游标完成更新，则新值可视。

DYNAMIC

定义一个游标，以反映在滚动游标时对结果集内的行所做的所有数据更改。行的数据值、顺序和成员在每次提取时都会更改。动态游标不支持绝对和相对提取选项。

FAST_FORWARD

指定启用了优化的 FORWARD_ONLY 和 READ_ONLY 游标。如果指定 FAST_FORWARD，则不能也指定 SCROLL。FAST_FORWARD 和 FORWARD_ONLY 是互斥的；如果指定一个，则不能指定另一个。

READ_ONLY

防止通过该游标进行更新。在 UPDATE 或 DELETE 语句的 WHERE CURRENT OF 子句中不能引用游标。该选项替代要更新的游标的默认功能。

SCROLL LOCKS

指定确保通过游标完成的定位更新或定位删除可以成功。当将行读入游标时，SQL Server 会锁定这些行，以确保它们稍后可进行修改。如果还指定了 FAST_FORWARD，则不能指定 SCROLL_LOCKS。

OPTIMISTIC

指定如果行自从被读入游标以来已得到更新，则通过游标进行的定位更新或定位删除不成功。当将行读入游标时 SQL Server 不锁定行。相反，SQL Server 使用 timestamp 列值的比较，或者如果表没有 timestamp 列则使用校验值，以确定将行读入游标后是否已修改该行。如果已修改该行，尝试进行的定位更新或定位删除将失败。如果还指定了 FAST_FORWARD，则不能指定 OPTIMISTIC。

TYPE_WARNING

指定如果游标从所请求的类型隐式转换为另一种类型，则给客户端发送警告消息。

FOR select_statement

是定义游标结果集的标准 SELECT 语句。在游标声明的 select_statement 内不允许使用关键字 COMPUTE、COMPUTE BY、FOR BROWSE 和 INTO。

如果使用了 DISTINCT、UNION、GROUP BY 或 HAVING，或者 select_list 中包含聚合表达式，游标将创建为 STATIC。

如果每个基础表都没有唯一索引，并且请求了 SQL-92 SCROLL 游标或 Transact-SQL KEYSET 游标，则游标将自动成为 STATIC 游标。

如果 select_statement 包含 ORDER BY，而其中的列不是唯一的行标识符，则 DYNAMIC 游标将转换为 KEYSET 游标，或者，如果 KEYSET 游标不能打开，则转换为 STATIC 游标。这一点同样适用于使用不带 STATIC 关键字的 SQL-92 语法定义的游标。

READ ONLY

防止通过该游标进行更新。在 UPDATE 或 DELETE 语句的 WHERE CURRENT OF 子句中不能引用游标。该选项替代要更新的游标的默认功能。该关键字与早期的 READ_ONLY 关键字的不同之处是 READ 和 ONLY 之间是一个空格，而不是下划线。

UPDATE [OF column_name [,...n]]

定义游标内可更新的列。如果提供了 OF column_name [,...n]，则只允许修改列出的列。如果没有提供列表，则可以更新所有的列，除非已将游标定义为 READ_ONLY。

注释

声明变量后，所有变量均初始化为 NULL。使用 SET 语句将一个不是 NULL 的值赋给声明变量。给变量赋值的 SET 语句返回单值。当初始化多个变量时，为每个局部变量使用一个单独的 SET 语句。

变量只能用在表达式中，不能代替对象名或关键字。若要构造动态 SQL 语句，请使用 EXECUTE。

SET @cursor_variable 的语法规则不包含 LOCAL 和 GLOBAL 关键字。当使用 SET @cursor_variable = CURSOR... 语法时，根据 default to local cursor 数据库选项的设置，游标将创建为 GLOBAL 或 LOCAL。

即使游标变量引用全局游标，它们也始终是局部变量。当游标变量引用全局游标时，该游标既有全局游标引用，也有局部游标引用。有关更多信息，请参见示例 C。

有关更多信息，请参见 DECLARE CURSOR。

权限

SET @local_variable 权限默认授予所有用户。

示例
A. 输出使用 SET 初始化的变量值

下例创建 @myvar 变量，将一个字符串值放在变量中，并输出 @myvar 变量的值。

DECLARE @myvar char(20)
SET @myvar = 'This is a test'
SELECT @myvar
GO
B. 在 SELECT 语句中使用由 SET 赋值的局部变量

下例创建一个名为 @state 的局部变量，并在 SELECT 语句中使用该局部变量查找居住在犹他州的所有作者的姓名。

USE pubs
GO
DECLARE @state char(2)
SET @state = 'UT'
SELECT RTRIM(au_fname) + ' ' + RTRIM(au_lname) AS Name, state
FROM authors
WHERE state = @state
GO
C. 对全局游标使用 SET

下例创建一个局部变量，然后将游标变量设置为全局游标名。

DECLARE my_cursor CURSOR GLOBAL FOR SELECT * FROM authors
   DECLARE @my_variable CURSOR
   SET @my_variable = my_cursor
                      /* There is a GLOBAL declared
                         reference (my_cursor) and a LOCAL variable
                         reference (@my_variable) to the my_cursor
                         cursor.                                    */
   DEALLOCATE my_cursor  /* There is now only a LOCAL variable
                         reference (@my_variable) to the my_cursor
                         cursor.                                    */
D. 使用 SET 定义游标

下例使用 SET 语句定义游标。

DECLARE @CursorVar CURSOR

SET @CursorVar = CURSOR SCROLL DYNAMIC
FOR
SELECT LastName, FirstName
FROM Northwind.dbo.Employees
WHERE LastName like 'B%'

OPEN @CursorVar

FETCH NEXT FROM @CursorVar
WHILE @@FETCH_STATUS = 0
BEGIN
    FETCH NEXT FROM @CursorVar
END

CLOSE @CursorVar
DEALLOCATE @CursorVar
E. 通过查询赋值

下例使用查询给变量赋值。

USE Northwind
GO
DECLARE @rows int
SET @rows = (SELECT COUNT(*) FROM Customers)

请参见

DECLARE @local_variable

EXECUTE

表达式

SELECT

SET

使用变量和参数


SETUSER

允许 sysadmin 固定服务器角色成员或 db_owner 固定数据库角色成员模拟其他用户。

重要 在 Microsoft® SQL Server™ 2000 中包含 SETUSER 仅为保持向后兼容性，不推荐使用该语句。在以后的 SQL Server 版本中可能不再支持 SETUSER。

语法

SETUSER [ 'username' [ WITH NORESET ] ]

参数

'username'

是所模拟的当前数据库中的 SQL Server 或 Microsoft Windows NT® 用户名。如果未指定 username，将重新建立模拟用户的系统管理员或数据库所有者的原始标识。

WITH NORESET

指定后续 SETUSER 语句（未指定 username）不重置为系统管理员或数据库所有者。

注释

为测试其他用户的权限，sysadmin 或 db_owner 角色成员可以通过 SETUSER 采用另一个用户的标识。

仅对 SQL Server 用户使用 SETUSER。不支持 Windows 用户使用 SETUSER。如果使用 SETUSER 采用了其他用户的标识，则创建的任何对象均由所模拟的用户所有。例如，如果数据库所有者采用用户 Margaret 的标识并创建一个名为 orders 的表，则 orders 表由 Margaret 而非系统管理员所有。

创建由其他用户所有的对象不需要 SETUSER，因为创建对象时可以使用合法名称将其他用户指定为新对象的所有者。例如，如果用户 Andrew（db_owner 数据库角色成员）创建表 Margaret.customers，则 customers 由用户 Margaret 而非用户 Andrew 所有。

SETUSER 一直保持有效，直到发出其它 SETUSER 语句或用 USE 语句更改当前数据库为止。

权限

SETUSER 权限默认授予 sysadmin 固定服务器角色成员且不可转让。

示例
A. 使用 SETUSER

下例显示数据库所有者如何采用其他用户的标识。用户 mary 创建了一个名为 computer_types 的表。数据库所有者使用 SETUSER 模拟用户 mary 授予用户 joe 访问 computer_types 表的权限。

SETUSER 'mary'
go
GRANT SELECT ON computer_types TO joe
go
SETUSER
B. 使用 NORESET 选项

下例显示数据库所有者必须如何创建某些对象，然后使用最小权限测试它们的可用性。为简化起见，数据库所有者只想在整个会话期间维护授予 mary 的权限。

SETUSER 'mary' WITH NORESET
go
CREATE TABLE computer_types2
.
.
.
GRANT ...
go
SETUSER      /* This statement has no effect. */

说明 如果使用 SETUSER WITH NORESET，数据库所有者或系统管理员必须注销然后重新登录，才能重新建立自己的权限。

请参见

DENY

GRANT

REVOKE

USE


SHUTDOWN

立即停止 Microsoft® SQL Server™。

语法

SHUTDOWN [ WITH NOWAIT ]

参数

WITH NOWAIT

立即关闭 SQL Server 而不在每个数据库内执行检查点。在尝试终止所有用户进程后退出 SQL Server，并对每个活动事务执行回滚操作。

注释

除非 sysadmin 固定服务器角色成员指定 WITH NOWAIT 选项，否则 SHUTDOWN 尝试关闭 SQL Server 时的顺序方式为：

  1. 禁用登录（sysadmin 固定服务器角色成员除外）。若要查看所有当前用户的列表，请执行 sp_who。

  2. 等待当前正在执行的 Transact-SQL 语句或存储过程执行完毕。若要查看所有活动进程和锁的列表，请执行 sp_lock 和 sp_who。

  3. 在每个数据库内执行检查点。

当 sysadmin 固定服务器角色成员重新启动 SQL Server 时，使用 SHUTDOWN 语句可以将需要做的自动恢复工作减到最小。

还可以使用下面这些工具和方法停止 SQL Server。每个工具或方法都在所有数据库内执行检查点。从数据高速缓存中刷新所有提交的数据后，通过下列工具和方法停止服务器：

  • 使用 SQL Server 企业管理器。

  • 在命令提示符下使用 net stop mssqlserver。

  • 使用"控制面板"中的"服务"应用程序。

  • 使用 SQL Server 服务管理器。

如果是从命令提示符下启动的 sqlservr.exe，按 CTRL+C 键可关闭 SQL Server。然而，按 CTRL+C 键将不执行检查点。

说明 通过 Server 企业管理器、net stop、控制面板和 SQL Server 服务管理器停止 SQL Server 的方法所生成的服务控制消息与使用 SERVICE_CONTROL_STOP 停止 SQL Server 所生成的相同。

权限

SHUTDOWN 权限默认授予 sysadmin 和 serveradmin 固定服务器角色的成员且不可转让。

请参见

CHECKPOINT

sp_lock

sp_who

sqlservr 应用程序

停止 SQL Server


SIGN

返回给定表达式的正 (+1)、零 (0) 或负 (-1) 号。

语法

SIGN ( numeric_expression )

参数

numeric_expression

精确数字或近似数字数据类型类别的表达式（bit 数据类型除外）。

返回类型

float

示例

下例返回从 -1 到 1 的 SIGN 数值。

DECLARE @value real
SET @value = -1
WHILE @value < 2
   BEGIN
      SELECT SIGN(@value)
      SET NOCOUNT ON
      SELECT @value = @value + 1
      SET NOCOUNT OFF
   END
SET NOCOUNT OFF
GO

下面是结果集：

(1 row(s) affected)

------------------------
-1.0

(1 row(s) affected)

------------------------
0.0

(1 row(s) affected)

------------------------
1.0

(1 row(s) affected)

请参见

数学函数


SIN

以近似数字 (float) 表达式返回给定角度（以弧度为单位）的三角正弦值。

语法

SIN ( float_expression )

参数

float_expression

是 float 类型的表达式。

返回类型

float

示例

下例计算给定角度的 SIN 值。

DECLARE @angle float
SET @angle = 45.175643
SELECT 'The SIN of the angle is: ' + CONVERT(varchar,SIN(@angle))
GO

下面是结果集：

The SIN of the angle is: 0.929607

(1 row(s) affected)

请参见

数学函数


smalldatetime

有关 smalldatetime 数据类型的信息，请参见 datetime 和 smalldatetime。

请参见

数据类型转换

数据类型


smallint

有关 smallint 数据类型的信息，请参见 int、bigint、smallint 和 tinyint。

请参见

数据类型转换

数据类型


smallmoney

有关 smallmoney 数据类型的信息，请参见 money 和 smallmoney。

请参见

数据类型转换

数据类型


SOME | ANY

用标量值与单列集中的值进行比较。

语法

scalar_expression { = | < > | != | > | > = | ! > | < | < = | ! < }
{ SOME | ANY } ( subquery )

参数

scalar_expression

是任何有效的 Microsoft® SQL Server™ 表达式。

{ = | <> | != | > | >= | !> | < | <= | !< }

是任何有效的比较运算符。

SOME | ANY

指定应进行比较。

subquery

是包含某列结果集的子查询。所返回列的数据类型必须是与 scalar_expression 相同的数据类型。

结果类型

Boolean

结果值

对于 ANY 对 (scalar_expression, x)（其中 x 是单列集中的值），当指定的比较是 TRUE时，SOME 或 ANY 返回 TRUE。否则返回 FALSE。

请参见

CASE

表达式

函数

运算符（逻辑运算符）

SELECT

WHERE


SOUNDEX

返回由四个字符组成的代码 (SOUNDEX) 以评估两个字符串的相似性。

语法

SOUNDEX ( character_expression )

参数

character_expression

是字符数据的字母数字表达式。character_expression 可以是常数、变量或列。

返回类型

char

注释

SOUNDEX 将 alpha 字符串转换成由四个字符组成的代码，以查找相似的词或名称。代码的第一个字符是 character_expression 的第一个字符，代码的第二个字符到第四个字符是数字。将忽略 character_expression 中的元音，除非它们是字符串的第一个字母。可以嵌套字符串函数。

示例

下例显示 SOUNDEX 函数及相关的 DIFFERENCE 函数。在第一个示例中，返回所有辅音字母的标准 SOUNDEX 值。为 Smith 和 Smythe 返回的 SOUNDEX 结果相同，因为不包括所有元音、字母 y、连写字母和字母 h。

-- Using SOUNDEX
SELECT SOUNDEX ('Smith'), SOUNDEX ('Smythe')

下面是结果集：

----- -----
S530  S530

(1 row(s) affected)

DIFFERENCE 函数比较 SOUNDEX 模式结果的差。第一个示例显示两个仅元音不同的字符串。返回的差是 4（可能的最小差）。

-- Using DIFFERENCE
SELECT DIFFERENCE('Smithers', 'Smythers')
GO

下面是结果集：

-----------
4

(1 row(s) affected)

在下例中，字符串的辅音不同，所以返回的差是 2（较高的差）。

SELECT DIFFERENCE('Anothers', 'Brothers')
GO

下面是结果集：

-----------
2

(1 row(s) affected)

请参见

字符串函数


SPACE

返回由重复的空格组成的字符串。

语法

SPACE ( integer_expression )

参数

integer_expression

是表示空格个数的正整数。如果 integer_expression 为负，则返回空字符串。

返回类型

char

注释

若要在 Unicode 数据中包括空格，请使用 REPLICATE 而非 SPACE。

示例

下例剪裁作者的姓氏并串联一个逗号、两个空格和作者的名字。

USE pubs
GO
SELECT RTRIM(au_lname) + ',' + SPACE(2) +  LTRIM(au_fname)
FROM authors
ORDER BY au_lname, au_fname
GO

下面是结果集：

Name
---------------------------------------------------------------
Bennet,  Abraham
Blotchet-Halls,  Reginald
Carson,  Cheryl
DeFrance,  Michel
del Castillo,  Innes
Dull,  Ann
Green,  Marjorie
Greene,  Morningstar
Gringlesby,  Burt
Hunter,  Sheryl
Karsen,  Livia
Locksley,  Charlene
MacFeather,  Stearns
McBadden,  Heather
O'Leary,  Michael
Panteley,  Sylvia
Ringer,  Albert
Ringer,  Anne
Smith,  Meander
Straight,  Dean
Stringer,  Dirk
White,  Olivier
Yokomoto,  Akiko

(23 row(s) affected)

请参见

字符串函数


sql_variant

一种存储 SQL Server 支持的各种数据类型（text、ntext、image、timestamp 和 sql_variant 除外）值的数据类型。

sql_variant 可以用在列、参数和变量中并返回用户定义函数的值。sql_variant 允许这些数据库对象支持其它数据类型的值。

语法

sql_variant

注释

sql_variant 类型的列可以包含不同数据类型的行。例如，定义为 sql_variant 的列可以存储 int、binary 和 char 值。不能使用 sql_variant 存储的值类型只有 text、ntext、image、timestamp 和 sql_variant。

sql_variant 的最大长度可达 8016 字节。

必须先将 sql_variant 数据类型投影为其基本数据类型值，才能使其参与加和减这类运算。

可以给 sql_variant 赋一个默认值。该数据类型还可以将 NULL 作为其基础值，但是 NULL 值没有关联的基本类型。另外，sql_variant 还可以不将其它 sql_variant 作为其基本类型。

UNIQUE、主键或外键可以包含 sql_variant 类型列，但是包含给定行键的数据值总长度不应大于索引的最大长度（目前是 900 字节）。

表可以有任意多个 sql_variant 列。

sql_variant 不能在 CONTAINSTABLE 和 FREETEXTTABLE 中使用。

ODBC 不完全支持 sql_variant。因此，当使用用于 ODBC 的 Microsoft OLE DB 提供程序 (MSDASQL) 时，sql_variant 列的查询作为二进制数据返回。例如，包含字符串数据 'PS2091' 的 sql_variant 列作为 0x505332303931 返回。

比较 sql_variant 值

sql_variant 数据类型属于用于转换的数据类型层次结构列表的顶部。为了比较 sql_variant 值，SQL Server 数据类型层次结构顺序划分为数据类型系列。

数据类型层次结构 | 数据类型系列
sql_variant | sql_variant
datetime | datetime
smalldatetime | datetime
float | 近似数
real | 近似数
decimal | 精确数
money | 精确数
smallmoney | 精确数
bigint | 精确数
int | 精确数
smallint | 精确数
tinyint | 精确数
bit | 精确数
nvarchar | Unicode
nchar | Unicode
varchar | Unicode
char | Unicode
varbinary | binary
binary | binary
uniqueidentifier | uniqueidentifier

适用于 sql_variant 比较的规则如下：

  • 当具有不同基本数据类型的 sql_variant 值进行比较，而且基本数据类型属于不同的数据类型系列时，在层次结构图中数据类型系列较高的值，被认为在二者中值较大。

  • 当具有不同基本数据类型的 sql_variant 值进行比较，而且基本数据类型属于相同的数据类型系列，在层次结构图中基本数据类型比较低的值先隐性转换成其它数据类型，然后再进行比较。

  • 当比较具有 char、varchar、nchar 或 varchar 数据类型的 sql_variant 值时，将基于以下准则对它们进行比较：LCID、LCID 版本、比较标志和排序 ID。这些准则中的每一个都作为整型值并按列出的顺序进行比较。

请参见

CAST 和 CONVERT

使用 sql_variant 数据


SQL_VARIANT_PROPERTY

返回有关 sql_variant 值的基本数据类型和其它信息。

语法

SQL_VARIANT_PROPERTY ( expression, property )

参数

expression

是 sql_variant 类型的表达式。

property

包含将为其提供信息的 sql_variant 属性名称。property 是 varchar(128)，可以是下列任何值。

值 | 描述 | 返回的 sql_variant 基本类型
BaseType | SQL Server 数据类型，如： char int money nchar ntext numeric nvarchar real smalldatetime smallint smallmoney text timestamp tinyint uniqueidentifier varbinary varchar | sysname 无效的输入 = NULL
Precision | 数字基本数据类型的位数： datetime = 23 smalldatetime = 16 float = 53 real = 24 decimal (p,s) and numeric (p,s) = p money = 19 smallmoney = 10 int = 10 smallint = 5 tinyint = 3 bit = 1 all other types = 0 | int 无效的输入 = NULL
Scale | 数字基本数据类型小数点右边的位数： decimal (p,s) 和 numeric (p,s) = s money 和 smallmoney = 4 datetime = 3 所有其它类型 = 0 | int 无效的输入 = NULL
TotalBytes | 要包含值的元数据和数据所需的字节数。该信息在检查 sql_variant 列中数据的最大一侧时很有用。如果该值大于 900，索引创建将失败。 | int 无效的输入 = NULL
Collation | 代表特定 sql_variant 值的排序规则。 | sysname 无效的输入 = NULL
MaxLength | 最大数据类型长度（以字节为单位）。例如，nvarchar(50) 的 MaxLength 是 100，int 的 MaxLength 是 4。 | int 无效的输入 = NULL

返回类型

sql_variant

示例

下例假定 tableA 包含 colB 和属于 sql_variant 类型的 colA，检索有关值为 46279.1 的 colA（其中 colB =1689）的 SQL_VARIANT_PROPERTY 信息。

CREATE   TABLE tableA(colA sql_variant, colB int)
INSERT INTO tableA values ( cast (46279.1 as decimal(8,2)), 1689)
SELECT   SQL_VARIANT_PROPERTY(colA,'BaseType'),
         SQL_VARIANT_PROPERTY(colA,'Precision'),
         SQL_VARIANT_PROPERTY(colA,'Scale')
FROM      tableA
WHERE      colB = 1689

下面是结果集。（注意这三个值每个都是 sql_variant。)

decimal 8 2

请参见

sql_variant

使用 sql_variant 数据


SQRT

返回给定表达式的平方根。

语法

SQRT ( float_expression )

参数

float_expression

是 float 类型的表达式。

返回类型

float

示例

下例返回 1.00 到 10.00 之间的数字的平方根。

DECLARE @myvalue float
SET @myvalue = 1.00
WHILE @myvalue < 10.00
   BEGIN
      SELECT SQRT(@myvalue)
      SELECT @myvalue = @myvalue + 1
   END
GO

下面是结果集：

------------------------
1.0
------------------------
1.4142135623731
------------------------
1.73205080756888
------------------------
2.0
------------------------
2.23606797749979
------------------------
2.44948974278318
------------------------
2.64575131106459
------------------------
2.82842712474619
------------------------
3.0

请参见

数学函数


SQUARE

返回给定表达式的平方。

语法

SQUARE ( float_expression )

参数

float_expression

是 float 类型的表达式。

返回类型

float

示例

下例返回半径为 1 英寸、高为 5 英寸的圆柱容积。

DECLARE @h float, @r float
SET @h = 5
SET @r = 1
SELECT PI()* SQUARE(@r)* @h AS 'Cyl Vol'

下面是结果：

Cyl Vol
--------------------------
15.707963267948966

请参见

数学函数


STATS_DATE

返回最后一次更新指定索引统计的日期。

语法

STATS_DATE ( table_id , index_id )

参数

table_id

是所用表的 ID。

index_id

是所用索引的 ID。

返回类型

datetime

注释

系统函数可以在选择列表、WHERE 子句和任何允许使用表达式的地方使用。

示例

下例返回最后一次更新指定对象统计的日期。

USE master
GO
SELECT 'Index Name' = i.name,
   'Statistics Date' = STATS_DATE(i.id, i.indid)
FROM sysobjects o, sysindexes i
WHERE o.name = 'employee' AND o.id = i.id
GO

请参见

系统函数

WHERE


STDEV

返回给定表达式中所有值的统计标准偏差。

语法

STDEV ( expression )

参数

expression

是数字表达式。不允许进行聚合函数运算和子查询。expression 是精确数字或近似数字数据类型分类（bit 数据类型除外）的表达式。

返回类型

float

注释

如果在 SELECT 语句中的所有项目上使用 STDEV，则计算中包括结果集内的每个值。STDEV 只能用于数字列。空值将被忽略。

示例

下例返回 titles 表中所有版税费用的标准偏差。

USE pubs
SELECT STDEV(royalty)
FROM titles

请参见

聚合函数


STDEVP

返回给定表达式中所有值的填充统计标准偏差。

语法

STDEVP ( expression )

参数

expression

是数字表达式。不允许进行聚合函数运算和子查询。expression 是精确数字或近似数字数据类型分类（bit 数据类型除外）的表达式。

返回类型

float

注释

如果在 SELECT 语句中的所有项目上使用 STDEVP，则计算中包括结果集内的每个值。STDEVP 只能用于数字列。空值将被忽略。

示例

下例返回 titles 表中所有版税值的填充标准偏差。

USE pubs
SELECT STDEVP(royalty)
FROM titles

请参见

聚合函数


STR

由数字数据转换来的字符数据。

语法

STR ( float_expression [ , length [ , decimal ] ] )

参数

float_expression

是带小数点的近似数字 (float) 数据类型的表达式。不要在 STR 函数中将函数或子查询用作 float_expression。

length

是总长度，包括小数点、符号、数字或空格。默认值为 10。

decimal

是小数点右边的位数。

返回类型

char

注释

如果为 STR 提供 length 和 decimal 参数值，则这些值应该是正数。在默认情况下或者小数参数为 0 时，数字四舍五入为整数。指定长度应该大于或等于小数点前面的数字加上数字符号（若有）的长度。短的 float_expression 在指定长度内右对齐，长的 float_expression 则截断为指定的小数位数。例如，STR(12,10) 输出的结果是 12，在结果集内右对齐。而 STR(1223, 2) 则将结果集截断为 **。可以嵌套字符串函数。

说明 若要转换为 Unicode 数据，请在 CONVERT 或 CAST 转换函数内使用 STR。

示例
A. 使用 STR

下例将包含五个数字和一个小数点的表达式转换为有六个位置的字符串。数字的小数部分四舍五入为一个小数位。

SELECT STR(123.45, 6, 1)
GO

下面是结果集：

------
 123.5

(1 row(s) affected)

当表达式超出指定长度时，字符串为指定长度返回 **。

SELECT STR(123.45, 2, 2)
GO

下面是结果集：

--
**

(1 row(s) affected)

即使数字数据嵌套在 STR内，结果集也是带指定格式的字符数据。

SELECT STR (FLOOR (123.45), 8, 3)
GO

下面是结果集：

--------
 123.000

(1 row(s) affected)
B. 使用 STR 和 CONVERT 函数

下例比较 STR 和 CONVERT 的结果。

SELECT STR(3.147) AS 'STR',
       STR(3.147, 5, 2) AS '2 decimals',
       STR(3.147, 5, 3) AS '3 decimals'
GO

下面是结果集：

STR        2 decimals 3 decimals
---------- ---------- ----------
         3  3.15      3.147

(1 row(s) affected)

-- Use CONVERT.
SELECT CONVERT(char(1), 3.147) AS 'CHAR(1)',
       CONVERT(char(3), 3.147) AS 'CHAR(3)',
       CONVERT(char(5), 3.147) AS 'CHAR(5)'
GO

下面是结果集：

CHAR(1) CHAR(3) CHAR(5)
------- ------- -------
(null)  (null)  3.147

(1 row(s) affected)

请参见

字符串函数


STUFF

删除指定长度的字符并在指定的起始点插入另一组字符。

语法

STUFF ( character_expression , start , length , character_expression )

参数

character_expression

由字符数据组成的表达式。character_expression 可以是常量、变量，也可以是字符或二进制数据的列。

start

是一个整形值，指定删除和插入的开始位置。如果 start 或 length 是负数，则返回空字符串。如果 start 比第一个 character_expression 长，则返回空字符串。

length

是一个整数，指定要删除的字符数。如果 length 比第一个 character_expression 长，则最多删除到最后一个 character_expression 中的最后一个字符。

返回类型

如果 character_expression 是一个支持的字符数据类型，则返回字符数据。如果 character_expression 是一个支持的 binary 数据类型，则返回二进制数据。

注释

可以嵌套字符串函数。

示例

下例通过在第一个字符串 (abcdef) 中删除从第二个位置（字符 b）开始的三个字符，然后在删除的起始位置插入第二个字符串，创建并返回一个字符串。

SELECT STUFF('abcdef', 2, 3, 'ijklmn')
GO

下面是结果集：

---------
aijklmnef

(1 row(s) affected)

请参见

数据类型

字符串函数


SUBSTRING

返回字符、binary、text 或 image 表达式的一部分。有关可与该函数一起使用的有效 Microsoft® SQL Server™ 数据类型的更多信息，请参见数据类型。

语法

SUBSTRING ( expression , start , length )

参数

expression

是字符串、二进制字符串、text、image、列或包含列的表达式。不要使用包含聚合函数的表达式。

start

是一个整数，指定子串的开始位置。

length

是一个整数，指定子串的长度（要返回的字符数或字节数）。

说明 由于在 text 数据上使用 SUBSTRING 时 start 和 length 指定字节数，因此 DBCS 数据（如日本汉字）可能导致在结果的开始或结束位置拆分字符。此行为与 READTEXT 处理 DBCS 的方式一致。然而，由于偶而会出现奇怪的结果，建议对 DBCS 字符使用 ntext 而非 text。

返回类型

如果 expression 是支持的字符数据类型，则返回字符数据。如果 expression 是支持的 binary 数据类型，则返回二进制数据。

返回字符串的类型与给定表达式的类型相同（表中显示的除外）。

给定的表达式 | 返回类型
text | varchar
image | varbinary
ntext | nvarchar

注释

在字符数中必须指定使用 ntext、char 或 varchar 数据类型的偏移量（start 和 length）。在字节数中必须指定使用 text、image、binary 或 varbinary 数据类型的偏移量。

说明 兼容级别可能影响返回值。有关兼容级别的更多信息，请参见 sp_dbcmptlevel。

示例
A. 在字符串上使用 SUBSTRING

下例显示如何只返回字符串的一部分。该查询在一列中返回 authors 表中的姓氏，在另一列中返回 authors 表中的名字首字母。

USE pubs
SELECT au_lname, SUBSTRING(au_fname, 1, 1)
FROM authors
ORDER BY au_lname

下面是结果集：

au_lname
---------------------------------------- -
Bennet                                   A
Blotchet-Halls                           R
Carson                                   C
DeFrance                                 M
del Castillo                             I
...
Yokomoto                                 A

(23 row(s) affected)

下例显示如何显示字符串常量 abcdef 中的第二个、第三个和第四个字符。

SELECT x = SUBSTRING('abcdef', 2, 3)

下面是结果集：

x
----------
bcd

(1 row(s) affected)
B. 在 text、ntext 和 image 数据上使用 SUBSTRING

下例显示如何从 pubs 数据库的 publishers 表内的每个 text 和 image 数据列中返回前 200 个字符。text 数据以 varchar 的形式返回，image 数据则以 varbinary 的形式返回。

USE pubs
SELECT pub_id, SUBSTRING(logo, 1, 10) AS logo,
   SUBSTRING(pr_info, 1, 10) AS pr_info
FROM pub_info
WHERE pub_id = '1756'

下面是结果集：

pub_id logo                   pr_info
------ ---------------------- ----------
1756   0x474946383961E3002500 This is sa

(1 row(s) affected)

下例显示 SUBSTRING 在 text 和 ntext 数据上的效果。首先，下例在 pubs 数据库内创建一个名为 npr_info 的新表。然后，在 npr_info 表中用 pub_info.pr_info 列的前 80 个字符创建 pr_info 列，并添加ü作为首字符。最后，INNER JOIN 检索所有出版商标识号以及 text 和 ntext 出版商信息列的 SUBSTRING。

IF EXISTS (SELECT table_name FROM INFORMATION_SCHEMA.TABLES
      WHERE table_name = 'npub_info')
   DROP TABLE npub_info
GO
-- Create npub_info table in pubs database. Borrowed from instpubs.sql.
USE pubs
GO
CREATE TABLE npub_info
(
 pub_id         char(4)           NOT NULL
         REFERENCES publishers(pub_id)
         CONSTRAINT UPKCL_npubinfo PRIMARY KEY CLUSTERED,
 pr_info        ntext             NULL
)

GO

-- Fill the pr_info column in npub_info with international data.
RAISERROR('Now at the inserts to pub_info...',0,1)

GO

INSERT npub_info VALUES('0736', N'üThis is sample text data for New Moon Books, publisher 0736 in the pubs database')
INSERT npub_info values('0877', N'üThis is sample text data for Binnet & Hardley, publisher 0877 in the pubs databa')
INSERT npub_info values('1389', N'üThis is sample text data for Algodata Infosystems, publisher 1389 in the pubs da')
INSERT npub_info values('9952', N'üThis is sample text data for Scootney Books, publisher 9952 in the pubs database')
INSERT npub_info values('1622', N'üThis is sample text data for Five Lakes Publishing, publisher 1622 in the pubs d')
INSERT npub_info values('1756', N'üThis is sample text data for Ramona Publishers, publisher 1756 in the pubs datab')
INSERT npub_info values('9901', N'üThis is sample text data for GGG&G, publisher 9901 in the pubs database. GGG&G i')
INSERT npub_info values('9999', N'üThis is sample text data for Lucerne Publishing, publisher 9999 in the pubs data')
GO
-- Join between npub_info and pub_info on pub_id.
SELECT pr.pub_id, SUBSTRING(pr.pr_info, 1, 35) AS pr_info,
   SUBSTRING(npr.pr_info, 1, 35) AS npr_info
FROM pub_info pr INNER JOIN npub_info npr
   ON pr.pub_id = npr.pub_id
ORDER BY pr.pub_id ASC

请参见

字符串函数


SUM

返回表达式中所有值的和，或只返回 DISTINCT 值。SUM 只能用于数字列。空值将被忽略。

语法

SUM ( [ ALL | DISTINCT ] expression )

参数

ALL

对所有的值进行聚合函数运算。ALL 是默认设置。

DISTINCT

指定 SUM 返回唯一值的和。

expression

是常量、列或函数，或者是算术、按位与字符串等运算符的任意组合。expression 是精确数字或近似数字数据类型分类（bit 数据类型除外）的表达式。不允许使用聚合函数和子查询。

返回类型

以最精确的 expression 数据类型返回所有表达式值的和。

表达式结果 | 返回类型
整数分类 | int
decimal 分类 (p, s) | decimal(38, s)
money 和 smallmoney 分类 | money
float 和 real 分类 | float

重要 当使用 CUBE 或 ROLLUP 时，不支持区分聚合，例如 AVG(DISTINCT column_name)、COUNT(DISTINCT column_name)、MAX(DISTINCT column_name)、MIN(DISTINCT column_name) 和 SUM(DISTINCT column_name)。如果使用了，Microsoft® SQL Server™ 将返回错误信息并取消查询。

示例
A. 在聚合和行聚合中使用 SUM

下列示例显示聚合函数和行聚合函数之间的区别。第一个示例显示只提供汇总数据的聚合函数，第二个示例显示提供详尽数据和汇总数据的行聚合函数。

USE pubs
GO
-- Aggregate functions
SELECT type, SUM(price), SUM(advance)
FROM titles
WHERE type LIKE '%cook'
GROUP BY type
ORDER BY type
GO

下面是结果集：

type
------------ -------------------------- --------------------------
mod_cook     22.98                      15,000.00
trad_cook    47.89                      19,000.00

(2 row(s) affected)

USE pubs
GO
-- Row aggregates
SELECT type, price, advance
FROM titles
WHERE type LIKE '%cook'
ORDER BY type
COMPUTE SUM(price), SUM(advance) BY type

下面是结果集：

type         price                      advance
------------ -------------------------- --------------------------
mod_cook     19.99                      0.00
mod_cook     2.99                       15,000.00

             sum
             ==========================
             22.98
                                        sum
                                        ==========================
                                        15,000.00

type         price                      advance
------------ -------------------------- --------------------------
trad_cook    20.95                      7,000.00
trad_cook    11.95                      4,000.00
trad_cook    14.99                      8,000.00

             sum
             ==========================
             47.89
                                        sum
                                        ==========================
                                        19,000.00

(7 row(s) affected)
B. 计算多列的组合计

下例计算每类书籍的价格和预付款总和。

USE pubs
GO
SELECT type, SUM(price), SUM(advance)
FROM titles
GROUP BY type
ORDER BY type
GO

下面是结果集：

type
------------ -------------------------- --------------------------
business     54.92                      25,125.00
mod_cook     22.98                      15,000.00
popular_comp 42.95                      15,000.00
psychology   67.52                      21,275.00
trad_cook    47.89                      19,000.00
UNDECIDED    (null)                     (null)

(6 row(s) affected)

请参见

聚合函数


SUSER_ID

返回用户的登录标识号。

重要 SUSER_ID 在 Microsoft® SQL Server™ 2000 中使用时始终返回 NULL。包括该系统内置函数只是为了向后兼容。请改用 SUSER_SID。

语法

SUSER_ID ( [ 'login' ] )

参数

'login'

是用户的登录标识名。login是 nchar（可选）。如果将 login 指定为 char，它将隐性转换成 nchar。login 可以是任何具有连接到 SQL Server 权限的 SQL Server 登录或 Microsoft Windows NT® 用户或组。如果未指定 login，则返回当前用户的登录标识号。

返回类型

int

注释

在 SQL Server 7.0 中，安全标识号 (SID) 替换服务器用户标识号 (SUID)。

SUSER_SID 只返回在 syslogins 系统表中有条目的登录的 SUID。

系统函数可以在选择列表、WHERE 子句和任何允许使用表达式的地方使用，并且后面必须始终有圆括号（即使未指定任何参数）。

示例

下例返回 sa 登录的登录标识号。

SELECT SUSER_ID('sa')

请参见

安全管理

系统函数


SUSER_NAME

返回用户的登录标识名。

重要 SUSER_NAME 在 Microsoft® SQL Server™ 2000 中使用时始终返回 NULL。包括该系统内置函数只是为了向后兼容。请改用 SUSER_SNAME。

语法

SUSER_NAME ( [ server_user_id ] )

参数

server_user_id

是用户的登录标识号。server_user_id（可选）的数据类型为 int。server_user_id 可以是任何 SQL Server 登录或有权连接到 SQL Server 的 Microsoft Windows NT® 用户或组的登录标识号。如果未指定 server_user_id，则返回当前用户的登录标识名。

返回类型

nchar

注释

在 SQL Server 7.0 中，安全标识号 (SID) 替换服务器用户标识号 (SUID)。

SUSER_NAME 只返回在 syslogins 系统表中有条目的登录的登录名。

系统函数可以在选择列表、WHERE 子句和任何允许使用表达式的地方使用，并且后面必须始终有圆括号（即使未指定任何参数）。

示例

下例返回登录标识号为 1 的用户登录标识名。

SELECT SUSER_NAME(1)

请参见

安全管理

系统函数


SUSER_SID

返回用户登录名的安全标识号 (SID)。

语法

SUSER_SID ( [ 'login' ] )

参数

'login'

是用户的登录名。login（可选）的数据类型为 sysname，可以是 Microsoft® SQL Server™ 登录或 Microsoft Windows NT® 用户或组。如果未指定 login，则返回有关当前用户的信息。

返回类型

varbinary(85)

注释

当使用 SQL Server 身份验证指定 SQL Server 登录时，必须授予用户连接到 SQL Server 的权限。使用 sp_addlogin 或 SQL Server 企业管理器授予该权限。但是，当使用 Windows 身份验证指定 Windows NT 用户或组时，不必授予该用户或组连接到 SQL Server 的权限。

SUSER_SID 在 ALTER TABLE 或 CREATE TABLE 中可用作 DEFAULT 约束。

系统函数可以在选择列表、WHERE 子句和任何允许使用表达式的地方使用，并且后面必须始终有圆括号（即使未指定任何参数）。

示例
A. 使用 SUSER_SID

下例返回 SQL Server sa 登录的安全标识号。

SELECT SUSER_SID('sa')
B. 对 Windows NT 用户名使用 SUSER_SID

下例返回 Windows NT 用户 London\Workstation1 的安全标识号。

SELECT SUSER_SID('London\Workstation1')
C. 将 SUSER_SID 用作 DEFAULT 约束

下例在 CREATE TABLE 语句中将 SUSER_SID 用作 DEFAULT 约束。

USE pubs
GO
CREATE TABLE sid_example
(
login_sid   varbinary(85) DEFAULT SUSER_SID(),
login_name  varchar(30) DEFAULT SYSTEM_USER,
login_dept  varchar(10) DEFAULT 'SALES',
login_date  datetime DEFAULT GETDATE()
)
GO
INSERT sid_example DEFAULT VALUES
GO

请参见

ALTER TABLE

binary 和 varbinary

CREATE TABLE

安全管理

sp_addlogin

sp_grantlogin

系统函数


SUSER_SNAME

从用户的安全标识号 (SID) 返回登录标识名。

语法

SUSER_SNAME ( [ server_user_sid ] )

参数

server_user_sid

是用户的安全标识号。server_user_sid（可选）的数据类型为 varbinary(85)，可以是任何 Microsoft® SQL Server™ 登录或 Microsoft Windows NT® 用户或组的安全标识号。如果未指定 server_user_sid，则返回有关当前用户的信息。

返回类型

nvarchar(256)

注释

当使用 SQL Server 身份验证指定 SQL Server 登录时，必须授予用户连接到 SQL Server 的权限。使用 sp_addlogin 或 SQL Server 企业管理器授予该权限。但是，当使用 Windows 身份验证指定 Windows NT 用户或组时，不必授予该用户或组连接到 SQL Server 的权限。

SUSER_SNAME 在 ALTER TABLE 或 CREATE TABLE 中可用作 DEFAULT 约束。

系统函数可以在选择列表、WHERE 子句和任何允许使用表达式的地方使用，并且后面必须始终有圆括号（即使未指定任何参数）。

示例
A. 使用 SUSER_SNAME

下例返回值为 0x01 的安全标识号的登录名。

SELECT SUSER_SNAME(0x01)
B. 对 Windows NT 用户的安全标识号使用 SUSER_SNAME

下例返回（通过使用 SUSER_SID 获得的）Windows NT 用户安全标识号的登录名。

SELECT SUSER_SNAME(0x010500000000000515000000a065cf7e784b9b5fe77c87705a2e0000)
C. 将 SUSER_SNAME 用作 DEFAULT 约束

下例在 CREATE TABLE 语句中将 SUSER_SNAME 用作 DEFAULT 约束。

USE pubs
GO
CREATE TABLE sname_example
(
login_sname sysname DEFAULT SUSER_SNAME(),
employee_id uniqueidentifier DEFAULT NEWID(),
login_date  datetime DEFAULT GETDATE()
)
GO
INSERT sname_example DEFAULT VALUES
GO

请参见

ALTER TABLE

binary 和 varbinary

CREATE TABLE

安全管理

sp_addlogin

sp_grantlogin

系统函数


SYSTEM_USER

当未指定默认值时，允许将系统为当前系统用户名提供的值插入表中。

语法

SYSTEM_USER

注释

在 CREATE TABLE 或 ALTER TABLE 语句中将 SYSTEM_USER niladic 函数用在 DEFAULT 约束中，或作为任何标准函数使用。

如果当前用户使用 Windows 身份验证登录到 Microsoft® SQL Server™，SYSTEM_USER 将返回 Windows 2000 或 Windows NT 4.0 登录标识名称，例如"DOMAIN\user_login_name"。然而，如果当前用户使用 SQL Server 身份验证登录到 SQL Server，SYSTEM_USER 将返回 SQL Server 登录标识名称，例如，当用户以 sa 登录时将返回 sa。

示例
A. 使用 SYSTEM_USER 返回当前系统用户名

本示例声明一个 char 变量，将 SYSTEM_USER 的当前值置于该变量中，然后打印该变量。

DECLARE @sys_usr char(30)
SET @sys_usr = SYSTEM_USER
SELECT 'The current system user is: '+ @sys_usr
GO

下面是结果集：

----------------------------------------------------------
The current system user is: sa

(1 row(s) affected)
B. 在 DEFAULT 约束中使用 SYSTEM_USER

本示例创建一个表，将 SYSTEM_USER 用作病人数据行中 receptionist 列的 DEFAULT 约束。

USE pubs
GO
CREATE TABLE appointments2
(
 patient_id int IDENTITY(2000, 1) NOT NULL,
 doctor_id  int NOT NULL,
 appt_date datetime NOT NULL DEFAULT GETDATE(),
 receptionist varchar(30) NOT NULL DEFAULT SYSTEM_USER
)
GO
INSERT appointments2 (doctor_id)
VALUES (151)
INSERT appointments2 (doctor_id, appt_date)
VALUES (293, '5/15/98')
INSERT appointments2 (doctor_id, appt_date)
VALUES (27882, '6/20/98')
INSERT appointments2 (doctor_id)
VALUES (21392)
INSERT appointments2 (doctor_id, appt_date)
VALUES (24283, '11/03/98')
GO

下面是选择 appointments2 表中所有信息的查询：

SELECT *
FROM appointments2
ORDER BY doctor_id
GO

下面是结果集：

patient_id  doctor_id   appt_date                receptionist
----------- ----------- ------------------------ ---------------
2000        151         Mar 4 1998 10:36AM       sa
2001        293         May 15 1998 12:00AM      sa
2003        21392       Mar 4 1998 10:36AM       sa
2004        24283       Nov 3 1998 12:00AM       sa
2002        27882       Jun 20 1998 12:00AM      sa

(5 row(s) affected)

请参见

允许空值

ALTER TABLE

CREATE TABLE

CURRENT_TIMESTAMP

CURRENT_USER

安全管理

SESSION_USER

系统函数

USER

使用约束、默认值和空值


table

一种特殊的数据类型，用于存储结果集以供后续处理。该数据类型主要用于临时存储一组行，这些行将作为表值函数的结果集返回。

语法

说明 使用 DECLARE @local_variable 声明 table 类型的变量。

table_type_definition ::=
TABLE ( { column_definition | table_constraint } [ ,...n ] )

column_definition ::=
column_name scalar_data_type
[ COLLATE collation_definition ]
[ [ DEFAULT constant_expression ] | IDENTITY [ ( seed , increment ) ] ]
[ ROWGUIDCOL ]
[ column_constraint ] [ ...n ]

column_constraint ::=
{ [ NULL | NOT NULL ]
| [ PRIMARY KEY | UNIQUE ]
| CHECK ( logical_expression )
}

table_constraint ::=
{ { PRIMARY KEY | UNIQUE } ( column_name [ ,...n ] )
| CHECK ( search_condition )
}

参数

table_type_definition

与 CREATE TABLE 中定义表所用的信息子集相同的信息子集。表声明包括列定义、名称、数据类型和约束。允许的约束类型仅为 PRIMARY KEY、UNIQUE KEY 和 NULL。

有关语法的更多信息，请参见 CREATE TABLE、CREATE FUNCTION 和 DECLARE @local_variable。

collation_definition

是由 Microsoft® Windows™ 区域设置和比较风格、Windows 区域设置和二进制表示法或 Microsoft SQL Server™ 排序规则组成的列的排序规则。

注释

可将函数和变量声明为 table 类型。table 变量可用于函数、存储过程和批处理中。

尽可能使用表变量而不使用临时表。table 变量有以下优点：

  • table 变量的行为类似于局部变量，有明确定义的作用域。该作用域为声明该变量的函数、存储过程或批处理。

    在其作用域内，table 变量可像常规表那样使用。该变量可应用于 SELECT、INSERT、UPDATE 和 DELETE 语句中用到表或表的表达式的地方。但是，table 不能用在下列语句中：

    INSERT INTO table_variable EXEC 存储过程。

    SELECT select_list INTO table_variable 语句。

    在定义 table 变量的函数、存储过程或批处理结束时，自动清除 table 变量。

  • 在存储过程中使用表变量与使用临时表相比，减少了存储过程的重新编译量。

  • 涉及表变量的事务只在表变量更新期间存在。这样就减少了表变量对锁定和记录资源的需求。

不支持在表变量之间进行赋值操作。另外，由于表变量作用域有限，并且不是持久数据库的一部分，因而不受事务回滚的影响。

请参见

COLLATE

CREATE FUNCTION

CREATE TABLE

DECLARE @local_variable


TAN

返回输入表达式的正切值。

语法

TAN ( float_expression )

参数

float_expression

float 或 real 类型的表达式，解释为弧度数。

返回类型

float

示例

下例返回 PI()/2 的正切值。

SELECT TAN(PI()/2)

下面是结果集：

----------------------
1.6331778728383844E+16

请参见

数学函数


text

有关 text 数据类型的信息，请参见 ntext、text 和 image。

请参见

数据类型转换

数据类型


TEXTPTR

以 varbinary 格式返回对应于 text、ntext 或 image 列的文本指针值。检索到的文本指针值可用于 READTEXT、WRITETEXT 和 UPDATETEXT 语句。

语法

TEXTPTR ( column )

参数

column

待使用的 text、ntext 或 image 列。

返回类型

varbinary

注释

在 Microsoft SQL Server™ 2000 中，对于带行内文本的表，TEXTPTR 为要处理的文本返回一个句柄。即使文本值为空，用户仍能获得有效的文本指针。

如果表不带行内文本，并且 text、ntext 或 image 列还未由 UPDATETEXT 语句初始化，则 TEXTPTR 将返回空指针。

可使用 TEXTVALID 来检查文本指针是否存在。在无有效文本指针时，不能使用 UPDATETEXT、WRITETEXT 或 READTEXT。

下列函数和语句对 text、ntext 和 image 数据同样有用。

函数或语句 | 描述
PATINDEX('%pattern%', expression) | 返回给定字符串在 text 或 ntext 列中的字符位置。
DATALENGTH(expression) | 返回 text、ntext 和 image 列的数据长度。
SET TEXTSIZE | 返回可用 SELECT 语句返回的 text、ntext 或 image 数据的极限大小（以字节为单位）。
SUBSTRING(text_column, start, length) | 返回由给定 start 偏移量和 length 所指定的 varchar 字符串。此长度应小于 8 KB。

示例
A. 使用 TEXTPTR

下例使用 TEXTPTR 函数在 pubs 数据库的 pub_info 表中查找与 New Moon Books 相关联的 image 列 logo。文本指针放置在局部变量 @ptrval 中。

USE pubs
GO
DECLARE @ptrval varbinary(16)
SELECT @ptrval = TEXTPTR(logo)
FROM pub_info pr, publishers p
WHERE p.pub_id = pr.pub_id
   AND p.pub_name = 'New Moon Books'
GO
B. 使用带行内文本的 TEXTPTR

在 SQL Server 2000 中，行内文本指针必须在事务内部使用。示例如下：

CREATE TABLE t1 (c1 int, c2 text)
EXEC sp_tableoption 't1', 'text in row', 'on'
INSERT t1 VALUES ('1', 'This is text.')
GO
BEGIN TRAN
   DECLARE @ptrval VARBINARY(16)
   SELECT @ptrval = TEXTPTR(c2)
   FROM t1
   WHERE c1 = 1
   READTEXT t1.c2 @ptrval 0 1
COMMIT
C. 返回文本数据

下例从 pub_info 表中选择 pub_id 列和 pr_info 列的 16 字节文本指针。

USE pubs
GO
SELECT pub_id, TEXTPTR(pr_info)
FROM pub_info
ORDER BY pub_id
GO

下面是结果集：

pub_id
------ ----------------------------------
0736   0x6c0000000000feffb801000001000100
0877   0x6d0000000000feffb801000001000300
1389   0x6e0000000000feffb801000001000500
1622   0x700000000000feffb801000001000900
1756   0x710000000000feffb801000001000b00
9901   0x720000000000feffb801000001000d00
9952   0x6f0000000000feffb801000001000700
9999   0x730000000000feffb801000001000f00

(8 row(s) affected)

下例显示如何在不使用 TEXTPTR 的情况下返回文本的前 8,000 个字节。

USE pubs
GO
SET TEXTSIZE 8000
SELECT pub_id, pr_info
FROM pub_info
ORDER BY pub_id
GO

下面是结果集：

pub_id pr_info
------ -----------------------------------------------------------------
0736   New Moon Books (NMB) has just released another top ten publication. With the latest publication this makes NMB the hottest new publisher of the year!
0877   This is sample text data for Binnet & Hardley, publisher 0877 in the pubs database. Binnet & Hardley is located in Washington, D.C.

This is sample text data for Binnet & Hardley, publisher 0877 in the pubs database. Binnet & Hardley is located in Washi
1389   This is sample text data for Algodata Infosystems, publisher 1389 in the pubs database. Algodata Infosystems is located in Berkeley, California.

9999   This is sample text data for Lucerne Publishing, publisher 9999 in the pubs database. Lucerne publishing is located in Paris, France.

This is sample text data for Lucerne Publishing, publisher 9999 in the pubs database. Lucerne publishing is located in

(8 row(s) affected)
D. 返回特定文本数据

下例在 pubs 数据库的 pub_info 表中查找与 pub_id 0736 相关联的 text 列 (pr_info)。下例首先声明一个局部变量 @val。然后将文本指针（长二进制字符串）置于 @val 中，并将其作为参数提供给 READTEXT 语句，该语句将返回从第五个字节（偏移量为 4）开始的 10 个字节。

USE pubs
GO
DECLARE @val varbinary(16)
SELECT @val = TEXTPTR(pr_info)
FROM pub_info
WHERE pub_id = '0736'
READTEXT pub_info.pr_info @val 4 10
GO

下面是结果集：

(1 row(s) affected)

pr_info
------------------------------------------------------------------------
 is sample

请参见

DATALENGTH

PATINDEX

READTEXT

SET TEXTSIZE

文本和图像函数

UPDATETEXT

WRITETEXT


TEXTVALID

一个 text、ntext 或 image 函数，用于检查给定文本指针是否有效。

语法

TEXTVALID ( 'table.column' , text_ ptr )

参数

table

要使用的表名。

column

要使用的列名。

text_ptr

要检查的文本指针。

返回类型

int

注释

如果指针有效则返回 1，无效则返回 0。请注意，text 列的标识符必须包含表名。在无有效文本指针时，不能使用 UPDATETEXT、WRITETEXT 或 READTEXT。

下列函数和语句对 text、ntext 和 image 数据同样有用。

函数或语句 | 描述
PATINDEX('%pattern%', expression) | 返回给定字符串在 text 或 ntext 列中所处的字符位置。
DATALENGTH(expression) | 返回 text、ntext 和 image 列的数据长度。
SET TEXTSIZE | 返回可用 SELECT 语句返回的 text、ntext 或 image 数据的极限大小（以字节为单位）。

示例

下例报告 pub_info 表的 logo 列中各个值是否存在有效文本指针。

USE pubs
GO
SELECT pub_id, 'Valid (if 1) Text data'
   = TEXTVALID ('pub_info.logo', TEXTPTR(logo))
FROM pub_info
ORDER BY pub_id
GO

下面是结果集：

pub_id Valid (if 1) Text data
------ ----------------------
0736   1
0877   1
1389   1
1622   1
1756   1
9901   1
9952   1
9999   1

(8 row(s) affected)

请参见

DATALENGTH

PATINDEX

SET TEXTSIZE

文本和图像函数

TEXTPTR


timestamp

timestamp 这种数据类型表现自动生成的二进制数，确保这些数在数据库中是唯一的。timestamp 一般用作给表行加版本戳的机制。存储大小为 8 字节。

注释

Transact-SQL timestamp 数据类型与在 SQL-92 标准中定义的 timestamp 数据类型不同。SQL-92 timestamp 数据类型等价于 Transact-SQL datetime 数据类型。

Microsoft® SQL Server™ 将来的版本可能会修改 Transact-SQL timestamp 数据类型的行为，使它与在标准中定义的行为一致。到那时，当前的 timestamp 数据类型将用 rowversion 数据类型替换。

Microsoft® SQL Server™ 2000 引入了 timestamp 数据类型的 rowversion 同义词。在 DDL 语句中尽可能使用 rowversion 而不使用 timestamp。rowversion 受数据类型同义词行为的制约。有关更多信息，请参见数据类型同义词。

在 CREATE TABLE 或 ALTER TABLE 语句中，不必为 timestamp 数据类型提供列名：

CREATE TABLE ExampleTable (PriKey int PRIMARY KEY, timestamp)

如果没有提供列名，SQL Server 将生成 timestamp 的列名。rowversion 数据类型同义词不具有这样的行为。指定 rowversion 时必须提供列名。

一个表只能有一个 timestamp 列。每次插入或更新包含 timestamp 列的行时，timestamp 列中的值均会更新。这一属性使 timestamp 列不适合作为键使用，尤其是不能作为主键使用。对行的任何更新都会更改 timestamp 值，从而更改键值。如果该列属于主键，那么旧的键值将无效，进而引用该旧值的外键也将不再有效。如果该表在动态游标中引用，则所有更新均会更改游标中行的位置。如果该列属于索引键，则对数据行的所有更新还将导致索引更新。

不可为空的 timestamp 列在语义上等价于 binary(8) 列。可为空的 timestamp 列在语义上等价于 varbinary(8) 列。

请参见

ALTER TABLE

CAST 和 CONVERT

CREATE TABLE

数据类型转换

数据类型

DECLARE @local_variable

DELETE

INSERT

SET @local_variable

UPDATE


tinyint

有关 tinyint 数据类型的更多信息，请参见 int、bigint、smallint 和 tinyint。

请参见

数据类型转换

数据类型


TRIGGER_NESTLEVEL

返回对激发触发器的 UPDATE、INSERT 或 DELETE 语句执行的触发器数量。TRIGGER_NESTLEVEL 用于触发器中以确定当前的嵌套级别。

语法

TRIGGER_NESTLEVEL ( [ object_id ] )

参数

object_id

是触发器的对象 ID。如果指定了 object_id，则返回为该语句执行指定触发器的次数。如果未指定 object_id，则返回为该语句执行全部触发器的次数。

当 object_id 省略时（与空值不同），TRIGGER_NESTLEVEL 返回调用堆栈上的触发器数（包括它本身）。当触发器所执行命令导致其它触发器激发，或导致了触发器的连续激发时，可省略 object_id。

注释

如果在触发器之外执行，且 object_id 不是 NULL，则 TRIGGER_NESTLEVEL 返回 0。

TRIGGER_NESTLEVEL 以对象 ID 作为其可选参数。当 object_id 显式指定为 NULL 或所引用的对象 ID 无效时，无论 TRIGGER_NESTLEVEL 是在触发器内部还是外部使用，均返回 NULL 值。

示例
A. 测试某个特定触发器的嵌套级
IF ( (SELECT trigger_nestlevel( object_ID('xyz') ) ) > 5 )
   RAISERROR('Trigger xyz nested more than 5 levels.',16,-1)
B. 测试所执行的全部触发器的嵌套级
IF ( (SELECT trigger_nestlevel() ) > 5 )
   RAISERROR
      ('This statement nested over 5 levels of triggers.',16,-1)

请参见

CREATE TRIGGER


TRUNCATE TABLE

删除表中的所有行，而不记录单个行删除操作。

语法

TRUNCATE TABLE name

参数

name

是要截断的表的名称或要删除其全部行的表的名称。

注释

TRUNCATE TABLE 在功能上与不带 WHERE 子句的 DELETE 语句相同：二者均删除表中的全部行。但 TRUNCATE TABLE 比 DELETE 速度快，且使用的系统和事务日志资源少。

DELETE 语句每次删除一行，并在事务日志中为所删除的每行记录一项。TRUNCATE TABLE 通过释放存储表数据所用的数据页来删除数据，并且只在事务日志中记录页的释放。

TRUNCATE TABLE 删除表中的所有行，但表结构及其列、约束、索引等保持不变。新行标识所用的计数值重置为该列的种子。如果想保留标识计数值，请改用 DELETE。如果要删除表定义及其数据，请使用 DROP TABLE 语句。

对于由 FOREIGN KEY 约束引用的表，不能使用 TRUNCATE TABLE，而应使用不带 WHERE 子句的 DELETE 语句。由于 TRUNCATE TABLE 不记录在日志中，所以它不能激活触发器。

TRUNCATE TABLE 不能用于参与了索引视图的表。

示例

下例删除 authors 表中的所有数据。

TRUNCATE TABLE authors
权限

TRUNCATE TABLE 权限默认授予表所有者、sysadmin 固定服务器角色成员、db_owner 和 db_ddladmin 固定数据库角色成员且不可转让。

请参见

DELETE

DROP TABLE


TYPEPROPERTY

返回有关数据类型的信息。

语法

TYPEPROPERTY ( type , property )

参数

type

是数据类型的名称。

property

是要返回的数据类型的信息类型。property可以是下列值之一：

属性 | 描述 | 返回的值
Precision | 数据类型的精度。 | 数字位数或字符个数。 NULL = 数据类型未找到。
Scale | 数据类型的小数位数。 | 数据类型的小数位的个数。 NULL = 数据类型不是 numeric 或未找到。
AllowsNull | 数据类型允许空值。 | 1 = True 0 = False NULL = 数据类型未找到。
UsesAnsiTrim | 创建数据类型时 ANSI 填充设置为 ON。 | 1 = True 0 = False NULL = 数据类型未找到，或不是二进制数据类型或字符串数据类型。

返回类型

int

示例

下例返回 integer 数据类型的精度或位数。

SELECT TYPEPROPERTY( 'tinyint', 'PRECISION')

请参见

COLUMNPROPERTY

元数据函数

OBJECTPROPERTY


UNICODE

按照 Unicode 标准的定义，返回输入表达式的第一个字符的整数值。

语法

UNICODE ( 'ncharacter_expression' )

参数

'ncharacter_expression'

是 nchar 或 nvarchar 表达式。

返回类型

int

示例
A. 使用 UNICODE 和 NCHAR

下面的示例使用 UNICODE 和 NCHAR 函数打印 Åkergatan 24 字符串中第一个字符的 UNICODE 值，并打印实际的第一个字符 Å。

DECLARE @nstring nchar(12)
SET @nstring = N'Åkergatan 24'
SELECT UNICODE(@nstring), NCHAR(UNICODE(@nstring))

下面是结果集：

----------- -
197         Å
B. 使用 SUBSTRING、UNICODE 和 CONVERT 函数

下面的示例使用 SUBSTRING、UNICODE 和 CONVERT 函数输出字符串 Åkergatan 24 中每个字符的字符号、Unicode 字符和 UNICODE 值。

-- The @position variable holds the position of the character currently
-- being processed. The @nstring variable is the Unicode character
-- string to process.
DECLARE @position int, @nstring nchar(12)
-- Initialize the current position variable to the first character in
-- the string.
SET @position = 1
-- Initialize the character string variable to the string to process.
-- Notice that there is an N before the start of the string, which
-- indicates that the data following the N is Unicode data.
SET @nstring = N'Åkergatan 24'
-- Print the character number of the position of the string you are at,
-- the actual Unicode character you are processing, and the UNICODE
-- value for this particular character.
PRINT 'Character #' + ' ' + 'Unicode Character' + ' ' + 'UNICODE Value'
WHILE @position <= DATALENGTH(@nstring)
-- While these are still characters in the character string,
   BEGIN
   SELECT @position,
      CONVERT(char(17), SUBSTRING(@nstring, @position, 1)),
      UNICODE(SUBSTRING(@nstring, @position, 1))
   SELECT @position = @position + 1
   END

下面是结果集：

Character # Unicode Character UNICODE Value

----------- ----------------- -----------
1           Å                 197

----------- ----------------- -----------
2           k                 107

----------- ----------------- -----------
3           e                 101

----------- ----------------- -----------
4           r                 114

----------- ----------------- -----------
5           g                 103

----------- ----------------- -----------
6           a                 97

----------- ----------------- -----------
7           t                 116

----------- ----------------- -----------
8           a                 97

----------- ----------------- -----------
9           n                 110

----------- ----------------- -----------
10                            32

----------- ----------------- -----------
11          2                 50

----------- ----------------- -----------
12          4                 52

请参见

数据类型

NCHAR

字符串函数

使用 Unicode 数据


UNION

将两个或更多查询的结果组合为单个结果集，该结果集包含联合查询中的所有查询的全部行。有关更多信息，请参见 SELECT。


UNION 运算符

将两个或更多查询的结果组合为单个结果集，该结果集包含联合查询中的所有查询的全部行。这与使用联接组合两个表中的列不同。

使用 UNION 组合两个查询的结果集的两个基本规则是：

  • 所有查询中的列数和列的顺序必须相同。

  • 数据类型必须兼容。
语法

{ < query specification > | ( < query expression > ) }
        UNION [ ALL ]
< query specification | ( < query expression > )
[ UNION [ ALL ] < query specification | ( < query expression > )
[ ...n ] ]

参数

< query_specification > | ( < query_expression > )

是查询规范或查询表达式，用以返回与另一个查询规范或查询表达式所返回的数据组合的数据。作为 UNION 运算一部分的列定义可以不相同，但它们必须通过隐性转换实现兼容。

下表说明数据类型与相应 (ith) 列的选项的比较规则。

ith 列的数据类型 | 结果表中 ith 列的数据类型
非数据兼容类型（数据转换不由 Microsoft® SQL Server™ 隐性处理）。 | SQL Server 返回的错误。
长度为 L1 和 L2 的固定长度 char。 | 长度与 L1 和 L2 中较长的那个相等的固定长度 char。
长度为 L1 和 L2 的固定长度 binary。 | 长度与 L1 和 L2 中较长的那个相等的固定长度 binary。
任一列或两列都是可变长度 char。 | 长度与为 ith 列指定的最大长度相等的可变长度 char。
任一列或两列都是可变长度 binary。 | 长度与为 ith 列指定的最大长度相等的可变长度 binary。
两列都是数字数据类型（如 smallint、int、float、money）。 | 与两列的最大精度相等的数据类型。例如，如果表 A 的 ith 列是 int 类型，表 B 的 ith 列是 float 类型，则 ith 列在结果表中的数据类型是 float，因为 float 比 int 更精确。
两列的描述都指定 NOT NULL。 | 指定 NOT NULL。

UNION

指定组合多个结果集并将其作为单个结果集返回。

ALL

在结果中包含所有的行，包括重复行。如果没有指定，则删除重复行。


uniqueidentifier

全局唯一标识符 (GUID)。

注释

uniqueidentifier 数据类型的列或局部变量可用两种方法初始化为一个值：

  • 使用 NEWID 函数。

  • 将字符串常量转换为如下形式（xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx，其中每个 x 是 0-9 或 a-f 范围内的一个十六进制的数字）。例如，6F9619FF-8B86-D011-B42D-00C04FC964FF 即为有效的 uniqueidentifier 值。

比较运算符可与 uniqueidentifier 值一起使用。然而，排列并非通过比较两个值的位模式来实现。允许对 uniqueidentifier 值执行的操作只有比较 (=, <>, <, >, <=, >=) 和检查 NULL（IS NULL 和 IS NOT NULL）。不允许使用其它算术运算符。所有的列约束及属性（IDENTITY 除外）均允许用于 uniqueidentifier 数据类型。

请参见

ALTER TABLE

CAST 和 CONVERT

CREATE TABLE

数据类型转换

数据类型

DECLARE @local_variable

DELETE

INSERT

NEWID

复制概述

SET @local_variable

UPDATE


UPDATE

更改表中的现有数据。

语法

UPDATE
{
table_name WITH ( < table_hint_limited > [ ...n ] )
| view_name
 | rowset_function_limited
}
SET
{ column_name = { expression | DEFAULT | NULL }
| @variable = expression
| @variable = column = expression } [ ,...n ]

{ { [ FROM { < table_source > } [ ,...n ] ]

[ WHERE
< search_condition > ] }
|
[ WHERE CURRENT OF
{ { [ GLOBAL ] cursor_name } | cursor_variable_name }
] }
[ OPTION ( < query_hint > [ ,...n ] ) ]

< table_source > ::=
 table_name [ [ AS ] table_alias ] [ WITH ( < table_hint > [ ,...n ] ) ]
    | view_name [ [ AS ] table_alias ]
| rowset_function [ [ AS ] table_alias ]
| derived_table [ AS ] table_alias [ ( column_alias [ ,...n ] ) ]
| < joined_table >

< joined_table > ::=
< table_source > < join_type > < table_source > ON < search_condition >
| < table_source > CROSS JOIN < table_source >
| < joined_table >

< join_type > ::=
[ INNER | { { LEFT | RIGHT | FULL } [OUTER] } ]
[ < join_hint > ]
JOIN

< table_hint_limited > ::=
{ FASTFIRSTROW
| HOLDLOCK
| PAGLOCK
| READCOMMITTED
| REPEATABLEREAD
| ROWLOCK
| SERIALIZABLE
| TABLOCK
| TABLOCKX
| UPDLOCK
}

< table_hint > ::=
{ INDEX ( index_val [ ,...n ] )
| FASTFIRSTROW
| HOLDLOCK
| NOLOCK
| PAGLOCK
| READCOMMITTED
| READPAST
| READUNCOMMITTED
| REPEATABLEREAD
| ROWLOCK
| SERIALIZABLE
| TABLOCK
| TABLOCKX
| UPDLOCK
}

< query_hint > ::=
{ { HASH | ORDER } GROUP
| { CONCAT | HASH | MERGE } UNION
| {LOOP | MERGE | HASH } JOIN
| FAST number_rows
| FORCE ORDER
| MAXDOP
 | ROBUST PLAN
| KEEP PLAN
}

参数

table_name

需要更新的表的名称。如果该表不在当前服务器或数据库中，或不为当前用户所有，这个名称可用链接服务器、数据库和所有者名称来限定。

WITH ( < table_hint_limited > [ ...n ] )

指定目标表所允许的一个或多个表提示。需要有 WITH 关键字和圆括号。不允许有 READPAST、NOLOCK 和 READUNCOMMITTED。有关表提示的信息，请参见 FROM。

view_name

要更新的视图的名称。通过 view_name 来引用的视图必须是可更新的。用 UPDATE 语句进行的修改，至多只能影响视图的 FROM 子句所引用的基表中的一个。有关可更新视图的更多信息，请参见 CREATE VIEW。

rowset_function_limited

OPENQUERY 或 OPENROWSET 函数，视提供程序功能而定。有关提供程序所需功能的更多信息，请参见 OLE DB 提供程序的 UPDATE 和 DELETE 语句要求。有关行集函数的更多信息，请参见 OPENQUERY 和 OPENROWSET。

SET

指定要更新的列或变量名称的列表。

column_name

含有要更改数据的列的名称。column_name 必须驻留于 UPDATE 子句中所指定的表或视图中。标识列不能进行更新。

如果指定了限定的列名称，限定符必须同 UPDATE 子句中的表或视图的名称相匹配。例如，下面的内容有效：

UPDATE authors
    SET authors.au_fname = 'Annie'
    WHERE au_fname = 'Anne'

FROM 子句中指定的表的别名不能作为 SET column_name 子句中的限定符使用。例如，下面的内容无效：

UPDATE titles
    SET t.ytd_sales = t.ytd_sales + s.qty
    FROM titles t, sales s
    WHERE t.title_id = s.title_id
    AND s.ord_date = (SELECT MAX(sales.ord_date) FROM sales)

若要使上例合法，请从列名中删除别名 t。

UPDATE titles
    SET ytd_sales = t.ytd_sales + s.qty
    FROM titles t, sales s
    WHERE t.title_id = s.title_id
    AND s.ord_date = (SELECT MAX(sales.ord_date) FROM sales)

expression

变量、字面值、表达式或加上括弧的返回单个值的 subSELECT 语句。expression 返回的值将替换 column_name 或 @variable 中的现有值。

DEFAULT

指定使用对列定义的默认值替换列中的现有值。如果该列没有默认值并且定义为允许空值，这也可用来将列更改为 NULL。

@variable

已声明的变量，该变量将设置为 expression 所返回的值。

SET @variable = column = expression 将变量设置为与列相同的值。这与 SET @variable = column, column = expression 不同，后者将变量设置为列更新前的值。

FROM < table_source >

指定用表来为更新操作提供准则。有关更多信息，请参见 FROM。

table_name [[AS] table_alias ]
为更新操作提供准则的表的名称。

如果所更新表与 FROM 子句中的表相同，并且在 FROM 子句中对该表只有一个引用，则指定或不指定 table_alias 均可。如果所更新表在 FROM 子句中出现了不止一次，则对该表的一个（且仅仅一个）引用不能指定表的别名。FROM 子句中对该表的所有其它引用都必须包含表的别名。

view_name [ [ AS ] table_alias ]
为更新操作提供准则的视图的名称。带 INSTEAD OF UPDATE 触发器的视图不能是含有 FROM 子句的 UPDATE 的目标。
WITH ( < table_hint > [ ...n ] )
为源表指定一个或多个表提示。有关表提示的信息，请参见本卷的"FROM"。
rowset_function [ [AS] table_alias ]
任意行集函数的名称和可选别名。有关行集函数列表的信息，请参见行集函数。
derived_table
是从数据库中检索行的子查询。derived_table 用作对外部查询的输入。
column_alias
替换结果集内列名的可选别名。在选择列表中放入每个列的一个别名，并将整个列别名列表用圆括号括起来。

<joined_table>

由两个或更多表的积组成的结果集，例如：

SELECT *
FROM tab1 LEFT OUTER JOIN tab2 ON tab1.c3 = tab2.c3
    RIGHT OUTER JOIN tab3 LEFT OUTER JOIN tab4
        ON tab3.c1 = tab4.c1
        ON tab2.c3 = tab4.c3

对于多个 CROSS 联接，请使用圆括号来更改联接的自然顺序。

<join_type>

指定联接操作的类型。

INNER
指定返回所有相匹配的行对。废弃两个表中不匹配的行。如果未指定联接类型，则这是默认设置。
LEFT [OUTER]
指定除所有由内联接返回的行外，所有来自左表的不符合指定条件的行也包含在结果集内。来自左表的输出列设置为 NULL。
RIGHT [OUTER]
指定除所有由内联接返回的行外，所有来自右表的不符合指定条件的行也包含在结果集内。来自右表的输出列设置为 NULL。
FULL [OUTER]
如果来自左表或右表的某行与选择准则不匹配，则指定在结果集内包含该行，并且将与另一个表对应的输出列设置为 NULL。除此之外，结果集中还包含通常由内联接返回的所有行。
<join_hint>
指定联接提示或执行算法。如果指定了 <join_hint>，也必须明确指定 INNER、LEFT、RIGHT 或 FULL。有关联接提示的更多信息，请参见 FROM。
JOIN
表示联接所指定的表或视图。

ON <search_condition>

指定联接所基于的条件。尽管经常使用列和比较运算符，但此条件可指定任何谓词，例如：

FROM Suppliers JOIN Products
    ON (Suppliers.SupplierID = Products.SupplierID)

当条件指定列时，列不一定必须具有相同的名称或数据类型；但是，如果数据类型不一致，则这些列要么必须相互兼容，要么是 Microsoft® SQL Server™ 能够隐性转换的类型。如果数据类型不能隐式转换，则条件必须使用 CAST 函数显式转换数据类型。

有关搜索条件和谓词的更多信息，请参见搜索条件。

CROSS JOIN

指定两个表的矢量积。返回同样的行，就像要联接的表只列于 FROM 子句中，并且未指定 WHERE 子句。

WHERE

指定条件来限定所更新的行。根据所使用的 WHERE 子句的形式，有两种更新形式：

  • 搜索更新指定搜索条件来限定要删除的行。

  • 定位更新使用 CURRENT OF 子句指定游标。更新操作发生在游标的当前位置。

<search_condition>

为要更新行指定需满足的条件。搜索条件也可以是联接所基于的条件。对搜索条件中可以包含的谓词数量没有限制。有关谓词和搜索条件的更多信息，请参见搜索条件。

CURRENT OF

指定更新在指定游标的当前位置进行。

GLOBAL

指定 cursor_name 指的是全局游标。

cursor_name

要从中进行提取的开放游标的名称。如果同时存在名为 cursor_name 的全局游标和局部游标，则在指定了 GLOBAL 时，cursor_name 指的是全局游标。如果未指定 GLOBAL，则 cursor_name 指局部游标。游标必须允许更新。

cursor_variable_name

游标变量的名称。cursor_variable_name 必须引用允许更新的游标。

OPTION ( < query_hint > [ ,...n ] )

指定优化程序提示用于自定义 SQL Server 的语句处理。

{ HASH | ORDER } GROUP
指定在查询的 GROUP BY 或 COMPUTE 子句中指定的聚合使用哈希或排列。
{ LOOP | MERGE | HASH |} JOIN
指定在整个查询中所有的联接操作由循环联接、合并联接或哈希联接来完成。如果指定了不止一个联接提示，则查询优化器为允许的联接选择开销最少的联接策略。如果在同一个查询中也为特定表对指定了联接提示，则该提示在两表的联接中优先。
{ MERGE | HASH | CONCAT } UNION
指定所有的 UNION 操作通过合并、哈希或串联 UNION 集合来完成。如果指定了不止一个 UNION 提示，查询优化器就会从这些指定的提示中选择开销最少的策略。

说明 如果在 FROM 子句中亦为任何特定联接表对指定了联接提示，则该提示优先于任何 OPTION 子句中指定的联接提示。

FAST number_rows
指定对查询进行优化，以便快速检索第一个 number_rows（非负整数）。在第一个 number_rows 返回后，查询继续进行并生成完整的结果集。
FORCE ORDER
指定查询语法所指示的联接顺序在查询优化过程中予以保留。
MAXDOP number
只对指定了 sp_configure 的 max degree of parallelism 配置选项的查询替代该选项。当使用 MAXDOP 查询提示时，所有和 max degree of parallelism 配置选项一起使用的语义规则均适用。有关更多信息，请参见 max degree of parallelism 选项。
ROBUST PLAN
强制查询优化器尝试执行一个计划，该计划以性能为代价获得最大可能的行大小。如果没有可行的计划，则查询优化器返回错误，而不是将错误检测延迟至查询执行。行可能包含长度可变的列；SQL Server 允许定义最大可能大小超出 SQL Server 处理能力的行。通常，应用程序存储实际大小在 SQL Server 处理能力范围内的行，而不管最大可能大小。如果 SQL Server 遇到过长的行，则返回执行错误。

KEEP PLAN

强制查询优化器对查询放宽估计的重新编译阈值。当对表中索引列的更改（更新、删除或插入）达到估计数目时查询会自动重新编译，该估计数目即为重新编译阈值。指定 KEEP PLAN 将确保当表有多个更新时不会频繁地对查询进行重新编译。

注释

仅当所修改的表是 table 变量时，用户定义的函数的主体中才允许使用 UPDATE 语句。

table 变量在其作用域内可以像常规表一样访问。这样，table 变量可作为一个表来使用，在该表中数据用 UPDATE 语句进行更新。

用 OPENDATASOURCE 函数构造的、作为服务器名称部分的一个四段名称，在 UPDATE 语句中可以出现表名的任何地方都可作为表源使用。

如果对行的更新违反了某个约束或规则，或违反了对列的 NULL 设置，或者新值是不兼容的数据类型，则取消该语句、返回错误并且不更新任何记录。

当 UPDATE 语句在表达式取值过程中遇到算术错误（溢出、被零除或域错误）时，则不进行更新。批处理的剩余部分不再执行，并且返回错误信息。

如果对参与聚集索引的一列或多列的更新导致聚集索引和行的大小超过 8,060 字节，则更新失败并且返回错误信息。

当对表的 UPDATE 操作定义 INSTEAD-OF 触发器时，将执行触发器而不执行 UPDATE 语句。SQL Server 以前的版本只支持在 UPDATE 和其它数据修改语句中定义 AFTER 触发器。

当更新查询既更新聚集键又更新一个或多个 text、image 或 Unicode 列时，如果可以更改不止一行，则更新操作失败，SQL Server 返回错误信息。

用 UPDATE 修改 text、ntext 或 image 列时将对列进行初始化，向其指派有效文本指针，并且分配至少一个数据页（除非用 NULL 更新该列）。

说明 UPDATE 语句将记入日志。如果要替换或修改大块的 text、ntext 或 image 数据，请使用 WRITETEXT 或 UPDATETEXT 语句而不要使用 UPDATE 语句。WRITETEXT 和 UPDATETEXT 语句（根据默认）不记入日志。

所有的 char 和 nchar 列向右填充至定义长度。

对于用于远程表以及本地和远程分区视图的 UPDATE 语句，忽略 SET ROWCOUNT 选项的设置。

如果 ANSI_PADDING 设置为 OFF，则会从插入 varchar 和 nvarchar 列的数据中删除所有尾随空格，但只包含空格的字符串除外。这些字符串被截断为空字符串。如果 ANSI_PADDING 设置为 ON，则插入尾随空格。Microsoft SQL Server ODBC 驱动程序和用于 SQL Server 的 OLE DB 提供程序自动对每个连接设置 ANSI_PADDING ON。这可在 ODBC 数据源中进行配置，或者通过设置连接特性或属性进行设置。

使用 WHERE CURRENT OF 子句的定位更新将在游标的当前位置更新单行。这比使用 WHERE <search_condition> 子句限定要更新的行的搜索更新更为精确。当搜索条件不唯一标识一行时，搜索更新将修改多行。

如果 UPDATE 语句包含了未指定每个所更新列的位置只有一个可用值的 FROM 子句（换句话说，如果 UPDATE 语句是不确定性的），则其结果将不明确。例如，对于下面脚本中的 UPDATE 语句，表 s 中的两行都满足 UPDATE 语句中的 FROM 子句的限定条件，但是将用 s 的哪一行来更新表 t 内的行是不明确的。

CREATE TABLE s (ColA INT, ColB DECIMAL(10,3))
GO
CREATE TABLE t (ColA INT PRIMARY KEY, ColB DECIMAL(10,3))
GO
INSERT INTO s VALUES(1, 10.0)
INSERT INTO s VALUES(1, 20.0)
INSERT INTO t VALUES(1, 0.0)
GO
UPDATE t
SET t.ColB = t.ColB + s.ColB
FROM t INNER JOIN s ON (t.ColA = s.ColA)
GO

当组合 FROM 和 WHERE CURRENT OF 子句时，可能发生同样的问题。在本例中，表 t2 中的两行都满足 UPDATE 语句中的 FROM 子句的限定条件。将用表 t2 的哪一行来更新表 t1 中的行是不明确的。

CREATE TABLE t1(c1 INT PRIMARY KEY, c2 INT)
GO
CREATE TABLE t2(d1 INT PRIMARY KEY, d2 INT)
GO
INSERT INTO t1 VALUES (1, 10)
INSERT INTO t2 VALUES (1, 20)
INSERT INTO t2 VALUES (2, 30)
go

DECLARE abc CURSOR LOCAL FOR
SELECT * FROM t1

OPEN abc

FETCH abc

UPDATE t1 SET c2 = c2 + d2
FROM t2
WHERE CURRENT OF abc
GO
设置变量和列

变量名可用于 UPDATE 语句来显示受影响的旧值和新值。这种方法应该仅用在 UPDATE 语句只影响单个记录时；如果 UPDATE 语句影响多个记录，则变量只含有所更新行中的一行的值。

权限

UPDATE 权限默认授予 sysadmin 固定服务器角色成员、db_owner 和 db_datawriter 固定数据库角色成员以及表的所有者。sysadmin、db_owner 和 db_securityadmin 角色的成员和表所有者可以将权限转让给其他用户。

如果 UPDATE 语句包含 WHERE 子句，或 SET 子句中的 expression 使用了表中的某个列，则还要求所更新表的 SELECT 权限。

示例
A. 使用简单的 UPDATE

下列示例说明如果从 UPDATE 语句中去除 WHERE 子句，所有的行会受到什么影响。

下面这个例子说明，如果表 publishers 中的所有出版社将总部搬迁到佐治亚州的亚特兰大市，表 publishers 如何更新。

UPDATE publishers
SET city = 'Atlanta', state = 'GA'

本示例将所有出版商的名字变为 NULL。

UPDATE publishers
SET pub_name = NULL

也可以在更新中使用计算值。本示例将表 titles 中的所有价格加倍。

UPDATE titles
SET price = price * 2
B.把 WHERE 子句和 UPDATE 语句一起使用

WHERE 子句指定要更新的行例如，在下面这个虚构的事件中，北加利福尼亚更名为 Pacifica（缩写为 PC），而奥克兰的市民投票决定将其城市的名字改为 Bay City。这个例子说明如何为奥克兰市以前的所有居民（他们的地址已经过时）更新表 authors。

UPDATE authors
   SET state = 'PC', city = 'Bay City'
      WHERE state = 'CA' AND city = 'Oakland'

必须编写另一个语句来更改北加利福尼亚其它城市的居民所在的州名。

C.通过 UPDATE 语句使用来自另一个表的信息

本示例修改表 titles 中的 ytd_sales 列，以反映表 sales 中的最新销售记录。

UPDATE titles
   SET ytd_sales = titles.ytd_sales + sales.qty
      FROM titles, sales
         WHERE titles.title_id = sales.title_id
         AND sales.ord_date = (SELECT MAX(sales.ord_date) FROM sales)

这个例子假定，一种特定的商品在特定的日期只记录一批销售量，而且更新是最新的。如果不是这样（即如果一种特定的商品在同一天可以记录不止一批销售量），这里所示的例子将出错。例子可正确执行，但是每种商品只用一批销售量进行更新，而不管那一天实际销售了多少批。这是因为一个 UPDATE 语句从不会对同一行更新两次。

对于特定的商品在同一天可销售不止一批的情况，每种商品的所有销售量必须在 UPDATE 语句中合计在一起，如下例所示：

UPDATE titles
   SET ytd_sales =
      (SELECT SUM(qty)
         FROM sales
            WHERE sales.title_id = titles.title_id
            AND sales.ord_date IN (SELECT MAX(ord_date) FROM sales))
   FROM titles, sales
D. 将 UPDATE 语句与 SELECT 语句中的 TOP 子句一起使用

这个例子对来自表 authors 的前十个作者的 state 列进行更新。

UPDATE authors
SET state = 'ZZ'
FROM (SELECT TOP 10 * FROM authors ORDER BY au_lname) AS t1
WHERE authors.au_id = t1.au_id

请参见

CREATE INDEX

CREATE TABLE

CREATE TRIGGER

游标

DELETE

INSERT

SET ROWCOUNT

文本和图像函数


UPDATE STATISTICS

在指定的表或索引视图中，对一个或多个统计组（集合）有关键值分发的信息进行更新。若要基于列生成统计，请参见 CREATE STATISTICS。

语法

UPDATE STATISTICS table | view
[
index
| ( statistics_name [ ,...n ] )
 ]
[ WITH
[
[ FULLSCAN ]
| SAMPLE number { PERCENT | ROWS } ]
| RESAMPLE
]
[ [ , ] [ ALL | COLUMNS | INDEX ]
[ [ , ] NORECOMPUTE ]
]

参数

table | view

要更新统计的表或索引视图的名称。表名和视图名必须符合标识符的规则。有关更多信息，请参见使用标识符。由于索引名在每个数据库中不唯一，所以必须指定 table 或 view。可选择指定数据库、表或视图所有者。只有在 Microsoft® SQL Server™ 2000 企业版中才支持索引视图。

index

要更新统计的索引。索引名必须符合标识符的规则。如果未指定 index，则更新指定表或索引视图中的所有索引的分发统计。若要查看索引名和描述的列表，请带表名或视图名执行 sp_helpindex。

statistics_name

要更新的统计组（集合）的名称。统计名称必须符合标识符规则。有关生成统计组的更多信息，请参见 CREATE STATISTICS。

n

是表示可以指定多个 statistic_name 组的占位符。

FULLSCAN

指定应读取 table 或 view 中的所有行以收集统计。FULLSCAN 提供与 SAMPLE 100 PERCENT 相同的行为。FULLSCAN 不能与 SAMPLE 选项一起使用。

SAMPLE number { PERCENT | ROWS }

当为较大的表或视图收集统计时，指定要采样的表或索引视图的百分比或行数。number 只允许使用整数，无论它是 PERCENT 还是 ROWS。若要对较大的表或视图使用默认采样行为，请将 SAMPLE number 和 PERCENT 或 ROWS 一起使用。Microsoft SQL Server 将确保值的采样数不低于某一数目，以保证统计有用。如果 PERCENT、ROWS 或 number 选项导致要采样的行数过小，SQL Server 则自动根据表或视图中的现有行数改正采样。

说明 默认行为是在目标表或索引视图上进行采样扫描。SQL Server 自动计算所需的样本大小。

RESAMPLE

指定使用从所有现有统计（包括索引）继承的采样速率来收集统计。如果采样速率导致要采样的行过少，SQL Server 则自动根据表或视图中的现有行数改正采样。

ALL | COLUMNS | INDEX

指定 UPDATE STATISTICS 语句是否影响列统计、索引统计或所有现有统计。如果未指定选项，则 UPDATE STATISTICS 语句影响所有的统计。每个 UPDATE STATISTICS 语句只能指定一种类型（ALL、COLUMNS 或 INDEX）。

NORECOMPUTE

指定过期统计不自动重新计算。统计过期与否取决于在索引列上进行的 INSERT、UPDATE 和 DELETE 操作的数量。指定该选项时，将导致 SQL Server 禁用自动统计重建功能。若要还原自动统计重新计算，请重新执行 UPDATE STATISTICS（不要 NORECOMPUTE 选项），或者执行 sp_autostats。

重要 禁用自动统计重新计算会导致 SQL Server 查询优化器对于涉及指定表的查询选择非最佳的策略。

注释

SQL Server 保留每个索引中关于键值分发的统计，并且使用这些统计来决定查询处理中使用哪个（或哪些）索引。用户可以通过使用 CREATE STATISTICS 语句生成基于非索引列的统计。查询优化依赖于分发步骤的准确性：

  • 如果索引中的键值有显著变化，请对此索引重新运行 UPDATE STATISTICS。

  • 如果索引列中添加、更改或删除大量数据（即如果键值分发更改），或者用 TRUNCATE TABLE 语句将表截断然后重新填充，请使用 UPDATE STATISTICS。

若要查看统计最近一次更新的时间，请使用 STATS_DATE 函数。

只有当能够在计算列上创建索引时，才可以在包含这些计算列的表上创建或更新统计。有关在计算列上创建索引的要求和限制的更多信息，请参见 CREATE INDEX。

权限

UPDATE STATISTICS 权限默认授予表或视图的所有者，并且该权限不可转让。

示例
A. 更新单个表的所有统计

本示例更新表 authors 上的所有索引分发统计。

UPDATE STATISTICS authors
B. 仅更新单一索引的统计

本示例仅更新表 authors 的索引 au_id_ind 的分发信息。

UPDATE STATISTICS authors au_id_ind
C. 使用 50% 采样更新特定统计组（集合）的统计

本示例首先创建表 authors 中 au_lname 列和 au_fname 列的统计组，然后对其进行更新。

CREATE STATISTICS anames
   ON authors (au_lname, au_fname)
   WITH SAMPLE 50 PERCENT
GO
-- Time passes. The UPDATE STATISTICS statement is then executed.
UPDATE STATISTICS authors(anames)
   WITH SAMPLE 50 PERCENT
GO
D. 使用 FULLSCAN 和 NORECOMPUTE 更新特定统计组（集合）的统计

本示例更新表 authors 中的 anames 统计组（集合），强制对表 authors 中的所有行进行完全扫描，并且关闭该统计组（集合）的自动统计更新。

UPDATE STATISTICS authors(anames)
   WITH FULLSCAN, NORECOMPUTE
GO

请参见

CREATE INDEX

CREATE STATISTICS

游标

DBCC SHOW_STATISTICS

DROP STATISTICS

EXECUTE

函数

sp_autostats

sp_createstats

sp_dboption

sp_helpindex

sp_updatestats

STATS_DATE


UPDATETEXT

更新现有 text、ntext 或 image 字段。使用 UPDATETEXT 在适当的位置更改 text、ntext 或 image 列的一部分。使用 WRITETEXT 来更新和替换整个 text、ntext 或 image 字段。

语法

UPDATETEXT { table_name.dest_column_name dest_text_ptr }
{ NULL | insert_offset }
{ NULL | delete_length }
[ WITH LOG ]
[ inserted_data
| { table_name.src_column_name src_text_ptr } ]

参数

table_name.dest_column_name

要更新的表和 text、ntext 或 image 列的名称。表名和列名必须符合标识符的规则。有关更多信息，请参见使用标识符。指定数据库名和所有者名是可选的。

dest_text_ptr

指向要更新的 text、ntext 或 image 数据的文本指针的值（由 TEXTPTR 函数返回）。dest_text_ptr 必须为 binary(16)。

insert_offset

以零为基的更新起始位置。对于 text 或 image 列，insert_offset 是在插入新数据前从现有列的起点开始要跳过的字节数对于 ntext 列，insert_offset 是字符个数（每个 ntext 字符占用 2 个字节）。开始于这个以零为基的起始点的现有 text、ntext 或 image 数据向右移，为新数据腾出空间。值为 0 表示将新数据插入到现有位置的开始处。值为 NULL 则将新数据追加到现有数据值中。

delete_length

是从 insert_offset 位置开始的、要从现有 text、ntext 或 image 列中删除的数据长度。delete_length 值对于 text 和 image 列用字节指定，对于 ntext 列用字符指定。每个 ntext 字符占用 2 个字节。值为 0 表示不删除数据。值为 NULL 则删除现有 text 或 image 列中从 insert_offset 位置开始到末尾的所有数据。

WITH LOG

在 Microsoft® SQL Server™ 2000 中被忽略。在该版本中，日志记录由数据库的有效恢复模型决定。

inserted_data

是要插入到现有 text、ntext 或 image 列 insert_offset 位置的数据。这是单个 char、nchar、varchar、nvarchar、binary、varbinary、text、ntext 或 image 值。inserted_data 可以是文字或变量。

table_name.src_column_name

用作插入数据源的表或 text、ntext 或 image 列的名称。表名和列名必须符合标识符的规则。

src_text_ptr

指向作为插入数据源使用的 text、ntext 或 image 列的文本指针值（由 TEXTPTR 函数返回）。

注释

新插入的数据可以是单个 inserted_data 常量、表名、列名或文本指针。

Update 操作 | UPDATETEXT 参数
替换现有数据 | 指定一个非空 insert_offset 值、非零 delete_length 值和要插入的新数据。
删除现有数据 | 指定一个非空 insert_offset 值、非零 delete_length 值。不指定要插入的新数据。
插入新数据 | 指定 insert_offset 值、为零的 delete_length 值和要插入的新数据。

在 SQL Server 2000 中，可能存在指向 text、ntext 或 image 数据的行内文本指针，但这些指针无效。有关 text in row 选项的信息，请参见 sp_tableoption。有关使文本指针无效的信息，请参见 sp_invalidate_textptr。

当兼容级别等于 65时，要将 text 列初始化为 NULL，请使用 UPDATETEXT。如果兼容级别等于 70，则使用 WRITETEXT 将 text 列初始化为 NULL；否则 UPDATETEXT 将 text 列初始化为空字符串。有关设置兼容级别的信息，请参见 sp_dbcmptlevel。

权限

UPDATETEXT 权限默认授予在指定表上具有 SELECT 权限的用户。这些权限可在传递 SELECT 权限时传递。

示例

本示例把文本指针置于局部变量 @ptrval 中，然后使用 UPDATETEXT 更新拼写错误。

USE pubs
GO
EXEC sp_dboption 'pubs', 'select into/bulkcopy', 'true'
GO
DECLARE @ptrval binary(16)
SELECT @ptrval = TEXTPTR(pr_info)
   FROM pub_info pr, publishers p
      WHERE p.pub_id = pr.pub_id
      AND p.pub_name = 'New Moon Books'
UPDATETEXT pub_info.pr_info @ptrval 88 1 'b'
GO
EXEC sp_dboption 'pubs', 'select into/bulkcopy', 'false'
GO

请参见

READTEXT

TEXTPTR

WRITETEXT


UPPER

返回将小写字符数据转换为大写的字符表达式。

语法

UPPER ( character_expression )

参数

character_expression

由字符数据组成的表达式。character_expression 可以是常量、变量，也可以是字符或二进制数据的列。

返回类型

varchar

注释

character_expression 必须为可隐性转换为 varchar 的数据类型。否则请使用 CAST 函数显式转换 character_expression。

示例

本示例使用 UPPER 函数和 RTRIM 函数来返回整理过的大写的作者姓名。

USE pubs
GO
SELECT UPPER(RTRIM(au_lname)) + ', ' + au_fname AS Name
FROM authors
ORDER BY au_lname
GO

下面是结果集：

Name
--------------------------------------------------------------
BENNET, Abraham
BLOTCHET-HALLS, Reginald
CARSON, Cheryl
DEFRANCE, Michel
DEL CASTILLO, Innes
DULL, Ann
GREEN, Marjorie
GREENE, Morningstar
GRINGLESBY, Burt
HUNTER, Sheryl
KARSEN, Livia
LOCKSLEY, Charlene
MACFEATHER, Stearns
MCBADDEN, Heather
O'LEARY, Michael
PANTELEY, Sylvia
RINGER, Albert
RINGER, Anne
SMITH, Meander
STRAIGHT, Dean
STRINGER, Dirk
WHITE, Johnson
YOKOMOTO, Akiko

(23 row(s) affected)

请参见

数据类型

字符串函数


USE

将数据库上下文更改为指定数据库。

语法

USE { database }

参数

数据库

是用户上下文要切换到的数据库的名称。数据库名称必须符合标识符的规则。

注释

USE 在编译和执行期间均可执行，并且立即生效。因此，出现在批处理中 USE 语句之后的语句将在指定数据库中执行。

用户在登录到 Microsoft® SQL Server™ 时，通常被自动连接到 master 数据库。除非为每个用户的登录 ID 设置了各自的默认数据库，每个用户都必须执行 USE 语句从 master 切换到另一个数据库。

若要将上下文更改为不同的数据库，用户必须有那个数据库的安全帐户。由数据库所有者提供此数据库的安全帐户。

权限

USE 权限默认授予那些由执行 sp_adduser 的 dbo 和 sysadmin 固定服务器角色，或由执行 sp_grantdbaccess 的 sysadmin 固定服务器角色以及 db_accessadmin 和 db_owner 固定数据库角色指派了权限的用户。如果目的数据库中存在来宾用户，则在该数据库中没有安全帐户的用户依然可以访问。

请参见

CREATE DATABASE

DROP DATABASE

EXECUTE

sp_addalias

sp_adduser

sp_defaultdb

使用标识符


USER

当未指定默认值时，允许将系统为当前用户的数据库用户名提供的值插入表内。

语法

USER

返回类型

char

注释

USER 提供与 USER_NAME 系统函数相同的功能。

在 CREATE TABLE 或 ALTER TABLE 语句中将 USER 和 DEFAULT 约束一起使用，或者将 USER 作为任何标准函数使用。

示例
A. 使用 USER 返回当前用户的数据库用户名

本示例声明一个 char 类型的变量，将 USER 的当前值赋给它，然后打印该变量以及文本说明。

DECLARE @usr char(30)
SET @usr = user
SELECT 'The current user's database username is: '+ @usr
GO

下面是结果集：

-----------------------------------------------------------------------
The current user's database username is: dbo

(1 row(s) affected)
B. 将 USER 和 DEFAULT 约束一起使用

本示例生成一个表，将 USER 用作销售行的销售员的 DEFAULT 约束。

USE pubs
GO
CREATE TABLE inventory2
(
 part_id int IDENTITY(100, 1) NOT NULL,
 description varchar(30) NOT NULL,
 entry_person varchar(30) NOT NULL DEFAULT USER
)
GO
INSERT inventory2 (description)
VALUES ('Red pencil')
INSERT inventory2 (description)
VALUES ('Blue pencil')
INSERT inventory2 (description)
VALUES ('Green pencil')
INSERT inventory2 (description)
VALUES ('Black pencil')
INSERT inventory2 (description)
VALUES ('Yellow pencil')
GO

下面是从表 inventory2 中选择所有信息的查询：

SELECT *
FROM inventory2
ORDER BY part_id
GO

下面是结果集（注意 entry-person 的值）：

part_id     description                    entry_person
----------- ------------------------------ -----------------------------
100         Red pencil                     dbo
101         Blue pencil                    dbo
102         Green pencil                   dbo
103         Black pencil                   dbo
104         Yellow pencil                  dbo

(5 row(s) affected)

请参见

ALTER TABLE

CREATE TABLE

创建和修改 PRIMARY KEY 约束

CURRENT_TIMESTAMP

CURRENT_USER

修改列属性

安全函数

SESSION_USER

SYSTEM_USER

USER_NAME


USER_ID

返回用户的数据库标识号。

语法

USER_ID ( [ 'user' ] )

参数

'user'

要使用的用户名，user 的数据类型为 nchar。如果指定的是 char 类型的值，则将其隐式转换为 nchar 类型。

返回类型

smallint

注释

当省略 user 时，则假定为当前用户。必须加上圆括号。

USER_ID 可以在选择列表、WHERE 子句和任何允许使用表达式的地方使用。有关更多信息，请参见表达式。

示例

本示例返回用户 Harold 的标识号。

SELECT USER_ID('Harold')

请参见

安全函数


USER_NAME

返回给定标识号的用户数据库用户名。

语法

USER_NAME ( [ id ] )

参数

id

用来返回用户名的标识号。id 的数据类型为 int。

返回类型

nvarchar(256)

注释

当省略 id 时，则假定为当前用户。必须加上圆括号。

示例
A. 使用 USER_NAME

本示例返回用户编号为 13 的用户名。

SELECT USER_NAME(13)
GO
B. 使用不带 ID 的 USER_NAME

本示例在不指定 ID 的情况下查找当前用户的名称。

SELECT user_name()
GO

下面是结果集（对于是 sysadmin 固定服务器角色成员的用户）：

------------------------------
dbo

(1 row(s) affected)
C. 在 WHERE 子句中使用 USER_NAME

本示例在 sysusers 中找到一行，该行的名称等于将系统函数 USER_NAME 应用于用户标识号 1 的结果。

SELECT name
FROM sysusers
WHERE name = USER_NAME(1)
GO

下面是结果集：

name
------------------------------
dbo

(1 row(s) affected)

请参见

ALTER TABLE

CREATE TABLE

CURRENT_TIMESTAMP

CURRENT_USER

修改列属性

SESSION_USER

系统函数

SYSTEM_USER


VAR

返回给定表达式中所有值的统计方差。

语法

VAR ( expression )

参数

expression

精确数字或近似数字数据类型类别的表达式（bit 数据类型除外）。不允许使用聚合函数和子查询。

返回类型

float

注释

如果 VAR 用于 SELECT 语句中的所有项目，则结果集中的每个值都包含在计算中。VAR 可只用于数字列。空值将被忽略。

示例

本示例返回 titles 表中所有 royalty 值的方差。

USE pubs
SELECT VAR(royalty)
FROM titles

请参见

聚合函数


varbinary

有关 varbinary 数据类型的信息，请参见 binary 和 varbinary。

请参见

数据类型转换

数据类型


varchar

有关 varchar 数据类型的更多信息，请参见 char 和 varchar。

请参见

数据类型转换

数据类型


VARP

返回给定表达式中所有值的填充的统计方差。

语法

VARP ( expression )

参数

expression

精确数字或近似数字数据类型类别的表达式（bit 数据类型除外）。不允许使用聚合函数和子查询。

返回类型

float

注释

如果 VARP 用于 SELECT 语句中的所有项目，则结果集中的每个值都包含在计算中。VARP 可只用于数字列。空值将被忽略。

示例

本示例返回 titles 中所有 royalty 值的填充的方差。

USE pubs
SELECT VARP(royalty)
FROM titles

请参见

聚合函数


WAITFOR

指定触发语句块、存储过程或事务执行的时间、时间间隔或事件。

语法

WAITFOR { DELAY 'time' | TIME 'time' }

参数

DELAY

指示 Microsoft® SQL Server™ 一直等到指定的时间过去，最长可达 24 小时。

'time'

要等待的时间。可以按 datetime 数据可接受的格式指定 time，也可以用局部变量指定此参数。不能指定日期。因此，在 datetime 值中不允许有日期部分。

TIME

指示 SQL Server 等待到指定时间。

注释

执行 WAITFOR 语句后，在到达指定的时间之前或指定的事件出现之前，将无法使用与 SQL Server 的连接。

若要查看活动的进程和正在等待的进程，请使用 sp_who。

示例
A. 使用 WAITFOR TIME

下例在晚上 10:20 执行存储过程 update_all_stats。

BEGIN
   WAITFOR TIME '22:20'
   EXECUTE update_all_stats
END

有关使用此过程更新数据库中所有统计的更多信息，请参见 UPDATE STATISTICS 中的示例。

B. 使用 WAITFOR DELAY

下例说明如何对 WAITFOR DELAY 选项使用局部变量。将创建一个存储过程，该过程将等待可变的时间量，然后将所经过的小时、分钟和秒数信息返回给用户。

CREATE PROCEDURE time_delay @@DELAYLENGTH char(9)
AS
DECLARE @@RETURNINFO varchar(255)
BEGIN
   WAITFOR DELAY @@DELAYLENGTH
   SELECT @@RETURNINFO = 'A total time of ' +
                  SUBSTRING(@@DELAYLENGTH, 1, 3) +
                  ' hours, ' +
                  SUBSTRING(@@DELAYLENGTH, 5, 2) +
                  ' minutes, and ' +
                  SUBSTRING(@@DELAYLENGTH, 8, 2) +
                  ' seconds, ' +
                  'has elapsed! Your time is up.'
   PRINT @@RETURNINFO
END
GO
-- This next statement executes the time_delay procedure.
EXEC time_delay '000:00:10'
GO

下面是结果集：

A total time of 000 hours, 00 minutes, and 10 seconds, has elapsed! Your time is up.

请参见

控制流语言

datetime 和 smalldatetime

sp_who


WHERE

指定查询返回行的条件。

语法

WHERE < search_condition >

参数

<search_condition>

定义要返回的行所应满足的条件。对 <search_condition> 中的谓词数目没有限制。

请参见

DELETE

Predicate

搜索条件

SELECT

UPDATE


WHERE 子句

指定用于限制返回的行的搜索条件。

语法

[ WHERE < search_condition > | < old_outer_join > ]

< old_outer_join > ::=
column_name { * = | = * } column_name

参数

<search_condition>

通过使用谓词限制结果集内返回的行。对搜索条件中可以包含的谓词数量没有限制。有关搜索条件和谓词的更多信息，请参见搜索条件。

< old_outer_join >

使用不标准的产品专用语法和 WHERE 子句指定外联接。*= 运算符用于指定左向外联接，=* 运算符用于指定右向外联接。

下例指定一个左向外联接，并在结果集内包含 Tab1 中不满足指定条件的行：

SELECT Tab1.name, Tab2.id
FROM Tab1, Tab2
WHERE Tab1.id *=Tab2.id

说明 这种语法具有潜在的二义性解释并且不标准，因此不提倡使用这种语法进行外联接。而应在 FROM 子句中指定联接。

可以通过在 FROM 子句中使用联接运算符，或通过在 WHERE 子句中使用不标准的 *= 和 =* 运算符来指定外联接。不能在同一语句中同时使用这两种方法。

GROUP BY 子句

指定用来放置输出行的组，并且如果 SELECT 子句 <select list> 中包含聚合函数，则计算每组的汇总值。指定 GROUP BY 时，选择列表中任一非聚合表达式内的所有列都应包含在 GROUP BY 列表中，或者 GROUP BY 表达式必须与选择列表表达式完全匹配。

说明 如果未指定 ORDER BY 子句，则使用 GROUP BY 子句不按任何特定的顺序返回组。建议始终使用 ORDER BY 子句指定具体的数据顺序。

语法

[ GROUP BY [ ALL ] group_by_expression [ ,...n ]
[ WITH { CUBE | ROLLUP } ]
]

参数

ALL

包含所有组和结果集，甚至包含那些任何行都不满足 WHERE 子句指定的搜索条件的组和结果集。如果指定了 ALL，将对组中不满足搜索条件的汇总列返回空值。不能用 CUBE 或 ROLLUP 运算符指定 ALL。

如果访问远程表的查询中有 WHERE 子句，则不支持 GROUP BY ALL 操作。

group_by_expression

是对其执行分组的表达式。group_by_expression 也称为分组列。group_by expression 可以是列或引用列的非聚合表达式。在选择列表内定义的列的别名不能用于指定分组列。

说明 text、ntext 和 image 类型的列不能用于 group_by_expression。

对于不包含 CUBE 或 ROLLUP 的 GROUP BY 子句，group_by_expression 的项数受查询所涉及的 GROUP BY 列的大小、聚合列和聚合值的限制。该限制从 8,060 字节的限制开始，对保存中间查询结果所需的中间级工作表有 8,060 字节的限制。如果指定了 CUBE 或 ROLLUP，则最多只能有 10 个分组表达式。

CUBE

指定在结果集内不仅包含由 GROUP BY 提供的正常行，还包含汇总行。在结果集内返回每个可能的组和子组组合的 GROUP BY 汇总行。GROUP BY 汇总行在结果中显示为 NULL，但可用来表示所有值。使用 GROUPING 函数确定结果集内的空值是否是 GROUP BY 汇总值。

结果集内的汇总行数取决于 GROUP BY 子句内包含的列数。GROUP BY 子句中的每个操作数（列）绑定在分组 NULL 下，并且分组适用于所有其它操作数（列）。由于 CUBE 返回每个可能的组和子组组合，因此不论指定分组列时所使用的是什么顺序，行数都相同。

ROLLUP

指定在结果集内不仅包含由 GROUP BY 提供的正常行，还包含汇总行。按层次结构顺序，从组内的最低级别到最高级别汇总组。组的层次结构取决于指定分组列时所使用的顺序。更改分组列的顺序会影响在结果集内生成的行数。

重要 使用 CUBE 或 ROLLUP 时，不支持区分聚合，如 AVG(DISTINCT column_name)、COUNT(DISTINCT column_name) 和 SUM(DISTINCT column_name)。如果使用这类聚合，SQL Server 将返回错误信息并取消查询。


WHILE

设置重复执行 SQL 语句或语句块的条件。只要指定的条件为真，就重复执行语句。可以使用 BREAK 和 CONTINUE 关键字在循环内部控制 WHILE 循环中语句的执行。

语法

WHILE Boolean_expression
{ sql_statement | statement_block }
[ BREAK ]
{ sql_statement | statement_block }
[ CONTINUE ]

参数

Boolean_expression

返回 TRUE 或 FALSE 的表达式。如果布尔表达式中含有 SELECT 语句，必须用圆括号将 SELECT 语句括起来。

{sql_statement | statement_block}

Transact-SQL 语句或用语句块定义的语句分组。若要定义语句块，请使用控制流关键字 BEGIN 和 END。

BREAK

导致从最内层的 WHILE 循环中退出。将执行出现在 END 关键字后面的任何语句，END 关键字为循环结束标记。

CONTINUE

使 WHILE 循环重新开始执行，忽略 CONTINUE 关键字后的任何语句。

注释

如果嵌套了两个或多个 WHILE 循环，内层的 BREAK 将导致退出到下一个外层循环。首先运行内层循环结束之后的所有语句，然后下一个外层循环重新开始执行。

示例
A. 在嵌套的 IF...ELSE 和 WHILE 中使用 BREAK 和 CONTINUE

在下例中，如果平均价格少于 $30，WHILE 循环就将价格加倍，然后选择最高价。如果最高价少于或等于 $50，WHILE 循环重新启动并再次将价格加倍。该循环不断地将价格加倍直到最高价格超过 $50，然后退出 WHILE 循环并打印一条消息。

USE pubs
GO
WHILE (SELECT AVG(price) FROM titles) < $30
BEGIN
   UPDATE titles
      SET price = price * 2
   SELECT MAX(price) FROM titles
   IF (SELECT MAX(price) FROM titles) > $50
      BREAK
   ELSE
      CONTINUE
END
PRINT 'Too much for the market to bear'
B. 在带有游标的过程中使用 WHILE

以下的 WHILE 结构是名为 count_all_rows 过程中的一部分。下例中，该 WHILE 结构测试用于游标的函数 @@FETCH_STATUS 的返回值。因为 @@FETCH_STATUS 可能返回 –2、-1 或 0，所以，所有的情况都应进行测试。如果某一行在开始执行此存储过程以后从游标结果中删除，将跳过该行。成功提取 (0) 后将执行 BEGIN...END 循环内部的 SELECT 语句。

USE pubs
DECLARE tnames_cursor CURSOR
FOR
   SELECT TABLE_NAME
   FROM INFORMATION_SCHEMA.TABLES
OPEN tnames_cursor
DECLARE @tablename sysname
--SET @tablename = 'authors'
FETCH NEXT FROM tnames_cursor INTO @tablename
WHILE (@@FETCH_STATUS <> -1)
BEGIN
   IF (@@FETCH_STATUS <> -2)
   BEGIN
      SELECT @tablename = RTRIM(@tablename)
      EXEC ('SELECT ''' + @tablename + ''' = count(*) FROM '
            + @tablename )
      PRINT ' '
   END
   FETCH NEXT FROM tnames_cursor INTO @tablename
END
CLOSE tnames_cursor
DEALLOCATE tnames_cursor

请参见

ALTER TRIGGER

控制流语言

CREATE TRIGGER

游标

SELECT


WRITETEXT

允许对现有的 text、ntext 或 image 列进行无日志记录的交互式更新。该语句将彻底重写受其影响的列中的任何现有数据。WRITETEXT 语句不能用在视图中的 text、ntext 和 image 列上。

语法

WRITETEXT { table.column text_ptr }
[ WITH LOG ] { data }

参数

table.column

要更新的表和 text、ntext 或 image 列的名称。表名和列名必须符合标识符的规则。有关更多信息，请参见使用标识符。指定数据库名和所有者名是可选的。

text_ptr

指向 text、ntext 或 image 数据的指针的值。text_ptr 的数据类型必须为 binary(16)。若要创建文本指针，请对 text、ntext 或 image 列用非 NULL 数据执行 INSERT 或 UPDATE 语句。有关创建文本指针的更多信息，请参见 INSERT 或 UPDATE。

WITH LOG

在 Microsoft® SQL Server™ 2000 中忽略。日志记录由数据库的实际恢复模型决定。

data

要存储的实际 text、ntext 或 image 数据。data 可以是字面值，也可以是变量。对于 text、ntext 和 image 数据，可以用 WRITETEXT 交互插入的文本的最大长度大约是 120 KB。

注释

请使用 WRITETEXT 来替换 text、ntext 和 image 数据，而用 UPDATETEXT 来修改 text、ntext 和 image 数据。UPDATETEXT 更灵活，因为它仅更改 text、ntext 或 image 列的某一部分，而不是整个列。

如果数据库恢复模型简单或有大容量日志记录，则 WRITETEXT 是无日志记录的操作。这就意味着在将 text、ntext 或 image 数据写入数据库时，不会进行日志记录；因此，事务日志不会填满大量通常由这些数据类型组成的数据。

为使 WRITETEXT 正常工作，列必须已经包含有效的文本指针。

如果该表没有行内文本，则在通过 INSERT 向 text 列中放入显式或隐式空值时，SQL Server 不初始化 text 列，从而节省了空间，而且不能获取这类空值的文本指针。若要将 text 列初始化为 NULL，请使用 UPDATE 语句。如果该表有行内文本，就没有必要为空值初始化文本列，而且您始终可以获取文本指针。

与 WRITETEXT 相比，DB-Library dbwritetext 和 dbmoretext 函数以及 ODBC SQLPutData 函数速度较快且使用的动态内存较少。这些函数可以插入多达 2G 字节的 text、ntext 或 image 数据。

在 SQL Server 2000 中，可能存在指向 text、ntext 或 image 数据的行内文本指针，但这些指针无效。有关 text in row 选项的信息，请参见 sp_tableoption。有关使文本指针无效的信息，请参见 sp_invalidate_textptr。

权限

WRITETEXT 的权限默认地授予那些对指定的表拥有 SELECT 权限的用户。这些权限可在传递 SELECT 权限时传递。

示例

下例将文本指针放到局部变量 @ptrval 中，然后 WRITETEXT 将新的文本字符串放到 @ptrval 所指向的行中。

USE pubs
GO
EXEC sp_dboption 'pubs', 'select into/bulkcopy', 'true'
GO
DECLARE @ptrval binary(16)
SELECT @ptrval = TEXTPTR(pr_info)
FROM pub_info pr, publishers p
WHERE p.pub_id = pr.pub_id
   AND p.pub_name = 'New Moon Books'
WRITETEXT pub_info.pr_info @ptrval 'New Moon Books (NMB) has just released another top ten publication. With the latest publication this makes NMB the hottest new publisher of the year!'
GO
EXEC sp_dboption 'pubs', 'select into/bulkcopy', 'false'
GO

请参见

数据类型

DECLARE @local_variable

DELETE

SELECT

SET

UPDATETEXT


YEAR

返回表示指定日期中的年份的整数。

语法

YEAR ( date )

参数

date

datetime 或 smalldatetime 类型的表达式。

返回类型

int

注释

此函数等价于 DATEPART(yy, date)。

示例

下例从日期 03/12/1998 中返回年份数。

SELECT "Year Number" = YEAR('03/12/1998')
GO

下面是结果集：

Year Number
------------
1998

下例用数字指定日期。注意：Microsoft® SQL Server™ 数据库将 0 解释为 1900 年 1 月 1 日。

SELECT MONTH(0), DAY(0), YEAR(0)

下面是结果集：

----- ------ ------

1 1 1900

请参见

日期和时间函数


保留关键字

Microsoft® SQL Server™ 2000 使用保留关键字定义、操作和访问数据库。保留关键字是 SQL Server 使用的 Transact-SQL 语言语法的一部分，用于分析和理解 Transact-SQL 语句和批处理。尽管在 Transact-SQL 脚本中，使用 SQL Server 保留关键字作为标识符和对象名在语法上是可行的，但规定只能使用分隔标识符。

下表列出了 SQL Server 的保留关键字。

ADD | EXCEPT | PERCENT
ALL | EXEC | PLAN
ALTER | EXECUTE | PRECISION
AND | EXISTS | PRIMARY
ANY | EXIT | PRINT
AS | FETCH | PROC
ASC | FILE | PROCEDURE
AUTHORIZATION | FILLFACTOR | PUBLIC
BACKUP | FOR | RAISERROR
BEGIN | FOREIGN | READ
BETWEEN | FREETEXT | READTEXT
BREAK | FREETEXTTABLE | RECONFIGURE
BROWSE | FROM | REFERENCES
BULK | FULL | REPLICATION
BY | FUNCTION | RESTORE
CASCADE | GOTO | RESTRICT
CASE | GRANT | RETURN
CHECK | GROUP | REVOKE
CHECKPOINT | HAVING | RIGHT
CLOSE | HOLDLOCK | ROLLBACK
CLUSTERED | IDENTITY | ROWCOUNT
COALESCE | IDENTITY_INSERT | ROWGUIDCOL
COLLATE | IDENTITYCOL | RULE
COLUMN | IF | SAVE
COMMIT | IN | SCHEMA
COMPUTE | INDEX | SELECT
CONSTRAINT | INNER | SESSION_USER
CONTAINS | INSERT | SET
CONTAINSTABLE | INTERSECT | SETUSER
CONTINUE | INTO | SHUTDOWN
CONVERT | IS | SOME
CREATE | JOIN | STATISTICS
CROSS | KEY | SYSTEM_USER
CURRENT | KILL | TABLE
CURRENT_DATE | LEFT | TEXTSIZE
CURRENT_TIME | LIKE | THEN
CURRENT_TIMESTAMP | LINENO | TO
CURRENT_USER | LOAD | TOP
CURSOR | NATIONAL | TRAN
DATABASE | NOCHECK | TRANSACTION
DBCC | NONCLUSTERED | TRIGGER
DEALLOCATE | NOT | TRUNCATE
DECLARE | NULL | TSEQUAL
DEFAULT | NULLIF | UNION
DELETE | OF | UNIQUE
DENY | OFF | UPDATE
DESC | OFFSETS | UPDATETEXT
DISK | ON | USE
DISTINCT | OPEN | USER
DISTRIBUTED | OPENDATASOURCE | VALUES
DOUBLE | OPENQUERY | VARYING
DROP | OPENROWSET | VIEW
DUMMY | OPENXML | WAITFOR
DUMP | OPTION | WHEN
ELSE | OR | WHERE
END | ORDER | WHILE
ERRLVL | OUTER | WITH
ESCAPE | OVER | WRITETEXT

另外，SQL-92 标准还定义了保留关键字列表。不要使用 SQL-92 保留关键字作为对象名和标识符。ODBC 保留关键字列表（如下所示）与 SQL-92 保留关键字列表相同。

说明 SQL-92 保留关键字列表有时可能比 SQL Server 限制更多，有时则限制更少。例如，SQL-92 保留关键字列表包含 INT，而 SQL Server 不需要将其区分为保留关键字。

Transact-SQL 保留关键字可用作数据库或数据库对象（如表、列、视图等）的标识符或名称。使用被引用的标识符或分隔标识符。对将保留关键字用作变量和存储过程参数的名称没有限制。有关更多信息，请参见使用标识符。

ODBC 保留关键字

保留了下列关键字用于 ODBC 函数调用。这些关键字根本不约束 SQL 语法；然而，为确保与支持核心 SQL 语法的驱动程序兼容，应用程序应避免使用这些关键字。

下面是当前的 ODBC 保留关键字列表。有关更多信息，请参见《Microsoft ODBC 3.0 程序员参考》，第 2 卷，附录 C。

ABSOLUTE | EXEC | OVERLAPS
ACTION | EXECUTE | PAD
ADA | EXISTS | PARTIAL
ADD | EXTERNAL | PASCAL
ALL | EXTRACT | POSITION
ALLOCATE | FALSE | PRECISION
ALTER | FETCH | PREPARE
AND | FIRST | PRESERVE
ANY | FLOAT | PRIMARY
ARE | FOR | PRIOR
AS | FOREIGN | PRIVILEGES
ASC | FORTRAN | PROCEDURE
ASSERTION | FOUND | PUBLIC
AT | FROM | READ
AUTHORIZATION | FULL | REAL
AVG | GET | REFERENCES
BEGIN | GLOBAL | RELATIVE
BETWEEN | GO | RESTRICT
BIT | GOTO | REVOKE
BIT_LENGTH | GRANT | RIGHT
BOTH | GROUP | ROLLBACK
BY | HAVING | ROWS
CASCADE | HOUR | SCHEMA
CASCADED | IDENTITY | SCROLL
CASE | IMMEDIATE | SECOND
CAST | IN | SECTION
CATALOG | INCLUDE | SELECT
CHAR | INDEX | SESSION
CHAR_LENGTH | INDICATOR | SESSION_USER
CHARACTER | INITIALLY | SET
CHARACTER_LENGTH | INNER | SIZE
CHECK | INPUT | SMALLINT
CLOSE | INSENSITIVE | SOME
COALESCE | INSERT | SPACE
COLLATE | INT | SQL
COLLATION | INTEGER | SQLCA
COLUMN | INTERSECT | SQLCODE
COMMIT | INTERVAL | SQLERROR
CONNECT | INTO | SQLSTATE
CONNECTION | IS | SQLWARNING
CONSTRAINT | ISOLATION | SUBSTRING
CONSTRAINTS | JOIN | SUM
CONTINUE | KEY | SYSTEM_USER
CONVERT | LANGUAGE | TABLE
CORRESPONDING | LAST | TEMPORARY
COUNT | LEADING | THEN
CREATE | LEFT | TIME
CROSS | LEVEL | TIMESTAMP
CURRENT | LIKE | TIMEZONE_HOUR
CURRENT_DATE | LOCAL | TIMEZONE_MINUTE
CURRENT_TIME | LOWER | TO
CURRENT_TIMESTAMP | MATCH | TRAILING
CURRENT_USER | MAX | TRANSACTION
CURSOR | MIN | TRANSLATE
DATE | MINUTE | TRANSLATION
DAY | MODULE | TRIM
DEALLOCATE | MONTH | TRUE
DEC | NAMES | UNION
DECIMAL | NATIONAL | UNIQUE
DECLARE | NATURAL | UNKNOWN
DEFAULT | NCHAR | UPDATE
DEFERRABLE | NEXT | UPPER
DEFERRED | NO | USAGE
DELETE | NONE | USER
DESC | NOT | USING
DESCRIBE | NULL | VALUE
DESCRIPTOR | NULLIF | VALUES
DIAGNOSTICS | NUMERIC | VARCHAR
DISCONNECT | OCTET_LENGTH | VARYING
DISTINCT | OF | VIEW
DOMAIN | ON | WHEN
DOUBLE | ONLY | WHENEVER
DROP | OPEN | WHERE
ELSE | OPTION | WITH
END | OR | WORK
END-EXEC | ORDER | WRITE
ESCAPE | OUTER | YEAR
EXCEPT | OUTPUT | ZONE
EXCEPTION |  |

将来的关键字

以下关键字可能会保留在将来的 SQL Server 版本中，作为将来要实现的新特性。注意，不要使用这些关键字作为标识符。

ABSOLUTE | FOUND | PRESERVE
ACTION | FREE | PRIOR
ADMIN | GENERAL | PRIVILEGES
AFTER | GET | READS
AGGREGATE | GLOBAL | REAL
ALIAS | GO | RECURSIVE
ALLOCATE | GROUPING | REF
ARE | HOST | REFERENCING
ARRAY | HOUR | RELATIVE
ASSERTION | IGNORE | RESULT
AT | IMMEDIATE | RETURNS
BEFORE | INDICATOR | ROLE
BINARY | INITIALIZE | ROLLUP
BIT | INITIALLY | ROUTINE
BLOB | INOUT | ROW
BOOLEAN | INPUT | ROWS
BOTH | INT | SAVEPOINT
BREADTH | INTEGER | SCROLL
CALL | INTERVAL | SCOPE
CASCADED | ISOLATION | SEARCH
CAST | ITERATE | SECOND
CATALOG | LANGUAGE | SECTION
CHAR | LARGE | SEQUENCE
CHARACTER | LAST | SESSION
CLASS | LATERAL | SETS
CLOB | LEADING | SIZE
COLLATION | LESS | SMALLINT
COMPLETION | LEVEL | SPACE
CONNECT | LIMIT | SPECIFIC
CONNECTION | LOCAL | SPECIFICTYPE
CONSTRAINTS | LOCALTIME | SQL
CONSTRUCTOR | LOCALTIMESTAMP | SQLEXCEPTION
CORRESPONDING | LOCATOR | SQLSTATE
CUBE | MAP | SQLWARNING
CURRENT_PATH | MATCH | START
CURRENT_ROLE | MINUTE | STATE
CYCLE | MODIFIES | STATEMENT
DATA | MODIFY | STATIC
DATE | MODULE | STRUCTURE
DAY | MONTH | TEMPORARY
DEC | NAMES | TERMINATE
DECIMAL | NATURAL | THAN
DEFERRABLE | NCHAR | TIME
DEFERRED | NCLOB | TIMESTAMP
DEPTH | NEW | TIMEZONE_HOUR
DEREF | NEXT | TIMEZONE_MINUTE
DESCRIBE | NO | TRAILING
DESCRIPTOR | NONE | TRANSLATION
DESTROY | NUMERIC | TREAT
DESTRUCTOR | OBJECT | TRUE
DETERMINISTIC | OLD | UNDER
DICTIONARY | ONLY | UNKNOWN
DIAGNOSTICS | OPERATION | UNNEST
DISCONNECT | ORDINALITY | USAGE
DOMAIN | OUT | USING
DYNAMIC | OUTPUT | VALUE
EACH | PAD | VARCHAR
END-EXEC | PARAMETER | VARIABLE
EQUALS | PARAMETERS | WHENEVER
EVERY | PARTIAL | WITHOUT
EXCEPTION | PATH | WORK
EXTERNAL | POSTFIX | WRITE
FLASE | PREFIX | YEAR
FIRST | PREORDER | ZONE
FLOAT | PREPARE |

请参见

SET QUOTED_IDENTIFIER

使用保留关键字


表达式

表达式是符号与运算符的组合，Microsoft® SQL Server™ 对其求值以获得单个数据值。简单的表达式可以是一个常量、变量、列或标量函数。可以用运算符将两个或更多的简单表达式联接起来组成复杂的表达式。

语法

{ constant
    | scalar_function
| [ alias.] column
| local_variable
| ( expression )
 | ( scalar_subquery )
| { unary_operator } expression
| expression { binary_operator } expression
}

参数

constant

是表示单个特定数据值的符号。constant 是一个或多个字母数字字符（字母 a-z、A-Z 和数字 0-9）或符号（惊叹号 (!)、at 符 (@)、数字符号 (#) 等等）。字符和 datetime 值要用引号括起来，而二进制字符串与数字常量则不必。有关更多信息，请参见常量。

scalar_function

是 Transact-SQL 语法的一个单元，用于提供特定的服务和返回单值。scalar_function 可以是内置标量函数（如 SUM、GETDATE 或 CAST 函数），也可以是用户定义函数。

[alias.]

是由 FORM 子句中的 AS 关键字分配给表的别名或者相关名称。

column

是一个列的名称。在表达式中只允许有列的名称；不允许指定 4 个部分的名称。

local_variable

是用户定义变量的名称。有关更多信息，请参见 DECLARE @local_variable。

(expression)

是本主题中定义的任意有效的 SQL Server 表达式。括号是分组运算符，确保括号内表达式中的运算符先运算，然后其结果再与别的表达式组合。

(scalar_subquery)

是返回一个值的子查询。例如：

SELECT MAX(UnitPrice)
FROM Products

{unary_operator}

是只有一个数字操作数的运算符：

  • ＋ 表示正数。

  • － 表示负数。

  • ~ 为补数运算符。

一元运算符只能用于取值为数据类型的表达式中，此数据类型可以是数字数据类型中的任一种。

{binary_operator}

是用于组合两个表达式得出一个结果的运算符，binary _operator 可以是算术运算符、赋值运算符 (=)、位运算符、比较运算符、逻辑运算符、字符串连接运算符 (+) 或一元运算符。有关运算符的更多信息，请参见运算符。

表达式结果

对于由单个常量、变量、标量函数或列名组成的简单表达式，该表达式的数据类型、排序规则、精度、小数位数和值就是它所引用的元素的数据类型、排序规则、精度、小数位数和值。

如果两个表达式是用比较或者逻辑运算符组合的，则结果的数据类型是布尔型，值有三种：TRUE FALSE 或 UNKNOWN。有关布尔数据类型的更多信息，请参见运算符。

如果两个表达式是用算术运算符、位运算符或字符串运算符组合的，则结果的数据类型由运算符确定。

复杂的表达式由很多符号与运算符构成，得出一个单值结果。通过对组件表达式进行组合来确定结果表达式的数据类型、排序规则、精度和值，每次组合两个表达式，直到得到最后结果。表达式中元素组合的顺序由表达式中运算符的优先级决定。

注释

两个表达式可以由一个运算符组合起来，只要它们具有该运算符支持的数据类型，并且满足至少下列一个条件：

  • 两个表达式有相同的数据类型。

  • 优先级低的数据类型可以隐式转换为优先级高的数据类型。

  • CAST 函数能够显式地将优先级低的数据类型转化成优先级高的数据类型，或者转换为一种可以隐式地转化成优先级高的数据类型的过渡数据类型。

如果没有支持的隐式或显式转换，两个表达式不能组合。

任何取值为字符串的表达式的排序规则都应遵循排序规则优先顺序规则。有关更多信息，请参见排序规则的优先顺序。

在 C 或 Microsoft Visual Basic® 这类编程语言中，表达式始终求得单值结果。Transact-SQL 选择列表中的表达式在该规则上有所不同：其表达式在结果集内按行单独计算。同一个表达式对结果集内的每一行可能会有不同的值，但该表达式在每一行的值是唯一的。例如，在这个 SELECT 语句中，选择列表中的引用 ProductID 和 1+2 都是表达式：

SELECT ProductID, 1+2
FROM Northwind.dbo.Products

表达式 1+2 在结果集的每一行都等于3。尽管表达式 ProductID 在结果集的每一行中产生一个唯一值，每一行的 ProductID 值也仅有一个。

请参见

CASE

CAST 和 CONVERT

COALESCE

数据类型转换

数据类型的优先顺序

数据类型

函数

LIKE

NULLIF

SELECT

WHERE


常量

常量，也称为字面值或标量值，是表示一个特定数据值的符号。常量的格式取决于它所表示的值的数据类型。

字符串常量

字符串常量括在单引号内并包含字母数字字符（a-z、A-Z 和 0-9）以及特殊字符，如感叹号 (!)、at 符 (@) 和数字号 (#)。将为字符串常量指派当前数据库的默认排序规则，除非使用 COLLATE 子句为其指定了排序规则。用户键入的字符串通过计算机的代码页计算，如有必要将被转换为数据库的默认代码页。有关更多信息，请参见排序规则。

如果 QUOTED_IDENTIFIER 选项已将连接设置成 OFF，字符串也可以使用双引号括起来，但是用于 Microsoft SQL Server™ 和 ODBC 驱动程序的 Microsoft® OLE DB 提供程序自动使用 SET QUOTED_IDENTIFIER ON。建议使用单引号。

如果单引号中的字符串包含一个嵌入的引号，可以使用两个单引号表示嵌入的单引号。对于嵌入在双引号中的字符串则没有必要这样做。

字符串的示例为：

'Cincinnati'
'O''Brien'
'Process X is 50% complete.'
'The level for job_id: %d should be between %d and %d.'
"O'Brien"

空字符串用中间没有任何字符的两个单引号表示。在 6.x 兼容模式中，空字符串被看作是一个空格。

字符串常量支持增强的排序规则。

Unicode 字符串

Unicode 字符串的格式与普通字符串相似，但它前面有一个 N 标识符（N 代表 SQL-92 标准中的国际语言 (National Language)）。N 前缀必须是大写字母。例如，'Michél' 是字符串常量而 N'Michél' 则是 Unicode 常量。Unicode 常量被解释为 Unicode 数据，并且不使用代码页进行计算。Unicode 常量确实有排序规则，主要用于控制比较和区分大小写。为 Unicode 常量指派当前数据库的默认排序规则，除非使用 COLLATE 子句为其指定了排序规则。Unicode 数据中的每个字符都使用两个字节进行存储，而字符数据中的每个字符则都使用一个字节进行存储。有关更多信息，请参见使用 Unicode 数据。

Unicode 字符串常量支持增强的排序规则。

二进制常量

二进制常量具有前辍 0x 并且是十六进制数字字符串。这些常量不使用引号。二进制字符串的示例为：

0xAE
0x12Ef
0x69048AEFDD010E
0x  (empty binary string)

bit 常量

bit 常量使用数字 0 或 1 表示，并且不使用引号。如果使用一个大于 1 的数字，它将被转换为 1。

datetime 常量

datetime 常量使用特定格式的字符日期值表示，并被单引号括起来。有关 datetime 常量格式的更多信息，请参见使用日期和时间数据。下面是一些日期常量的示例：

'April 15, 1998'
'15 April, 1998'
'980415'
'04/15/98'

下面是一些时间常量的示例：

'14:30:24'
'04:24 PM'

integer 常量

integer 常量由没有用引号括起来且不含小数点的一串数字表示。integer 常量必须是整数，不能包含小数点。下面是一些 integer 常量的示例：

1894
2

decimal 常量

decimal 常量由没有用引号括起来且包含小数点的一串数字表示。下面是一些 decimal 常量的示例：

1894.1204
2.0

float 和 real 常量

float 和 real 常量使用科学记数法表示。下面是一些 float 或 real 值的示例：

101.5E5
0.5E-2

money 常量

money 常量表示为以可选小数点和可选货币符号作为前缀的一串数字。这些常量不使用引号。下面是一些 money 常量的示例：

$12
$542023.14

uniqueidentifier 常量

uniqueidentifier 常量是表示全局唯一标识符 (GUID) 值的字符串。可以使用字符或二进制字符串格式指定。这两个示例指定相同的 GUID：

'6F9619FF-8B86-D011-B42D-00C04FC964FF'
0xff19966f868b11d0b42d00c04fc964ff
指定负数和正数

若要指明一个数是正数还是负数，应该对数字常量应用 + 或 - 的一元运算符。这将创建一个代表有符号数字值的表达式。如果没有应用 + 或 - 符号，数字常量默认为正数。

  • 有符号的 integer 表达式：
    +145345234
-2147483648
  • 有符号的 decimal 表达式：
    +145345234.2234
-2147483648.10
  • 有符号的 float 表达式：
    +123E-3
-12E5
  • 有符号的 money 表达式：
    -$45.56
+$423456.99
增强的排序规则

SQL Server 2000 支持字符和 Unicode 字符串常量，这些常量支持增强的排序规则。

若要使用增强的排序规则，请使用 COLLATE 子句。

请参见

排序规则

数据类型

表达式

运算符

使用常量


跟踪标记

跟踪标记用于临时设置服务器的特定特征或关闭特定行为。例如，如果启动 Microsoft® SQL Server™ 时设置了跟踪标记 3205，将禁用磁带驱动程序的硬件压缩。跟踪标记经常用于诊断性能问题，或调试存储过程或复杂的计算机系统。

下列跟踪标记在 SQL Server 中可用。

说明 将来的版本可能支持，也可能不支持跟踪标记的行为。

跟踪标记 | 描述
260 | 打印有关扩展存储过程动态链接库 (DLL) 的版本信息。有关 __GetXpVersion() 的更多信息，请参见创建扩展存储过程。
1204 | 返回参与死锁的锁的类型以及当前受影响的命令。
2528 通过 DBCC CHECKDB、DBCC CHECKFILEGROUP 和 DBCC CHECKTABLE 禁用对象的并行检查。默认情况下，并行度由查询处理器自动确定。最大并行度的配置方式与并行查询相同。有关更多信息，请参见 max degree of parallelism 选项。

通常情况下，应将并行 DBCC 保留为启用状态。执行 DBCC CHECKDB 时，查询处理器重新评估和自动调整并行度，并检查每个表或一批表。有时，检查可能在服务器处于实际空闲状态时进行。如果管理员知道在检查结束前负荷将加大，可能希望手工减小或禁用并行度。

但是，禁用并行检查会导致数据库的总体性能降低。降低并行度将增加必须扫描的事务日志量。这反过来增加了对 tempdb 空间的需求，并导致 dbcc 完成检查所需的时间非线性增加。如果运行 DBCC 时启用了 TABLOCK 功能并关闭了并行度，则表可能被锁定更长时间。
3205 | 默认情况下，如果磁带驱动器支持硬件压缩，则 DUMP 或 BACKUP 语句会使用该功能。利用此跟踪标记，可以禁用磁带驱动程序的硬件压缩。本项在要与不支持压缩的其它站点或磁带驱动器交换磁带时有用。

示例
A. 使用 DBCC TRACEON 设置跟踪标记

下例使用 DBCC TRACEON 打开跟踪标记 3205。

DBCC TRACEON (3205)
B. 在命令提示符下设置跟踪标记

下例显示如何在命令提示符下打开跟踪标记 3205。

sqlservr –d"C:\Program Files\Microsoft SQL Server\MSSQL\Data\master.mdf" –T3205

请参见

数据类型

DBCC PINTABLE

DBCC OUTPUTBUFFER

DBCC TRACEOFF

DBCC TRACEON

EXECUTE

SELECT

SET ROWCOUNT

sp_dboption

SQL Server 向后兼容性详细信息

sqlservr 应用程序


函数

Transact-SQL 编程语言提供三种函数：

  • 行集函数

    可以像 SQL 语句中表引用一样使用。有关这些函数的列表的更多信息，请参见行集函数。

  • 聚合函数

    对一组值操作，但返回单一的汇总值。有关这些函数的列表的更多信息，请参见聚合函数。

  • 标量函数

    对单一值操作，返回单一值。只要表达式有效即可使用标量函数。下表列出了标量函数的分类。

    函数分类 | 解释
    配置函数 | 返回当前配置信息。
    游标函数 | 返回游标信息。
    日期和时间函数 | 对日期和时间输入值执行操作，返回一个字符串、数字或日期和时间值。
    数学函数 | 对作为函数参数提供的输入值执行计算，返回一个数字值。
    元数据函数 | 返回有关数据库和数据库对象的信息。
    安全函数 | 返回有关用户和角色的信息。
    字符串函数 | 对字符串（char 或 varchar）输入值执行操作，返回一个字符串或数字值。
    系统函数 | 执行操作并返回有关 Microsoft® SQL Server™ 中的值、对象和设置的信息。
    系统统计函数 | 返回系统的统计信息。
    文本和图像函数 | 对文本或图像输入值或列执行操作，返回有关这些值的信息。

函数确定性

SQL Server 2000 的内置函数可以是确定的也可以是不确定的。如果任何时候用一组特定的输入值调用内置函数，返回的结果总是相同的，则这些内置函数为确定的。如果每次调用内置函数时即使用的是相同的一组特定输入值，返回的结果不总是相同的，则这些内置函数为不确定的。

函数的确定性将规定函数是否可用在索引计算列和索引视图中。索引扫描必须始终生成一致的结果。因而，只有确定性函数才能用来定义将编制索引的计算列和视图。

配置、游标、元数据、安全和系统统计函数不具有确定性。此外，下列内置函数也始终为不确定的：

@@ERROR | FORMATMESSAGE | NEWID
IDENTITY | GETANSINULL | PERMISSIONS
@@ROWCOUNT | GETDATE | SESSION_USER
@@TRANCOUNT | HOST_ID | STATS_DATE
APP_NAME | HOST_NAME | SYSTEM_USER
CURRENT_TIMESTAMP | IDENT_INCR | TEXTPTR
CURRENT_USER | IDENT_SEED | TEXTVALID
DATENAME | IDENTITY | USER_NAME

函数排序规则

使用字符串输入并返回字符串输出的函数对输出使用输入字符串的排序规则。

使用非字符输入并返回字符串的函数对输出使用当前数据库的默认排序规则。

使用多个字符串输入并返回字符串的函数，使用排序规则的优先顺序规则设置输出字符串的排序规则。有关更多信息，请参见排序规则的优先顺序。

请参见

CREATE FUNCTION

确定性函数和非确定性函数

用户定义函数


安全函数

这些安全函数返回有关用户和角色的信息。

fn_trace_geteventinfo | IS_SRVROLEMEMBER
fn_trace_getfilterinfo | SUSER_SID
fn_trace_getinfo | SUSER_SNAME
fn_trace_gettable | USER_ID
HAS_DBACCESS | USER
IS_MEMBER |

所有的安全函数都具有不确定性。每次用一组特定的输入值调用它们时，所返回的结果不总是相同。有关函数确定性的更多信息，请参见确定性函数和非确定性函数。

请参见

函数


聚合函数

聚合函数对一组值执行计算并返回单一的值。除 COUNT 函数之外，聚合函数忽略空值。聚合函数经常与 SELECT 语句的 GROUP BY 子句一同使用。

所有聚合函数都具有确定性。任何时候用一组给定的输入值调用它们时，都返回相同的值。有关函数确定性的更多信息，请参见确定性函数和非确定性函数。

仅在下列项中聚合函数允许作为表达式使用：

  • SELECT 语句的选择列表（子查询或外部查询）。

  • COMPUTE 或 COMPUTE BY 子句。

  • HAVING 子句。

Transact-SQL 编程语言提供下列聚合函数：

AVG | MAX
BINARY_CHECKSUM | MIN
CHECKSUM | SUM
CHECKSUM_AGG | STDEV
COUNT | STDEVP
COUNT_BIG | VAR
GROUPING | VARP

请参见

函数


配置函数

这些标量函数返回当前配置选项设置的信息。

@@DATEFIRST | @@OPTIONS
@@DBTS | @@REMSERVER
@@LANGID | @@SERVERNAME
@@LANGUAGE | @@SERVICENAME
@@LOCK_TIMEOUT | @@SPID
@@MAX_CONNECTIONS | @@TEXTSIZE
@@MAX_PRECISION | @@VERSION
@@NESTLEVEL |

所有配置函数都不具有确定性。每次用一组特定输入值调用它们时，返回的结果不总是相同的。有关函数确定性的更多信息，请参见确定性函数和非确定性函数。

请参见

函数


日期和时间函数

这些标量函数对日期和时间输入值执行操作，并返回一个字符串、数字值或日期和时间值。

下表列出日期和时间函数以及它们的确定性属性。有关函数确定性的更多信息，请参见确定性函数和非确定性函数。

函数 | 确定性
DATEADD | 具有确定性
DATEDIFF | 具有确定性
DATENAME | 不具有确定性
DATEPART | 除了用作 DATEPART (dw, date) 外都具有确定性。dw 是工作日的日期部分，取决于由设置每周第一天的 SET DATEFIRST 所设置的值。
DAY | 具有确定性
GETDATE | 不具有确定性
GETUTCDATE | 不具有确定性
MONTH | 具有确定性
YEAR | 具有确定性

请参见

函数


数学函数

这些标量函数通常对作为参数提供的输入值执行计算，并返回一个数字值。

ABS | DEGREES | RAND
ACOS | EXP | ROUND
ASIN | FLOOR | SIGN
ATAN | LOG | SIN
ATN2 | LOG10 | SQUARE
CEILING | PI | SQRT
COS | POWER | TAN
COT | RADIANS |

说明 算术函数（例如 ABS、CEILING、DEGREES、FLOOR、POWER、RADIANS 和 SIGN）返回与输入值相同数据类型的值。三角函数和其它函数（包括 EXP、LOG、LOG10、SQUARE 和 SQRT）将输入值投影到 float 并返回 float 值。

除了 RAND 外，所有数学函数都是确定性函数。每次用一组特定输入值调用它们时，所返回的结果相同。仅当指定种子参数时，RAND 才具有确定性。有关函数确定性的更多信息，请参见确定性函数和非确定性函数。

请参见

函数


文本和图像函数

这些标量函数对文本或图像输入值或列执行操作，返回有关这些值的信息。

PATINDEX

TEXTPTR

TEXTVALID

这些文本和图像函数都是不确定性函数，每次调用它们时，即使是用相同的一组输入值，也可能返回不同的结果。有关函数确定性的更多信息，请参见确定性函数和非确定性函数。

请参见

函数


系统函数

这些标量函数对 Microsoft® SQL Server™ 中的值、对象和设置进行操作并返回有关信息。

下表列出系统函数及其确定性属性。有关函数确定性的更多信息，请参见确定性函数和非确定性函数。

函数 | 确定性
APP_NAME | 不具有确定性
CASE 表达式 | 具有确定性
CAST 和 CONVERT | 除非与 datetime、smalldatetime 或 sql_variant 一起使用，其它时候都具有确定性。
COALESCE | 具有确定性
COLLATIONPROPERTY | 不具有确定性
CURRENT_TIMESTAMP | 不具有确定性
CURRENT_USER | 不具有确定性
DATALENGTH | 具有确定性
@@ERROR | 不具有确定性
fn_helpcollations | 具有确定性
fn_servershareddrives | 不具有确定性
fn_virtualfilestats | 不具有确定性
FORMATMESSAGE | 不具有确定性
GETANSINULL | 不具有确定性
HOST_ID | 不具有确定性
HOST_NAME | 不具有确定性
IDENT_CURRENT | 不具有确定性
IDENT_INCR | 不具有确定性
IDENT_SEED | 不具有确定性
@@IDENTITY | 不具有确定性
IDENTITY（函数） | 不具有确定性
ISDATE | 只有与 CONVERT 函数一起使用，指定 CONVERT 样式参数且样式参数不等于 0、100、9 或 109 时才具有确定性。样式 0 和 100 使用默认格式 mon dd yyyy hh:miAM（或 PM）。样式 9 和 109 使用默认格式加毫秒 mon dd yyyy hh:mi:ss:mmmAM（或 PM）。
ISNULL | 具有确定性
ISNUMERIC | 具有确定性
NEWID | 不具有确定性
NULLIF | 具有确定性
PARSENAME | 具有确定性
PERMISSIONS | 不具有确定性
@@ROWCOUNT | 不具有确定性
ROWCOUNT_BIG | 不具有确定性
SCOPE_IDENTITY | 不具有确定性
SERVERPROPERTY | 不具有确定性
SESSIONPROPERTY | 不具有确定性
SESSION_USER | 不具有确定性
STATS_DATE | 不具有确定性
SYSTEM_USER | 不具有确定性
@@TRANCOUNT | 不具有确定性
USER_NAME | 不具有确定性

请参见

函数


系统统计函数

这些标量函数返回系统的统计信息。

@@CONNECTIONS | @@PACK_RECEIVED
@@CPU_BUSY | @@PACK_SENT
fn_virtualfilestats | @@TIMETICKS
@@IDLE | @@TOTAL_ERRORS
@@IO_BUSY | @@TOTAL_READ
@@PACKET_ERRORS | @@TOTAL_WRITE

所有系统统计函数都不具有确定性。每次用一组特定的输入值调用它们时，所返回的结果不总是相同。有关函数确定性的更多信息，请参见确定性函数和非确定性函数。

请参见

函数


行集函数

这些行集函数返回对象，该对象可在 Transact-SQL 语句中用作表引用。

CONTAINSTABLE

FREETEXTTABLE

OPENDATASOURCE

OPENQUERY

OPENROWSET

OPENXML

所有行集函数都不具有确定性。每次用一组特定输入值调用它们时，所返回的结果不总是相同的。有关函数确定性的更多信息，请参见确定性函数和非确定性函数。

请参见

函数


游标函数

这些标量函数返回有关游标的信息。

@@CURSOR_ROWS

CURSOR_STATUS

@@FETCH_STATUS

所有游标函数都不具有确定性。每次用一组特定输入值调用它们时，返回的结果不总是相同的。有关函数确定性的更多信息，请参见确定性函数和非确定性函数。

请参见

函数


元数据函数

这些标量函数返回有关数据库和数据库对象的信息。

COL_LENGTH | fn_listextendedproperty
COL_NAME | FULLTEXTCATALOGPROPERTY
COLUMNPROPERTY | FULLTEXTSERVICEPROPERTY
DATABASEPROPERTY | INDEX_COL
DATABASEPROPERTYEX | INDEXKEY_PROPERTY
DB_ID | INDEXPROPERTY
DB_NAME | OBJECT_ID
FILE_ID | OBJECT_NAME
FILE_NAME | OBJECTPROPERTY
FILEGROUP_ID | @@PROCID
FILEGROUP_NAME | SQL_VARIANT_PROPERTY
FILEGROUPPROPERTY | TYPEPROPERTY
FILEPROPERTY |

所有元数据函数都具有不确定性。每次用一组特定的输入值调用它们时，所返回的结果不总是相同。有关函数确定性的更多信息，请参见确定性函数和非确定性函数。

请参见

函数


字符串函数

这些标量函数对字符串输入值执行操作，返回字符串或数字值。

ASCII | NCHAR | SOUNDEX
CHAR | PATINDEX | SPACE
CHARINDEX | REPLACE | STR
DIFFERENCE | QUOTENAME | STUFF
LEFT | REPLICATE | SUBSTRING
LEN | REVERSE | UNICODE
LOWER | RIGHT | UPPER
LTRIM | RTRIM |

除 CHARINDEX 和 PATINDEX 外的所有其它内置字符串函数都具有确定性。每次用一组给定的输入值调用它们时，都返回相同的值。有关函数确定性的更多信息，请参见确定性函数和非确定性函数。

请参见

函数


控制流语言

此表显示 Transact-SQL 控制流关键字。

关键字 | 描述
BEGIN...END | 定义语句块。
BREAK | 退出最内层的 WHILE 循环。
CONTINUE | 重新开始 WHILE 循环。
GOTO label | 从 label 所定义的 label 之后的语句处继续进行处理。
IF...ELSE | 定义条件以及当一个条件为 FALSE 时的操作。
RETURN | 无条件退出。
WAITFOR | 为语句的执行设置延迟。
WHILE | 当特定条件为 TRUE 时重复语句。

可与控制流语言语句一起使用的其它 Transact-SQL 语句有：

CASE

/*...*/（注释）

--（注释）

DECLARE @local_variable

EXECUTE

PRINT

RAISERROR


事务

事务是单个的工作单元。如果某一事务成功，则在该事务中进行的所有数据更改均会提交，成为数据库中的永久组成部分。如果事务遇到错误且必须取消或回滚，则所有数据更改均被清除。

Microsoft® SQL Server™ 以三种事务模式运行：

自动提交事务

每条单独的语句都是一个事务。

显式事务

每个事务均以 BEGIN TRANSACTION 语句显式开始，以 COMMIT 或 ROLLBACK 语句显式结束。

隐性事务

在前一个事务完成时新事务隐式启动，但每个事务仍以 COMMIT 或 ROLLBACK 语句显式完成。

有关更多信息，请参见事务。

请参见

BEGIN DISTRIBUTED TRANSACTION

BEGIN TRANSACTION

COMMIT TRANSACTION

COMMIT WORK

ROLLBACK TRANSACTION

ROLLBACK WORK

SAVE TRANSACTION

SET IMPLICIT_TRANSACTIONS

@@TRANCOUNT


数据类型

在 Microsoft® SQL Server™ 中，每个列、局部变量、表达式和参数都有一个相关的数据类型，这是指定对象可持有的数据类型（整型、字符、money 等等）的特性。SQL Server 提供系统数据类型集，定义了可与 SQL Server 一起使用的所有数据类型。下面列出系统提供的数据类型集。

可以定义用户定义的数据类型，其是系统提供的数据类型的别名。有关用户定义的数据类型的更多信息，请参见 sp_addtype 和创建用户定义的数据类型。

当两个具有不同数据类型、排序规则、精度、小数位数或长度的表达式通过运算符进行组合时：

  1. 通过将数据类型的优先顺序规则应用到输入表达式的数据类型来确定所得值的数据类型。有关更多信息，请参见数据类型的优先顺序。

  2. 如果结果数据类型为 char、varchar、text、nchar、nvarchar 或 ntext，则结果值的排序规则由排序规则的优先顺序规则决定。有关更多信息，请参见排序规则的优先顺序。

  3. 结果的精度、小数位数及长度取决于输入表达式的精度、小数位数及长度。有关更多信息，请参见精度、小数位数和长度。

SQL Server 为 SQL-92 兼容性提供了数据类型同义词。有关更多信息，请参见数据类型同义词。

精确数字
整数

bigint

从 -2^63 (-9223372036854775808) 到 2^63-1 (9223372036854775807) 的整型数据（所有数字）。

int

从 -2^31 (-2,147,483,648) 到 2^31 - 1 (2,147,483,647) 的整型数据（所有数字）。

smallint

从 -2^15 (-32,768) 到 2^15 - 1 (32,767) 的整数数据。

tinyint

从 0 到 255 的整数数据。

bit

bit

1 或 0 的整数数据。

decimal 和 numeric

decimal

从 -10^38 +1 到 10^38 –1 的固定精度和小数位的数字数据。

numeric

功能上等同于 decimal。

money 和 smallmoney

money

货币数据值介于 -2^63 (-922,337,203,685,477.5808) 与 2^63 - 1 (+922,337,203,685,477.5807) 之间，精确到货币单位的千分之十。

smallmoney

货币数据值介于 -214,748.3648 与 +214,748.3647 之间，精确到货币单位的千分之十。

近似数字

float

从 -1.79E + 308 到 1.79E + 308 的浮点精度数字。

real

从 -3.40E + 38 到 3.40E + 38 的浮点精度数字。

datetime 和 smalldatetime

datetime

从 1753 年 1 月 1 日到 9999 年 12 月 31 日的日期和时间数据，精确到百分之三秒（或 3.33 毫秒）。

smalldatetime

从 1900 年 1 月 1 日到 2079 年 6 月 6 日的日期和时间数据，精确到分钟。

字符串

char

固定长度的非 Unicode 字符数据，最大长度为 8,000 个字符。

varchar

可变长度的非 Unicode 数据，最长为 8,000 个字符。

text

可变长度的非 Unicode 数据，最大长度为 2^31 - 1 (2,147,483,647) 个字符。

Unicode 字符串

nchar

固定长度的 Unicode 数据，最大长度为 4,000 个字符。

nvarchar

可变长度 Unicode 数据，其最大长度为 4,000 字符。sysname 是系统提供用户定义的数据类型，在功能上等同于 nvarchar(128)，用于引用数据库对象名。

ntext

可变长度 Unicode 数据，其最大长度为 2^30 - 1 (1,073,741,823) 个字符。

二进制字符串

binary

固定长度的二进制数据，其最大长度为 8,000 个字节。

varbinary

可变长度的二进制数据，其最大长度为 8,000 个字节。

image

可变长度的二进制数据，其最大长度为 2^31 - 1 (2,147,483,647) 个字节。

其它数据类型

cursor

游标的引用。

sql_variant

一种存储 SQL Server 支持的各种数据类型（text、ntext、timestamp 和 sql_variant 除外）值的数据类型。

table

一种特殊的数据类型，存储供以后处理的结果集。

timestamp

数据库范围的唯一数字，每次更新行时也进行更新。

uniqueidentifier

全局唯一标识符 (GUID)。

请参见

CREATE PROCEDURE

CREATE TABLE

DECLARE @local_variable

EXECUTE

表达式

函数

LIKE

SET

sp_bindefault

sp_bindrule

sp_droptype

sp_help

sp_rename

sp_unbindefault

sp_unbindrule

使用 Unicode 数据


精度、小数位数和长度

精度是数中的数字个数。小数位数是数中小数点右边的数字个数。例如，数 123.45 的精度是 5，小数位数是2。

numeric 和 decimal 数据类型默认的最大精度是 38。在 SQL Server 早期版本中，默认的最大值是 28。

数字数据类型的长度是存储此数所占用的字节数。字符串或 Unicode 数据类型的长度是字符个数。binary、varbinary、和 image 数据类型的长度是字节数。例如，int 数据类型可以有 10 位数，用 4 个字节存储，不接受小数点。int 数据类型的精度是 10，长度是 4，小数位数是 0。

当两个 char、varchar、binary 或 varbinary 表达式串联时，结果表达式的长度是这两个源表达式长度之和，或是 8,000 字符，以二者中少者计。

当两个 nchar 或 nvarchar 表达式串联时，结果表达式的长度是两个源表达式长度之和，或是 4,000 字符，以二者中少者计。

除了 decimal 类型之外，数字数据类型的精度和小数位数是固定的。如果算术运算符有两个相同类型的表达式，结果就为该数据类型，并且有对此类型定义的精度和小数位数。如果运算符有两个不同数字数据类型的表达式，数据类型优先规则决定结果的数据类型。结果为该数据类型定义的精度和小数位数。

下表定义了当运算的结果是 decimal 类型时，结果的精度和小数位数是如何计算的。当以下情况时，结果是 decimal 类型：

  1. 两个表达式是 decimal 类型。

  2. 一个表达式是 decimal 类型，而另一个是比 decimal 优先顺序低的数据类型。

操作数表达式由表达式 e1（精度为 p1，小数位数为 s1）和表达式 e2（精度为 p2，小数位数为 s2）来表示。非 decimal 类型的表达式的精度和小数位数，是对此表达式数据类型定义的精度和小数位数。

操作 | 结果精度 | 结果小数位数 *
e1 + e2 | max(s1, s2) + max(p1-s1, p2-s2) + 1 | max(s1, s2)
e1 - e2 | max(s1, s2) + max(p1-s1, p2-s2) | max(s1, s2)
e1 * e2 | p1 + p2 + 1 | s1 + s2
e1 / e2 | p1 - s1 + s2 + max(6, s1 + p2 + 1) | max(6, s1 + p2 + 1)

* 结果精度和小数位数有绝对最大值 38。当结果精度大于 38 时，相应的小数位数会减少，以避免结果的整数部分被截断。


排序规则的优先顺序

排序规则的优先顺序（也称为排序规则类型强制规则）是赋予一组规则的术语，而这组规则决定：

  1. 取值为字符串的表达式的最终结果的排序规则。

  2. 区分排序规则的运算符所使用的排序规则，这些运算符使用字符串输入但不返回字符串，如 LIKE 和 IN。

排序规则的优先顺序规则只适用于字符串数据类型：char、varchar、text、nchar、nvarchar 和 ntext。具有其它数据类型的对象不参加排序规则的评估。

所有对象的排序规则可归为四类中的一种。每类的名称叫做排序规则标志。

排序规则标志 | 对象类型
强制默认 | 任何 Transact-SQL 字符串变量、参数、字面值、目录内置函数的输出、或不使用字符串输入但产生字符串输出的内置函数。 如果在用户定义函数、存储过程或触发器中声明某个对象，则将该对象指派为在其中创建函数、存储过程或触发器的数据库的默认排序规则。如果在批处理中声明该对象，则将其指派为连接所使用的当前数据库的默认排序规则。
隐性 X | 列引用。从为表或视图中的列定义的排序规则得到表达式（由 X 表示）的排序规则。 即使 CREATE TABLE 或 CREATE VIEW 语句中的 COLLATE 子句给列显式指派了排序规则，该列引用仍归为隐性。
显式 X | 使用表达式中的 COLLATE 子句显式投影到特定排序规则（由 X 表示）的表达式。
无排序规则 | 表示表达式的值是两个字符串之间操作的结果，而这两个字符串具有隐性排序规则标志的冲突排序规则。表达式的结果被定义为不具有排序规则。

只引用一个字符串对象的简单表达式的排序规则标志是被引用对象的排序规则标志。

如果复杂表达式所引用的两个操作数表达式的排序规则标志相同，则该复杂表达式的排序规则标志为数表达式的排序规则标志。

如果复杂表达式所引用的两个操作数表达式的排序规则不同，则该复杂表达式最终结果的排序规则标志基于下列规则：

  1. 显式优先于隐性。隐性优先于强制默认。换言之，

    显式 > 隐性 > 强制默认

  2. 组合两个已指派给不同排序规则的显式表达式将生成错误。

    显式 X + 显式 Y = 错误

  3. 组合两个具有不同排序规则的隐性表达式将产生无排序规则。

    隐性 X + 隐性 Y = 无排序规则

  4. 将无排序规则的表达式与任何标志的表达式组合，除了显式排序规则外（参见下一项），都产生无排序规则标志的结果。

    无排序规则 + 任何标志 = 无排序规则

  5. 将无排序规则的表达式与显式排序规则的表达式组合将产生具有显式标志的表达式。

    无排序规则 + 显式 X = 显式

下面的示例说明上述规则。

USE tempdb
GO

CREATE TABLE TestTab (
   id int,
   GreekCol nvarchar(10) collate greek_ci_as,
   LatinCol nvarchar(10) collate latin1_general_cs_as
   )
INSERT TestTab VALUES (1, N'A', N'a')
GO

下面查询中的谓词具有排序规则冲突，因此产生错误：

SELECT *
FROM TestTab
WHERE GreekCol = LatinCol

下面是结果集。

Msg 446, Level 16, State 9, Server CTSSERV, Line 1
Cannot resolve collation conflict for equal to operation.

下面查询中的谓词在排序规则 greek_ci_as 中取值，因为右边表达式具有显式标志，优先于右边表达式的隐性标志：

SELECT *
FROM TestTab
WHERE GreekCol = LatinCol COLLATE greek_ci_as

下面是结果集。

id          GreekCol             LatinCol
 ----------- -------------------- --------------------
           1 a                    A

(1 row affected)

下面查询中的 case 表达式没有排序规则标志，所以不能出现在选择列表中，也不能由区分排序规则的运算符操作。不过，这些表达式可由不区分排序规则的运算符操作。

SELECT (CASE WHEN id > 10 THEN GreekCol ELSE LatinCol END)
FROM TestTab

下面是结果集。

Msg 451, Level 16, State 1, Line 1
Cannot resolve collation conflict for column 1 in SELECT statement.

SELECT PATINDEX((CASE WHEN id > 10 THEN GreekCol ELSE LatinCol END), 'a')
FROM TestTab

下面是结果集。

Msg 446, Level 16, State 9, Server LEIH2, Line 1
Cannot resolve collation conflict for patindex operation.

SELECT (CASE WHEN id > 10 THEN GreekCol ELSE LatinCol END) COLLATE Latin1_General_CI_AS
FROM TestTab

下面是结果集。

--------------------
a

(1 row affected)

下表汇总了上述规则。

操作数强制标志 | 显式 X | 隐性 X | 强制默认 | 无排序规则
显式 Y | 生成错误 | 结果为显式 Y | 结果为显式 Y | 结果为显式 Y
隐性 Y | 结果为显式 X | 结果为无排序规则 | 结果为隐性 Y | 结果为无排序规则
强制默认 | 结果为显式 X | 结果为隐性 X | 结果为强制默认 | 结果为无排序规则
无排序规则 | 结果为显式 X | 结果为无排序规则 | 结果为无排序规则 | 结果为无排序规则

运算符和函数区分排序规则或不区分排序规则：

  1. 区分排序规则表示指定无排序规则操作数是编译时错误。表达式结果不能是无排序规则。

  2. 不区分排序规则表示操作数和结果可以是无排序规则。

比较运算符以及 MAX、MIN、BETWEEN、LIKE 和 IN 运算符都区分排序规则。运算符所使用的字符串被赋以具有较高优先顺序的操作数的排序规则标志。UNION 运算符也区分排序规则，且所有的字符串操作数和最终结果被赋以具有最高优先顺序的操作数的排序规则。按列评估 UNION 操作数和结果的排序规则优先顺序。

赋值运算符不区分排序规则，右边的表达式投影到左边的排序规则上。

字符串串联运算符不区分排序规则，两个字符串操作数和结果被赋以具有最高排序规则优先顺序的操作数的排序规则标志。UNION ALL 和 CASE 运算符不区分排序规则，所有的字符串操作数和最终结果都被赋以具有最高优先顺序的操作数的排序规则标志。按列评估 UNION ALL 操作数和结果的排序规则优先顺序。

CAST、CONVERT 和 COLLATE 函数区分 char、varchar 和 text 数据类型的排序规则。如果 CAST 和 CONVERT 函数的输入和输出是字符串，则输出字符串具有输入字符串的排序规则标志。如果输入不是字符串，则输出字符串为强制默认并被赋以连接所使用的当前数据库的排序规则，或是包含引用 CAST 或 CONVERT 的用户定义函数、存储过程或触发器的数据库的排序规则。

对于返回字符串但不使用字符串输入的内置函数，结果字符串为强制默认并被赋以当前数据库的排序规则，或是包含引用该函数的用户定义函数、存储过程或触发器的数据库的排序规则。

下列函数区分排序规则，其输出字符串具有输入字符串的排序规则标志：

  1. CHARINDEX

  2. DIFFERENCE

  3. ISNUMERIC

  4. LEFT

  5. LEN

  6. LOWER

  7. PATINDEX

  8. REPLACE

  9. REVERSE

  10. RIGHT

  11. SOUNDEX

  12. STUFF

  13. SUBSTRING

  14. UPPER

下列附加规则也适用于排序规则优先顺序：

  1. 在已经是显式表达式的表达式上不能有多个 COLLATE 子句。例如，下面的 WHERE 子句是不合法的，因为将 COLLATE 子句指定给的表达式已经是显式表达式：
    WHERE ColumnA = ( 'abc' COLLATE French_CI_AS) COLLATE French_CS_AS
  2. text 数据类型不允许代码页转换。如果排序规则的代码页不同，不能将文本表达式从一种排序规则投影到另一种排序规则。如果右边文本操作数的排序规则代码页与左边文本操作数不同，则赋值运算符不能赋值。

在数据类型转换后确定排序规则的优先顺序。产生结果排序规则的操作数可以与提供最终结果数据类型的操作数不同。例如，考察下面的批处理：

CREATE TABLE TestTab
   (PrimaryKey int PRIMARY KEY,
    CharCol char(10) COLLATE French_CI_AS
   )

SELECT *
FROM TestTab
WHERE CharCol LIKE N'abc'

简单表达式 N'abc' 的 Unicode 数据类型具有较高的数据类型优先顺序，所以结果表达式将 Unicode 数据类型指派给 N'abc'。然而，表达式 CharCol 具有隐性排序规则标志，而 N'abc' 具有较低的强制默认排序规则标志，所以使用的排序规则是 CharCol 的 French_CI_AS 排序规则。

请参见

COLLATE

数据类型转换


数据类型的优先顺序

当两个不同数据类型的表达式用运算符组合后，数据类型的优先顺序规则确定哪种数据类型要向另一种转换。优先顺序低的数据类型向优先顺序高的数据类型转换。如果此转换不是所支持的固有转换，则返回错误。当两个操作数表达式有相同的数据类型时，运算的结果就为那种数据类型。

下面是 Microsoft® SQL Server™ 2000 数据类型的优先顺序：

  1. sql_variant（最高）

  2. datetime

  3. smalldatetime

  4. float

  5. real

  6. decimal

  7. money

  8. smallmoney

  9. bigint

  10. int

  11. smallint

  12. tinyint

  13. bit

  14. ntext

  15. text

  16. image

  17. timestamp

  18. uniqueidentifier

  19. nvarchar

  20. nchar

  21. varchar

  22. char

  23. varbinary

  24. binary（最低）


数据类型同义词

包括数据类型同义词以便实现 SQL-92 的兼容性。

同义词 | 映射为系统数据类型
Binary varying | Varbinary
char varying | Varchar
character | Char
character | char(1)
character(n) | char(n)
character varying(n) | varchar(n)
Dec | decimal
Double precision | float
float[(n)] for n = 1-7 | real
float[(n)] for n = 8-15 | float
integer | int
national character(n) | nchar(n)
national char(n) | nchar(n)
national character varying(n) | nvarchar(n)
national char varying(n) | nvarchar(n)
national text | ntext
rowversion | timestamp

在诸如 CREATE TABLE、CREATE PROCEDURE 或 DECLARE @variable 这类数据定义语言 (DDL) 语句中，数据类型同义词可用来代替相应的基本数据类型名。不过，创建了对象后，将看不到同义词。创建对象时，将给对象指派与同义词关联的基本数据类型，且在创建对象的语句中没有关于已指定同义词的记录。

将给所有由原始对象派生出的对象（如结果集列或表达式）指派基本数据类型。所有在原始对象和任何派生对象上执行的后续元数据函数都将报告基本数据类型，而不是同义词。这包括元数据操作（如 sp_help）和其它报告表或结果集列的数据类型的系统存储过程、信息架构视图或各种数据访问 API 元数据操作。

数据类型同义词也不能在图形管理实用工具（如 SQL Server 企业管理器）中指定。

例如，可创建一个指定 national character varying 的表：

CREATE TABLE ExampleTable (PriKey int PRIMARY KEY, VarCHarCol national character varying(10))

实际上给 VarCharCol 指派了 nvarchar(10) 数据类型，并且所有后续元数据函数将它报告为 nvarchar(10) 列。元数据函数决不会将它们报告为 national character varying(10) 列。


搜索条件

是使用逻辑运算符 AND、OR 和 NOT 的一个或更多谓词的组合。

语法

< search_condition > ::=
{ [ NOT ] < predicate > | ( < searth_condition > ) }
[ { AND | OR } [ NOT ] { < predicate > |( < searth_condition > ) } ]
} [ ,...n ]

< predicate > ::=
{ expression { = | < > | != | > | > = | ! > | < | < = | ! < } expression
| string_expression [ NOT ] LIKE string_expression
[ ESCAPE 'escape_character' ]
| expression [ NOT ] BETWEEN expression AND expression
| expression IS [ NOT ] NULL
| CONTAINS
( { column | * } , '< contains_search_condition >' )
 | FREETEXT ( { column | * } , 'freetext_string' )
| expression [ NOT ] IN ( subquery | expression [ ,...n ] )
| expression { = | < > | != | > | > = | ! > | < | < = | ! < }
            { ALL | SOME | ANY} ( subquery )
| EXISTS ( subquery )
    }

参数

<search_condition>

指定 SELECT 语句、查询表达式或子查询的结果集内所返回的行的条件。对于 UPDATE 语句，指定要更新的行。对于 DELETE 语句，指定要删除的行。对 Transact-SQL 语句搜索条件中可以包含的谓词数量没有限制。

NOT
对由谓词指定的布尔表达式求反。有关更多信息，请参见 NOT。
AND
组合两个条件并在两个条件都是 TRUE 时取值为 TRUE。有关更多信息，请参见 AND。
OR
组合两个条件并在任何一个条件是 TRUE 时取值为 TRUE。有关更多信息，请参见 OR。

< predicate >

是返回 TRUE、FALSE 或 UNKNOWN 的表达式。

expression
是列名、常量、函数、变量、标量子查询，或者是由运算符或子查询连接的列名、常量和函数的任意组合。该表达式还可以包含 CASE 函数。
=
是用于测试两个表达式是否相等的运算符。
<>
是用于测试两个表达式彼此不相等的条件的运算符。
!=
是用于测试两个表达式彼此不相等的条件的运算符。
>
是用于测试一个表达式大于另一个的条件的运算符。
>=
是用于测试一个表达式大于或等于另一个的条件的运算符。
!>
是用于测试一个表达式不大于另一个的条件的运算符。
<
是用于测试一个表达式小于另一个的条件的运算符。
<=
是用于测试一个表达式小于或等于另一个的条件的运算符。
!<
是用于测试一个表达式不小于另一个的条件的运算符。
string_expression
是字符串和通配符。
[NOT] LIKE
表示对后续字符串使用模式匹配。有关更多信息，请参见 LIKE。
ESCAPE 'escape_character'
允许在字符串中搜索通配符而不是将其作为通配符使用。escape_character 是放在通配符前表示此特殊用途的字符。
[ NOT ] BETWEEN
指定值的包含范围。使用 AND 将开始值和结束值分开。有关更多信息，请参见 BETWEEN。
IS [NOT] NULL
根据所使用的关键字指定对空值或非空值的搜索。如果有任何操作数是 NULL，带位运算符或算术运算符的表达式将取值为 NULL。
CONTAINS
在包含基于字符的数据的列中，搜索单个词和短语的精确或"模糊"（不精确）匹配项、一定间距内的近似词以及加权匹配项。只能与 SELECT 语句一起使用。有关更多信息，请参见 CONTAINS。
FREETEXT
通过在包含基于字符的数据的列中，搜索与含义而不是谓词中的精确词相匹配的值，提供简单形式的自然语言查询。只能与 SELECT 语句一起使用。有关更多信息，请参见 FREETEXT。
[ NOT ] IN
根据表达式是包含在列表内还是排除在列表外，指定对表达式的搜索。搜索表达式可以是常量或列名，而列表可以是一组常量或更多情况下是子查询。将值列表放在圆括号内。有关更多信息，请参见 IN。
subquery
可被看成是受限 SELECT 语句且与 SELECT 语句中的 <query_expresssion> 相似。不允许使用 ORDER BY 子句、COMPUTE 子句和 INTO 关键字。有关更多信息，请参见 SELECT。
ALL
与比较运算符和子查询一起使用。如果子查询检索的所有值满足比较运算，将给 <predicate> 返回 TRUE，或者如果不是所有值都满足比较运算或子查询没有给外部语句返回行，则返回 FALSE。有关更多信息，请参见 ALL。
{ SOME | ANY }
与比较运算符和子查询一起使用。如果子查询检索的任何值都满足比较运算，将给 <predicate> 返回 TRUE，或者如果子查询内没有值满足比较运算或子查询没有给外部语句返回行，则返回 FALSE。否则，表达式是未知的。有关更多信息，请参见 SOME | ANY。
EXISTS
与子查询一起使用，测试由子查询返回的行是否存在。有关更多信息，请参见 EXISTS。
注释

逻辑运算符的优先顺序是 NOT（最高），接着是 AND，最后是 OR。同一优先级上的取值顺序是从左到右。在搜索条件内，可使用圆括号替代此顺序。有关逻辑运算符如何在真实值上运算的更多信息，请参见 AND、OR 和 NOT。

示例
A. 在 WHERE 中使用 LIKE 和 ESCAPE 语法

下例假定 description 列存在于 finances 表内。若要搜索其中的 description 列包含精确字符 g_ 的行，请使用 ESCAPE 选项，因为 _ 是通配符。如果不指定 ESCAPE 选项，查询将搜索任何包含字母 g 后跟除 _ 字符外的任何单个字符的描述值。

SELECT *
FROM finances
WHERE description LIKE 'gs_' ESCAPE 'S'
GO
B. 对 Unicode 数据使用 WHERE 和 LIKE 语法

下例使用 WHERE 子句检索公司名称末尾包含字符串 snabbköp 的公司的联系人姓名、电话和传真号码。

USE Northwind
SELECT CompanyName, ContactName, Phone, Fax
FROM Customers
WHERE CompanyName LIKE N'%snabbköp'
ORDER BY CompanyName ASC, ContactName ASC

请参见

聚合函数

CASE

CONTAINSTABLE

游标

DELETE

表达式

FREETEXTTABLE

FROM

对 SQL Server 数据进行全文查询

运算符（逻辑）

UPDATE


系统表

Microsoft® SQL Server™ 2000 及其组件所用的信息存储在称为系统表的特殊表中。

任何用户都不应直接修改系统表。例如，不要尝试使用 DELETE、UPDATE、INSERT 语句或用户定义的触发器修改系统表。

允许在系统表中引用编制的列。然而，系统表中的许多列都未被编制。不应编写应用程序直接查询未编制的列。相反，应用程序应使用以下任何组件检索系统表中存储的信息：

  • 信息架构视图

  • 系统存储过程

  • Transact-SQL 语句和函数

  • SQL-DMO

  • 数据库应用程序接口 (API) 目录函数

这些组件构成一个已发布的 API，用以从 SQL Server 获取系统信息。Microsoft 维护这些组件在不同版本间的兼容性。系统表的格式取决于 SQL Server 的内部构架，并且可能因不同的版本而异。因此，直接访问系统表中未编制列的应用程序可能需要做些更改后才能访问 SQL Server 的后继版本。

仅在 master 数据库中的系统表

这些表存储服务器级系统信息。

sysaltfiles | syslockinfo
syscacheobjects | syslogins
syscharsets | sysmessages
sysconfigures | sysoledbusers
syscurconfigs | sysperfinfo
sysdatabases | sysprocesses
sysdevices | sysremotelogins
syslanguages | sysservers

每个数据库中的系统表

这些表为每个数据库存储数据库级系统信息。

syscolumns | sysindexkeys
syscomments | sysmembers
sysconstraints | sysobjects
sysdepends | syspermissions
sysfilegroups | sysprotects
sysfiles | sysreferences
sysforeignkeys | systypes
sysfulltextcatalogs | sysusers
sysindexes |

msdb 数据库中的 SQL Server 代理程序表

这些表存储 SQL Server 代理程序使用的信息。

sysalerts | sysjobsteps
syscategories | sysnotifications
sysdownloadlist | sysoperators
sysjobhistory | systargetservergroupmembers
sysjobs | systargetservergroups
sysjobschedules | systargetservers
sysjobservers | systaskids

msdb 数据库中的表

这些表存储数据库备份和还原操作使用的信息。

backupfile | restorefile
backupmediafamily | restorefilegroup
backupmediaset | restorehistory
backupset |

用于存储复制信息的表

这些表由复制使用并存储在 master 数据库中。

sysdatabases sysservers

这些表由复制使用并存储在 msdb 数据库中。

sysreplicationalerts

这些表由复制使用并存储在 distribution 数据库中。

MSagent_parameters | Mspublisher_databases
MSagent_profiles | MSreplication_objects
MSarticles | MSreplication_subscriptions
MSdistpublishers | MSrepl_commands
MSdistributiondbs | MSrepl_errors
MSdistribution_agents | MSrepl_originators
MSdistribution_history | MSrepl_transactions
MSdistributor | MSrepl_version
MSlogreader_agents | MSsnapshot_agents
MSlogreader_history | MSsnapshot_history
MSmerge_agents | MSsubscriber_info
MSmerge_history | MSsubscriber_schedule
MSmerge_subscriptions | MSsubscriptions
MSpublication_access | MSsubscription_properties
Mspublications |

这些表由复制使用并存储在 publication 数据库中。

MSmerge_contents | sysmergearticles
MSmerge_delete_conflicts | sysmergepublications
MSmerge_genhistory | sysmergeschemachange
MSmerge_replinfo | sysmergesubscriptions
MSmerge_tombstone | sysmergesubsetfilters
sysarticles | syspublications
sysarticleupdates | syssubscriptions


backupfile

每个备份的数据或日志文件在表中占一行。该表存储在 msdb 数据库中。

列名 | 数据类型 | 描述
backup_set_id | int NOT NULL REFERENCES backupset(backup_ set_id) | 包含备份集的文件的唯一标识号。
first_family_number | tinyint NULL | 包含该备份文件的第一个媒体的家族号。
first_media_number | smallint NULL | 包含该备份文件的第一个媒体的媒体号。
filegroup_name | nvarchar(128) NULL | 文件组的名称，该文件组包含已备份的数据库（数据或日志）文件。
page_size | int NULL | 页大小（以字节为单位）。
file_number | numeric(10,0) NOT NULL | 唯一文件标识号 (FILE_ID)。
backed_up_page_count | numeric(10,0) NULL | 备份的页数。
file_type | char(1) NULL | 备份的文件。可以是 D（表示数据文件）或 L（表示日志文件）。
source_file_block_size | numeric(10,0) NULL | 原始数据或日志文件备份时所驻留的设备。
file_size | numeric(20,0) NULL | 备份文件的长度（以字节为单位）。
logical_name | nvarchar(128) NULL | 备份文件的逻辑名称。
physical_drive | varchar(260) NULL | 物理驱动器或分区名称。
physical_name | varchar(260) NULL | 物理（操作系统）文件名的剩余部分。


backupmediafamily

每个媒体家族在表中占一行。该表存储在 msdb 数据库中。

列名 | 数据类型 | 描述
media_set_id | int NOT NULL REFERENCES backupmediaset (media_set_id) | 标识该家族所属媒体集的唯一标识号。
family_sequence_ number | tinyint NOT NULL | 该媒体家族在媒体集中的位置。
media_family_id | uniqueidentifier NULL | 标识媒体家族的唯一标识号。
media_count | int NULL | 媒体家族中的媒体数。
logical_device_name | nvarchar(128) NULL | sysdevices 中的备份设备名称。如果是临时备份设备（与存在于 sysdevices 中的永久备份设备相对），则 logical_device_name 为 NULL。
physical_device_name | nvarchar(260) NULL | 备份设备的物理名称。
device_type | tinyint NULL | 备份设备的类型： 磁盘 2 = 临时。 102 = 永久。 磁带 5 = 临时。 105 = 永久。 管道 6 = 临时。 106 = 永久。 所有永久设备的名称和设备号都可以在 sysdevices 中找到。
physical_block_size | int NULL | 用于写入媒体家族的物理块大小。


backupmediaset

每个备份媒体集在表中占一行。该表存储在 msdb 数据库中。

列名 | 数据类型 | 描述
media_set_id | int IDENTITY PRIMARY KEY | 唯一媒体集标识号。
media_uuid | uniqueidentifier NULL | 媒体集中的媒体数。如果备份集中只有一个媒体家族，则该列为 NULL（media_family_count 为 1）。
media_family_count | tinyint NULL | 媒体集中的媒体家族数。
name | nvarchar(128) NULL | 媒体集的名称。有关更多信息，请参见 BACKUP 中的 MEDIANAME 和 MEDIADESCRIPTION。
description | nvarchar(255) NULL | 媒体集的文本化描述。有关更多信息，请参见 BACKUP 中的 MEDIANAME 和 MEDIADESCRIPTION。
software_name | nvarchar(128) NULL | 写入媒体标签的备份软件名称。
software_vendor_id | int NULL | 写入备份媒体标签的软件供应商标识号。该列的 Microsoft® SQL Server™ 值为十六进制数 0x1200。
MTF_major_version | tinyint NULL | 用于生成该媒体集的 Microsoft 磁带格式的主要版本号。


backupset

每个备份集在表中占一行。该表存储在 msdb 数据库中。

列名 | 数据类型 | 描述
backup_set_id | int NOT NULL IDENTITY PRIMARY KEY | 标识备份集的唯一备份集标识号。
backup_set_uuid | uniqueidentifier NOT NULL | 标识媒体上备份集的唯一备份集标识号。
media_set_id | int NOT NULL REFERENCES backupmediaset (media_set_id) | 标识备份集所在媒体集的唯一媒体集标识号。
first_family_number | tinyint NULL | 备份集中第一个媒体的家族号。
first_media_number | smallint NULL | 备份集中第一个媒体的媒体号。
last_family_number | tinyint NULL | 备份集中最后一个媒体的家族号。
last_media_number | smallint NULL | 备份集中最后一个媒体的媒体号。
catalog_family_ number | tinyint NULL | 包含备份集目录开始的媒体的家族号。
catalog_media_number | smallint NULL | 包含备份集目录开始的媒体的媒体号。
position | int NULL | 还原操作中用来定位适当的备份集和文件的备份集位置。有关更多信息，请参见 BACKUP。
expiration_date | datetime NULL | 备份集的过期日期和时间。
software_vendor_id | int NULL | 写入备份媒体首部的软件供应商标识号。
name | nvarchar(128) NULL | 备份集的名称。
description | nvarchar(255) NULL | 对备份集的描述。
user_name | nvarchar(128) NULL | 执行备份操作的用户名。
software_major_version | tinyint NULL | Microsoft® SQL Server™ 的主要版本号。
software_minor_ version | tinyint NULL | SQL Server 的次要版本号。
software_build_version | smallint NULL | SQL Server 的内部版本号码。
time_zone | smallint NULL | 本地时间（备份操作发生的时间）和美国国内统一时间 (UCT) 的差别（以 15 分钟为计量单位）。值可介于（并包括）-48 到 +48 之间。值 127 表示未知。例如，-20 为美国东部标准时间 (EST) 或比 UCT 晚 5 小时。
mtf_minor_version | tinyint NULL | Microsoft 磁带格式的次要版本号。
first_lsn | numeric(25,0) NULL | 备份集中第一个或最旧日志记录的日志序列号。
last_lsn | numeric(25,0) NULL | 备份集中最后一个或最新日志记录的日志序列号。
checkpoint_lsn | numeric(25,0) NULL | 恢复操作开始时所在的日志记录的日志序列号。
database_backup_lsn | numeric(25,0) NULL | 最新的完整数据库备份的日志序列号。
database_creation_date | datetime NULL | 数据库最初创建的日期和时间。
backup_start_date | datetime NULL | 备份操作的开始日期和时间。
backup_finish_date | datetime NULL | 备份操作的结束日期和时间。
type | char(1) NULL | 备份类型。可以是： D = 数据库。 I = 数据库差异。 L = 日志。 F = 文件或文件组。
sort_order | smallint NULL | 执行备份操作的服务器排序次序。有关排序次序和排序规则的更多信息，请参见排序规则。
code_page | smallint NULL | 执行备份操作的服务器代码页。有关代码页的更多信息，请参见排序规则。
compatibility_level | tinyint NULL | 数据库的兼容级别设置。可以是： 60 = SQL Server 6.0 版。 SQL Server 6.5。 70 = SQL Server 7.0。 有关兼容级别的更多信息，请参见 sp_dbcmptlevel。
database_version | int NULL | 数据库的版本号。
backup_size | numeric(20,0) NULL | 备份集的大小（以字节为单位）。
database_name | nvarchar(128) NULL | 备份操作中所涉及的数据库名称。
server_name | nvarchar(128) NULL | 运行 SQL Server 备份操作的服务器名称。
machine_name | nvarchar(128) NULL | 运行 SQL Server 的计算机名称。
flags | int NULL | 标记位： 1 = 备份包含最少的记录数据。 2 = 使用了 WITH SNAPSHOT。 4 = 备份时数据库为只读。 8 = 备份时数据库处于单用户模式。
unicode_locale | int NULL | Unicode 区域设置。
unicode_compare_style | int NULL | Unicode 比较风格。
collation_name | nvarchar(128) NULL | 排序规则名。


log_shipping_databases

该表存储在 msdb 数据库中。

列名 | 数据类型 | 描述
database_name | sysname | 正在进行日志传送的数据库名。
maintenance_plan _id | uniqueidentifier | 维护计划 ID。


log_shipping_monitor

该表存储在 msdb 数据库中。

列名 | 数据类型 | 描述
monitor_server_name | sysname | 日志传送监视服务器的名称。
logon_type | int | 身份验证方法： 1 = Windows 身份验证。 2 = SQL Server 身份验证。
logon_data | varbinary(256) | 登录名和密码。


log_shipping_plan_databases

该表存储在 msdb 数据库中。

列名 | 数据类型 | 描述
plan_id | uniqueidentifier | 存在于辅助服务器上的维护计划的计划 ID。
source_database | sysname | 日志传送对中的主数据库。
destination_database | sysname | 日志传送对中的辅助数据库。
load_delay | int | 事务日志传送到辅服务器后，还原事务日志前的延迟时间（以秒为单位）。
load_all | bit | 1 = 装载所有复制的事务日志。
last_file_copied | nvarchar(500) | 上次复制的事务日志的文件名。
date_last_copied | datetime | 上次复制事务日志的日期。
last_file_loaded | nvarchar(500) | 上次装载的事务日志的文件名。
date_last_loaded | datetime | 上次装载事务日志的日期。
copy_enabled | bit | 允许复制事务日志。 0 = 禁用复制。 1 = 启用复制。
load_enabled | bit | 允许装载事务日志。 0 = 禁用装载。 1 = 启用装载。
recover_db | bit | 回滚所有还原后未完成的事务。 0 = FALSE 1 = TRUE
terminate_users | bit | 1 = 终止数据库用户。


log_shipping_plan_history

该表存储在 msdb 数据库中。

列名 | 数据类型 | 描述
sequence_id | int | 行的插入顺序。
plan_id | uniqueidentifier | 日志传送计划 ID。
source_database | sysname | 日志传送对中的主数据库名称。
destination_ database | sysname | 日志传送对中的辅助数据库名称。
activity | bit | 已执行的操作。 0 = 复制。 1 = 装载。
succeeded | bit | 回滚所有还原后未完成的事务。 0 = FALSE 1 = TRUE
num_files | int | 传送到辅助服务器的事务日志号。
last_file | nvarchar(256) | 执行该操作的上个文件的名称。
end_time | datetime | 完成操作的时间和日期。
duration | int | 完成该操作所用的时间（以秒为单位）。
error_number | int | 操作遇到的上个错误号。
message | nvarchar(500) | 操作遇到的上个错误信息。


log_shipping_plans

该表存储在 msdb 数据库中。

列名 | 数据类型 | 描述
plan_id | uniqueidentifier | 日志传送计划 ID。
plan_name | sysname | 日志传送计划名。
description | nvarchar(500) | 用户提供的日志传送计划描述。
source_server | sysname | 日志传送对中的主服务器。
source_dir | nvarchar(500) | 主服务器上的事务日志源目录。
destination_dir | nvarchar(500) | 辅助服务器上的事务日志目的目录。
copy_job_id | uniqueidentifier | 复制作业 ID。
load_job_id | uniqueidentifier | 装载作业 ID。
history_retention _period | int | 保留此计划的历史记录行的时间长度。
file_retention_ period | int | 保留复制的事务日志文件的时间长度。
maintenance_plan _id | uniqueidentifier | 维护计划 ID。
backup_job_id | uniqueidentifier | 备份作业 ID。
share_name | nvarchar(500) | 共享名。


log_shipping_primaries

该表存储在 msdb 数据库中。

列名 | 数据类型 | 描述
primary_id | int (IDENTITY) | 人造唯一键。
primary_server_ name | sysname | 日志传送对中的主服务器名称。
primary_database name | sysname | 日志传送对中的主数据库名称。
maintenance_plan _id | uniqueidentifier | 维护计划 ID。
backup_threshold | Int | 出错前未进行备份的分钟数。
threshold_alert | int | 停止进行事务日志备份将产生错误。
threshold_alert_ enabled | bit | 阈值警报的状态。 1 = 启用。 0 = 禁用。
last_backup_ filename | nvarchar(500) | 最新事务日志备份的文件名。
last_updated | datetime | 主服务器上次更新 last_backup_filename 列的日期(在监视服务器上)。
planned_outage_ start_time | int | 不产生阈值警报的窗口起始时间（采用 HHMMSS 格式）。
planned_outage_ end_time | int | 不产生阈值警报的窗口结束时间（采用 HHMMSS 格式）。
planned_outage_ weekday_mask | int | 1 = 星期日 2 = 星期一 4 = 星期二 8 = 星期三 16 = 星期四 32 = 星期五 64 = 星期六
source_directory | nvarchar(500) | 源目录。


log_shipping_secondaries

该表存储在 msdb 数据库中。

列名 | 数据类型 | 描述
primary_id | int | log_shipping_primaries 的外键。
secondary_server_name | sysname | 日志传送对中的辅助服务器名称。
secondary_ database_name | sysname | 日志传送对中的辅助数据库名称。
last_copied_ filename | nvarchar(500) | 上次复制到辅助服务器的事务日志的文件名。
last_loaded_ filename | nvarchar(500) | 辅助服务器上次装载的事务日志的文件名。
last_copied_last_ updated | datetime | 上次复制到辅助服务器的事务日志文件的修改时间。
last_loaded_last_ updated | datetime | 辅助服务器上次装载的事务日志文件的修改时间。
secondary_plan_ id | uniqueidentifier | 辅助服务器上的日志传送计划的计划 ID。
copy_enabled | bit | 允许复制事务日志。 0 = 禁用复制。 1 = 启用复制。
load_enabled | bit | 允许装载事务日志。 0 = 启用装载。 1 = 禁用装载。
out_of_sync_ threshold | int | last_loaded_filename 和 last_backup_file 的滞后时间，此后将产生阈值警报。
threshold_alert | int | 如果超出 out_of_sync_threshold，则产生错误。
threshold_alert_ enabled | bit | 阈值警报的状态。 1 = 启用。 0 = 禁用。
planned_outage_ start_time | int | 不产生阈值警报的窗口起始时间（采用 HHMMSS 格式）。
planned_outage_ end_time | int | 不产生阈值警报的窗口结束时间（采用 HHMMSS 格式）。
planned_outage_ weekday_mask | int | 1 = 星期日 2 = 星期一 4 = 星期二 8 = 星期三 16 = 星期四 32 = 星期五 64 = 星期六
allow_role_ change | bit | 1 = 允许更改角色。


logmarkhistory

每个已提交的标记事务占一行。该表存储在 msdb 数据库中。

列名 | 数据类型 | 描述
database_name | nvarchar(128) NOT NULL | 标记事务出现的本地数据库。
mark_name | nvarchar(128) NOT NULL | 用户提供的标记事务名。
description | nvarchar(255) NULL | 用户提供的标记事务描述。
user_name | nvarchar(128) NULL | 执行标记事务的数据库用户名。
lsn | numeric(25,0) NOT NULL | 出现标记的事务记录的日志序列号。
mark_time | datetime NOT NULL | 提交标记事务的时间（本地时间）。


MSagent_parameters

MSagent_parameters 表包含与代理程序配置文件关联的参数。参数名与代理程序所支持的名称相同。该表存储在 msdb 数据库中。

列名 | 数据类型 | 描述
profile_id | int | 来自 Msagent_profiles 表的配置文件 ID。
parameter_name | sysname | 参数的名称。
value | nvarchar(255) | 参数值。


MSagent_profiles

MSagent_profiles 表中每个定义的复制代理程序配置文件占一行。该表存储在 msdb 数据库中。

列名 | 数据类型 | 描述
profile_id | int | 配置文件 ID。
profile_name | sysname | 代理程序类型的唯一配置文件名。
agent_type | int | 代理程序类型： 1 = 快照代理程序 2 = 日志读取器代理程序 3 = 分发代理程序 4 = 合并代理程序 9 = 队列读取器代理程序
type | int | 配置文件的类型： 0 = 系统 1 = 自定义
description | nvarchar(3000) | 对配置的描述。
def_profile | bit | 指定该配置是否为该代理程序类型的默认设置。


MSarticles

MSarticles 表中每个由发布服务器复制的项目占一行。该表存储在分发数据库中。

列名 | 数据类型 | 描述
publisher_id | smallint | 发布服务器的 ID。
publisher_db | sysname | 发布服务器数据库名。
publication_id | int | 发布的 ID。
article | sysname | 项目名。
article_id | int | 项目的 ID。
destination_object | sysname | 在订阅服务器上创建的表名。
source_owner | sysname | 发布服务器中源表的所有者的名称。
source_object | sysname | 从其中添加项目的源对象的名称。
description | nvarchar(255) | 对项目的描述。


MSdistpublishers

MSdistpublishers 表中每个由本地分发服务器支持的远程发布服务器占一行。该表存储在 msdb 数据库中。

列名 | 数据类型 | 描述
name | sysname | 发布服务器的名称。
distribution_db | sysname | 分发数据库的名称。
working_directory | nvarchar(255) | 用于存储发布的数据和架构文件的工作目录名。
security_mode | int | 在分发服务器上实现的安全模式： 0 = SQL Server 身份验证。 1 = Windows 身份验证。
login | sysname | SQL Server 身份验证的登录 ID。
password | nvarchar(524) | SQL Server 身份验证的密码。
active | bit | 表明远程发布服务器是否在使用本地分发服务器。
trusted | bit | 远程发布服务器是否使用与本地分发服务器相同的密码： 0 = 远程发布服务器连接到分发服务器时需要密码。 1 = 不需要密码。
third_party | bit | 发布服务器是否为 Microsoft® SQL Server™ 安装： 0 = SQL Server 安装。 1 = 异类数据源。


MSdistribution_agents

MSdistribution_agents 表中每个在本地分发服务器上运行的分发代理程序占一行。该表存储在分发数据库中。

列名 | 数据类型 | 描述
id | int | 分发代理程序的 ID。
name | nvarchar(100) | 分发代理程序的名称。
publisher_database_id | int | 发布服务器数据库的 ID。
publisher_id | smallint | 发布服务器的 ID。
publisher_db | sysname | 发布服务器数据库名。
publication | sysname | 发布名。
subscriber_id | smallint | 仅由已知代理程序使用的订阅服务器 ID。对于匿名代理程序，此列是保留的。
subscriber_db | sysname | 订阅数据库的名称。
subscription_type | int | 订阅的类型： 0 = 强制 1 = 请求 2 = 匿名
local_job | bit | 表明在本地分发服务器上是否有 SQL Server 代理程序作业。
job_id | binary(16) | 作业标识号。
subscription_guid | binary(16) | 此代理程序的订阅 ID。
profile_id | int | 来自 MSagent_profiles 表的配置 ID。
anonymous_subid | uniqueidentifier | 匿名代理程序的 ID。
subscriber_name | sysname | 仅由匿名代理程序使用的订阅服务器名称。
virtual_agent_id | int | 仅限内部使用。
anonymous_agent_id | int | 仅限内部使用。
creation_date | datetime | 分发或合并代理程序创建时的日期时间。
queue_id | sysname | 定位排队更新订阅队列的标识符。对非排队订阅，该值为 NULL。对基于 Microsoft 消息队列的发布，该值为 GUID，它唯一标识用于订阅的队列。对基于 SQL Server 的队列发布，此列包含值 SQL。
queue_status | int | 仅限内部使用。
offload_enabled | bit | 表示是否可以远程地激活代理程序。0 指定不可以远程地激活代理程序。1 指定可远程激活代理程序，并且是在 offload_server 属性中指定的远程计算机上。
offload_server | sysname | 用于远程代理激活的服务器网络名称。
dts_package_name | sysname | DTS 包的名称。例如，若要指定 DTSPub_Package 包，则该参数将是 @dts_package_name = N'DTSPub_Package'。
dts_package_password | nvarchar(524) | 包上的密码（如果存在）。如果为 NULL，则表示包上没有密码。
dts_package_location | int | 包的位置。包的位置可以是 distributor 或 subscriber。
sid | varbinary(85) | 分发代理程序或合并代理程序第一次执行时的安全标识号 (SID)。


MSdistribution_history

MSdistribution_history 包含与本地分发服务器关联的分发代理程序的历史记录行。该表存储在分发数据库中。

列名 | 数据类型 | 描述
agent_id | int | 分发代理程序的 ID。
runstatus | int | 运行状态： 1 = 开始 2 = 成功 3 = 正在进行 4 = 空闲 5 = 重试 6 = 失败
start_time | datetime | 开始执行作业的时间。
time | datetime | 记录消息的时间。
duration | int | 消息会话的持续时间（以秒为单位）。
comments | nvarchar(255) | 消息文本。
xact_seqno | varbinary(16) | 上次处理的事务序列号。
current_delivery_rate | float | 从最后一个历史记录项后，平均每秒传送的命令数。
current_delivery_latency | int | 从最后一个历史记录项后，命令从进入分发数据库到应用到订阅服务器之间的滞后时间。
delivered_transactions | int | 在会话中传送的事务总数。
delivered_commands | int | 在会话中传送的命令总数。
average_commands | int | 在会话中传送的平均命令数。
delivery_rate | float | 平均每秒传送的命令。
delivery_latency | int | 命令从进入分发数据库到应用到订阅服务器之间的滞后时间。
total_delivered_commands | int | 创建订阅后传送的命令总数。
error_id | int | Msrepl_error 系统表中的错误 ID。
updateable_row | bit | 设置历史记录行是否可被重写。
timestamp | timestamp | 该表的时间戳列。


MSdistributiondbs

Msdistributiondbs 表中每个在本地分发服务器上定义的分发数据库占一行。该表存储在 msdb 数据库中。

列名 | 数据类型 | 描述
name | sysname | 分发数据库的名称。
min_distretention | int | 事务被删除前的最小保持期（以小时为单位）。
max_distretention | int | 事务被删除前的最大保持期（以小时为单位）。
history_retention | int | 保留历史记录的小时数。


MSdistributor

Msdistributor 表包含分发服务器的属性。该表存储在 msdb 数据库中。

列名 | 数据类型 | 描述
property | sysname | 属性的名称
value | nvarchar(3000) | 属性的值


MSdynamicsnapshotjobs

MSdynamicsnapshotjobs 表跟踪应用于动态快照的动态筛选信息。该表存储在发布和订阅数据库中。

列名 | 数据类型 | 描述
id | int | 动态快照作业的 ID。
name | sysname | 动态快照作业的名称。
pubid | uniqueidentifier | 该发布的唯一标识号。
job_id | uniqueidentifier | 分发服务器上的 SQL Server 代理程序作业的 ID。
dynamic_filter_login | sysname | 用来在为发布定义的动态筛选中计算 SUSER_SNAME() 函数的值。
dynamic_filter_hostname | sysname | 用来在为发布定义的动态筛选中计算 HOSTNAME() 函数的值。
dynamic_snapshot_location | nvarchar(255) | 使用动态快照时到要读取的快照文件所在文件夹的路径。


MSdynamicsnapshotviews

MSdynamicsnapshotviews 表跟踪所有由快照代理程序创建的临时动态快照视图，并且由系统用于在 SQL Server 代理程序或快照代理程序出现异常关闭时清除视图。该表存储在发布数据库和订阅数据库中。

列名 | 数据类型 | 描述
dynamic_snapshot_view_name | sysname | 临时动态快照视图的名称。


MSlogreader_agents

MSlogreader_agents 表中每个在本地分发服务器上运行的日志读取器代理程序占一行。该表存储在分发数据库中。

列名 | 数据类型 | 描述
id | int | 日志读取器代理程序的 ID。
name | nvarchar(100) | 日志读取器代理程序的名称。
publisher_id | smallint | 发布服务器的 ID。
publisher_db | sysname | 发布服务器数据库名。
publication | sysname | 发布名。
local_job | bit | 表明在本地分发服务器上是否有 SQL Server 代理程序作业。
job_id | binary(16) | 作业标识号。
profile_id | int | 来自 MSagent_profiles 表的配置 ID。


MSlogreader_history

MSlogreader_history 表包含与本地分发服务器关联的日志读取器代理程序的历史记录行。该表存储在分发数据库中。

列名 | 数据类型 | 描述
agent_id | int | 日志读取器代理程序的 ID。
runstatus | int | 运行状态： 1 = 开始 2 = 成功 3 = 正在进行 4 = 空闲 5 = 重试 6 = 失败
start_time | datetime | 开始执行作业的时间。
time | datetime | 记录消息的时间。
duration | int | 消息会话的持续时间（以秒为单位）。
comments | nvarchar(255) | 消息文本。
xact_seqno | varbinary(16) | 上次处理的事务序列号。
delivery_time | int | 传送第一个事务的时间。
delivered_transactions | int | 在会话中传送的事务总数。
delivered_commands | int | 在会话中传送的命令总数。
average_commands | int | 在会话中传送的平均命令数。
delivery_rate | float | 平均每秒传送的命令。
delivery_latency | int | 命令从进入发布数据库到进入分发数据库之间的滞后时间。
error_id | int | Msrepl_error 系统表中的错误 ID。
timestamp | timestamp | 该表的时间戳列。


MSmerge_agents

MSmerge_agents 表中每个在订阅服务器上运行的合并代理程序占一行。该表存储在分发数据库中。

列名 | 数据类型 | 描述
id | int | 合并代理程序的 ID。
name | nvarchar(100) | 合并代理程序的名称。
publisher_id | smallint | 发布服务器的 ID。
publisher_db | sysname | 发布服务器数据库名。
publication | sysname | 发布名。
subscriber_id | smallint | 订阅服务器的 ID。
subscriber_db | sysname | 订阅数据库的名称。
local_job | bit | 表明在本地分发服务器上是否有 SQL Server 代理程序作业。
job_id | binary(16) | 作业标识号。
profile_id | int | 来自 MSagent_profiles 表的配置 ID。
anonymous_subid | uniqueidentifier | 匿名代理程序的 ID。
subscriber_name | sysname | 订阅服务器名。
creation_date | datetime | 分发或合并代理程序创建的日期和时间。
offload_enabled | bit | 指定可远程激活代理程序。0 指定不可远程激活代理程序。1 指定可远程激活代理程序，并且是在offload_server 属性中指定的远程计算机上。
offload_server | sysname | 指定用于远程代理程序激活的服务器网络名称。
sid | varbinary(85) | 分发代理程序或合并代理程序第一次执行时的安全标识号 (SID)。


MSmerge_altsyncpartners

MSmerge_altsyncpartners 表跟踪发布服务器当前同步伙伴的关联。该表存储在发布数据库和订阅数据库中。

列名 | 数据类型 | 描述
subid | uniqueidentifier | 原始发布服务器的标识符。
alternate_subid | uniqueidentifier | 作为可选同步伙伴的订阅服务器的标识符。
description | nvarchar(255) | 对可选同步伙伴的描述。


MSmerge_contents

MSmerge_contents 表中每个在当前数据库中自发布后被修改的行占一行。合并过程使用下面的表确定已更改的行。该表存储在发布数据库和订阅数据库中。

列名 | 数据类型 | 描述
tablenick | int | 已发布表的别名。
rowguid | uniqueidentifier | 给定行的行标识符。
generation | int | 由 tablenick 和 rowguid 标识的行生成。
partchangegen | int | 与上次数据更改相关联的生成，不论行是否属于已筛选发布，这些更改都应该已经进行。
joinchangegen | int | 与上次此行的数据更改相关联的生成，不论相关行是否属于已筛选发布，这些更改都应该已经进行。
lineage | varbinary(249) | 用于维护此行更改历史记录的订阅服务器别名和版本号对。
colvl | varbinary(2048) | 列版本信息。


MSmerge_delete_conflicts

MSmerge_delete_conflicts 表中包含已删除行的信息，删除这些行是因为它们与更新发生冲突，并且在冲突中失败，或者因为取消删除操作以进行数据汇聚。该表存储在用于进行冲突日志记录的数据库中，通常是发布数据库，但如果冲突日志记录分散，也可以是订阅数据库。

列名 | 数据类型 | 描述
tablenick | int | 表的别名。
rowguid | uniqueidentifier | 删除行的行标识符。
origin_datasource | varchar(255) | 订阅撤消行删除操作或删除操作丢失冲突。
conflict_type | int | 冲突的类型： 1 = UpdateConflict：在行级检测到冲突。 2 = ColumnUpdateConflict：在列级检测到冲突。 3 = UpdateDeleteWinsConflict：删除在冲突中获胜。 4 = UpdateWinsDeleteConflict：在该表中记录在冲突中失败的已删除的 rowguid。 5 = UploadInsertFailed：来自订阅服务器的插入不能用在发布服务器上。 6 = DownloadInsertFailed：来自发布服务器的插入不能用在订阅服务器上。 7 = UploadDeleteFailed：在订阅服务器上的删除不能上载到发布服务器上。 8 = DownloadDeleteFailed：在发布服务器上的删除不能下载到订阅服务器上。 9 = UploadUpdateFailed：在订阅服务器上的更新不能用在发布服务器上 10 = DownloadUpdateFailed：在发布服务器上的更新不能用在订阅服务器上。
reason_code | int | 错误代码。可能是基于上下文敏感的 conflict_type。
reason_text | nvarchar(720) | 错误代码的描述。
pubid | uniqueidentifier | 发布标识符。
create_time | datetime | 记录当前冲突行时的 datetime 值。


MSmerge_errorlineage

MSmerge_errorlineage 表含有已在订阅服务器上删除但该删除还未传播到发布服务器上的行。该表存储在发布数据库和订阅数据库中。

列名 | 数据类型 | 描述
tablenick | int | 指派给为合并复制发布的表的整型值。相当于 sysmergearticles 表中的别名字段。
rowguid | uniqueidentifier | 行标识符。
lineage | varbinary(255) | 存储哪些订阅服务器和发布服务器对行进行过更新的历史列表。用来检测和解决冲突状况。


MSmerge_genhistory

MSmerge_genhistory 表中订阅服务器所知道的每个生成（在保持期内）占一行。用于避免在交换时发送公用生成，并使从备份还原的订阅服务器重新同步。该表存储在发布数据库和订阅数据库中。

列名 | 数据类型 | 描述
guidsrc | uniqueidentifier | 由订阅服务器的生成标识的更改的全局标识符。
guidlocal | uniqueidentifier | 由订阅服务器的生成标识的更改的局部标识符。
pubid | uniqueidentifier | 发布标识符。
generation | int | 生成值。
art_nick | int | 项目的别名。
nicknames | varbinary(1000) | 已悉知具有此生成的其它订阅服务器的别名列表。用来避免将生成发送给已看到那些更改的订阅服务器。别名列表中的别名按顺序排列，以便提高搜索效率。如果别名数目超过此字段的容量，将不会从此优化中获益。
coldate | datetime | 将当前生成添加到表时的日期。


MSmerge_history

MSmerge_history 表包含先前对订阅服务器所做更新的历史记录行。该表存储在分发数据库中。

列名 | 数据类型 | 描述
agent_id | int | 代理程序的 ID。
runstatus | int | 运行状态： 1 = 开始 2 = 成功 3 = 正在进行 4 = 空闲 5 = 重试 6 = 失败
start_time | datetime | 开始执行作业的时间。
time | datetime | 该历史记录项的时间。
duration | int | 此会话的累计时间（以秒为单位）。
comments | nvarchar(255) | 消息文本。
delivery_time | int | 应用一批更改所花费的秒数。
delivery_rate | float | 平均每秒传送的命令。
publisher_insertcount | int | 发布服务器中的插入数。
publisher_updatecount | int | 发布服务器中的更新数。
publisher_deletecount | int | 发布服务器中的删除数。
publisher_conflictcount | int | 发布服务器中的冲突数。
subscriber_insertcount | int | 订阅服务器中的插入数。
subscriber_updatecount | int | 订阅服务器中的更新数。
subscriber_deletecount | int | 订阅服务器中的删除数。
subscriber_conflictcount | int | 订阅服务器中的冲突数。
error_id | int | Msrepl_error 系统表中的错误 ID。
timestamp | timestamp | 该表的时间戳列。
updateable_row | bit | 设置历史记录行是否可被重写。


MSmerge_replinfo

MSmerge_replinfo 表中每个订阅占一行。该表跟踪已发送和已接收的生成的内部信息。该表存储在发布数据库和订阅数据库中。

列名 | 数据类型 | 描述
repid | uniqueidentifier | 复制的唯一 ID。
replnickname | int | 复制的压缩别名。
recgen | int | 上次已接收生成的编号。
recguid | uniqueidentifier | 上次已接收生成的唯一 ID。
sentgen | int | 上次已发送生成的编号。
sentguid | uniqueidentifier | 上次已发送生成的唯一 ID。
schemaversion | int | 上次已接收架构的编号。
schemaguid | uniqueidentifier | 上次已接收架构的唯一 ID。
merge_jobid | binary(16) | 此订阅的合并作业 ID。
snapshot_jobid | binary(16) | 为此发布服务的快照作业 ID。


MSmerge_subscriptions

MSmerge_subscriptions 表中每个由订阅服务器上的合并代理程序提供服务的订阅占一行。该表存储在分发数据库中。

列名 | 数据类型 | 描述
publisher_id | smallint | 发布服务器的 ID。
publisher_db | sysname | 发布服务器数据库名。
publication_id | int | 发布的 ID。
subscriber_id | smallint | 订阅服务器的 ID。
subscriber_db | sysname | 订阅数据库的名称。
subscription_type | int | 订阅的类型： 0 = 强制 1 = 请求 2 = 匿名
sync_type | tinyint | 同步处理的类型： 1 = 自动 2 = 不同步
status | tinyint | 订阅的状态。
subscription_time | datetime | 添加订阅的时间。


MSmerge_tombstone

MSmerge_tombstone 包含有关已删除行的信息并使删除得以传播到其它订阅服务器。该表存储在发布数据库和订阅数据库中。

列名 | 数据类型 | 描述
rowguid | uniqueidentifier | 行标识符。
tablenick | int | 表的别名。
type | tinyint | 删除的类型： 1 = 用户删除 5 = 不再属于筛选分区的行 6 = 系统删除
lineage | varbinary(249) | 表明已删除的记录的版本，以及删除此记录时已知的更新。当一台订阅服务器更新正在其它订阅服务器中删除的行时，允许规则进行一致的冲突解决。
generation | int | 行删除时赋值。如果订阅服务器请求生成 N，则仅发送生成 >= N 的最后信息。
reason | nvarchar(255) | 包含创建最后信息原因的文本字段。


MSpub_identity_range

MSpub_identity_range 表提供标识范围管理支持。该表存储在发布数据库和订阅数据库中。

列名 | 数据类型 | 描述
objid | int | 含有正由复制管理的标识列的表 ID。
range | bigint | 控制将在调整中的订阅服务器上指派的连续标识值的范围大小。
pub_range | bigint | 控制将在调整中的发布服务器上指派的连续标识值的范围大小。
current_pub_range | bigint | 发布使用的当前范围。pub_range 如果在 sp_changearticle 更改后和下一次范围调整前查看，则将不同于 pub_range。
threshold | int | 控制分发代理程序何时指派新标识范围的百分比值。当使用在阈值中指定的百分比值时，分发代理程序创建新的标识范围。
last_seed | bigint | 降低当前范围的边界。


MSpublication_access

MSpublication_access 表中每个能够访问特定发布或发布服务器的 Microsoft® SQL Server™ 登录占一行。该表存储在分发数据库中。

列名 | 数据类型 | 描述
publication_id | int | 发布的 ID
login | sysname | 同时存在于发布服务器和分发服务器端的 Microsoft Windows 帐户


MSpublications

Mspublications 表中每个由发布服务器复制的发布占一行。该表存储在分发数据库中。

列名 | 数据类型 | 描述
publisher_id | smallint | 发布服务器的 ID。
publisher_db | sysname | 发布服务器数据库名。
publication | sysname | 发布名。
publication_id | int | 发布的 ID。
publication_type | int | 发布类型： 0 = 事务 1 = 快照 2 = 合并
thirdparty_flag | bit | 表明某发布是否为 Microsoft® SQL Server™ 数据库： 0 = SQL Server 1 = 除 SQL Server 外的数据源
independent_agent | bit | 表明是否有针对此发布的独立的分发代理程序。
immediate_sync | bit | 表明每次运行快照代理程序时，是否创建或重新创建同步文件。
allow_push | bit | 表明是否可以为给定发布创建强制订阅。
allow_pull | bit | 表明是否可以为给定发布创建请求订阅。
allow_anonymous | bit | 表明是否可以为给定发布创建匿名订阅。
description | nvarchar(255) | 对发布的描述。
vendor_name | nvarchar(100) | 厂商名称（如果发布服务器不是 SQL Server 数据库）。
retention | int | 发布的保持期(以小时为单位)。
sync_method | int | 同步方法： 0 = native（产生所有表的本机模式大容量复制输出） 1 = character（产生所有表的字符模式大容量复制输出） 3 = concurrent（产生所有表的本机模式大容量复制输出，但在快照期间并不锁住表） 4 = concurrent_c（产生所有表的字符模式大容量复制输出，但在快照期间并不锁住表） 事务复制和合并复制可使用 concurrent 和 concurrent_c 值，但快照复制不能。
allow_subscription_copy | bit | 启用或禁用复制订阅此发布的订阅数据库的能力。0 表示禁用复制，1 表示启用复制。
thirdparty_options | int | 指定是否禁止在 SQL Server 企业管理器中复制文件夹中显示发布： 0 = 在 SQL Server 企业管理器中复制文件夹中显示异类发布。 1 = 禁止在 SQL Server 企业管理器中复制文件夹中显示异类发布。
allow_queued_tran | bit | 指定发布是否允许排队更新： 0 = 发布是非排队的 1 = 发布是排队的


MSpublisher_databases

MSpublisher_databases 表中每对由本地分发服务器提供服务的发布服务器/发布服务器数据库占一行。该表存储在分发数据库中。

列名 | 数据类型 | 描述
publisher_id | smallint | 发布服务器的 ID。
publisher_db | sysname | 发布服务器数据库名。
id | int | 行的 ID。


MSqreader_agents

MSqreader_agents 表中每个在本地分发服务器上运行的队列读取器代理程序占一行。该表存储在分发数据库中。

列名 | 数据类型 | 描述
id | int | 队列读取器代理程序的 ID。
name | nvarchar(100) | 队列读取器代理程序的名称。
job_id | binary(16) | 来自 sysjobs 表的唯一作业 ID 号。
profile_id | int | 来自 MSagent_profiles 表的配置文件 ID。


MSqreader_history

MSqreader_history 表包含与本地分发服务器关联的队列读取器代理程序的历史记录行。该表存储在分发数据库中。

列名 | 数据类型 | 描述
agent_id | int | 队列读取器代理程序的 ID。
publication_id | int | 发布的 ID。
runstatus | int | 代理程序的运行状态： 1 = 开始 2 = 成功 3 = 正在进行 4 = 空闲 5 = 重试 6 = 失败
start_time | datetime | 代理程序会话开始的日期和时间。
time | datetime | 最后记录消息的日期和时间。
duration | int | 记录的会话活动用去的时间（以秒为单位）。
comments | nvarchar(255) | 描述性文本。
transaction_id | nvarchar(40) | 存储在邮件中的事务 ID（如果适用）。
transaction_status | int | 事务的状态。
transactions_processed | int | 会话中处理的事务的累计数量。
commands_processed | int | 在会话中处理的累计命令数。
delivery_rate | float(8) | 每秒传送的平均命令数。
transaction_rate | float(8) | 事务处理速率。
subscriber | sysname | 订阅服务器名。
subscriberdb | sysname | 订阅数据库的名称。
error_id | int | 如果不为零，则该数字代表 Microsoft SQL Server 错误信息。
timestamp | timestamp | 该表的时间戳列。


MSrepl_backup_lsns

MSrepl_backup_lsns 表包含支持分发数据库"sync with backup"选项的事务日志序列号 (lsn)。该表存储在分发数据库中。

列名 | 数据类型 | 描述
publisher_database_id | int | 发布服务器数据库的 ID。
valid_xact_id | varbinary(16) | 发送到发布服务器以用于标记日志截断点的事务 ID。仅当分发数据库处于"sync with backup"模式时使用。包括已备份分发数据库中最新重复事务的 ID。将它送往发布服务器用以使日志读取器标记日志截断点。
valid_xact_seqno | varbinary(16) | 送往发布服务器用以标记日志截断点的事务序列号。仅当分发数据库处于"sync with backup"模式时使用。它是已备份分发数据库中最新的重复事务的日志序列号。将它送到分发服务器以标记日志读取器所做的截断点。
next_xact_id | varbinary(16) | 备份操作使用的临时日志序列号。
nextx_xact_seqno | varbinary(16) | 备份操作使用的临时日志序列号。


MSrepl_commands

MSrepl_commands 表包含重复命令行。该表存储在分发数据库中。

列名 | 数据类型 | 描述
publisher_database_id | int | 发布服务器数据库的 ID。
xact_seqno | varbinary(16) | 事务序列号。
type | int | 命令类型。
article_id | int | 项目的 ID。
originator_id | int | 创建人的ID。
command_id | int | 命令的 ID。
partial_command | bit | 表明是否是部分命令。
command | varbinary(1024) | 命令值。


MSrepl_errors

MSrepl_errors 表包含有扩展分发代理程序和合并代理程序失败信息的行。该表存储在分发数据库中。

列名 | 数据类型 | 描述
id | int | 错误 ID。
time | datetime | 出现错误的时间。
error_type_id | int | 留作以后使用。
source_type_id | int | 错误源类型 ID。
source_name | nvarchar(100) | 错误源名称。
error_code | sysname | 错误代码。
error_text | ntext | 错误信息。
xact_seqno | varbinary(16) | 失败的执行批处理的起始事务日志序列号。仅由分发代理程序使用，是失败的执行批处理中第一个事务的事务日志序列号。
command_id | int | 失败的执行批处理的命令 ID。仅由分发代理程序使用，是失败的执行批处理中的第一个命令的命令 ID。


MSrepl_identity_range

MSrepl_identity_range 表提供标识范围管理支持。该表存储在发布、分发和订阅数据库中。

列名 | 数据类型 | 描述
publisher | sysname | 发布服务器名。
publisher_db | sysname | 发布数据库的名称。
tablename | sysname | 表的名称。
identity_support | int | 指定是否启用自动标识范围处理。0 指定没有启用自动标识范围处理。
next_seed | bigint | 如果自动标识范围启用，则表明下一个范围的起始点。
pub_range | bigint | 发布服务器标识范围大小。
range | bigint | 将指派到调整中的订阅服务器的连续标识值的大小。
max_identity | bigint | 标识范围的最大边界。
threshold | int | 标识范围阈值百分比。
current_max | bigint | 可以指派但不是必须要指派的当前最大值。


MSrepl_originators

MSrepl_originators 表中每个事务发起的可更新订阅服务器占一行。该表存储在分发数据库中。

列名 | 数据类型 | 描述
id | int | 更新订阅服务器的 ID。
publisher_database_id | int | 发布服务器数据库的 ID。
srvname | sysname | 更新服务器的名称。
dbname | sysname | 更新数据库的名称。


MSrepl_transactions

MSrepl_transactions 表中每个重复事务占一行。该表存储在分发数据库中。

列名 | 数据类型 | 描述
publisher_database_id | int | 发布服务器数据库的 ID。
xact_id | varbinary(16) | 事务的 ID。
xact_seqno | varbinary(16) | 事务的序列号。
entry_time | datetime | 事务进入分发数据库的时间。


MSrepl_version

MSrepl_version 表中已安装复制的当前版本占一行。该表存储在分发数据库中。

列名 | 数据类型 | 描述
major_version | int | 分发数据库的主版本号。
minor_version | int | 分发数据库的次版本号。
revision | int | 修订号。
db_existed | bit | 表明调用 sp_adddistributiondb 之前分发数据库是否存在。


MSreplication_objects

MSreplication_objects 表中每个与订阅服务器数据库内的复制关联的对象占一行。该表存储在订阅数据库中。

列名 | 数据类型 | 描述
publisher | sysname | 发布服务器名。
publisher_db | sysname | 发布服务器数据库名。
publication | sysname | 发布名。
object_name | sysname | 对象的名称。
object_type | char(2) | 对象类型： u = 表 t = 触发器


MSreplication_options

MSreplication_options 表存储已安装复制的类型。该表存储在 master 数据库中。

列名 | 数据类型 | 描述
optname | sysname | 复制类型。值为 transactional 和 merge。
value | bit | 内部状态信息。
major_version | int | 留作以后使用。
minor_version | int | 留作以后使用。
revision | int | 留作以后使用。
install_failures | int | 留作以后使用。


MSreplication_queue

MSreplication_queue 表由复制进程使用以存储由使用基于 SQL 排队的所有排队更新订阅发出的排队命令。. 该表存储在订阅服务器数据库中。

列名 | 数据类型 | 描述
publisher | sysname | 发布服务器名。
publisher_db | sysname | 发布数据库的名称。
publication | sysname | 发布名。
tranid | sysname | 执行排队命令的事务 ID。
data | varbinary(8000) | 存储有关排队命令信息的压缩字节流。
datalen | int | 数据的长度（以字节为单位）。
commandtype | int | 排队的命令类型包括： 1 = 事务中的用户命令 2 = 订阅同步命令。
insertdate | datetime | 插入日期。
orderkey | bigint | 单调增加的标识列。
cmdstate | bit | 命令状态： 0 = 完成 1 = 部分


MSreplication_subscriptions

MSreplication_subscriptions 表中为本地订阅服务器数据库服务的每个分发代理程序的复制信息占一行。该表存储在订阅数据库中。

列名 | 数据类型 | 描述
publisher | sysname | 发布服务器名。
publisher_db | sysname | 发布服务器数据库名。
publication | sysname | 发布名。
independent_agent | bit | 表明是否有针对此发布的独立的分发代理程序。
subscription_type | int | 订阅的类型： 0 = 强制 1 = 请求 2 = 匿名
distribution_agent | sysname | 分发代理程序的名称。
time | smalldatetime | 分发代理程序上次更新的时间。
description | nvarchar(255) | 对订阅的描述。
transaction_timestamp | varbinary(16) | 同步事务。
update_mode | tinyint | 更新的类型。
agent_id | binary(16) | 代理程序的 ID。
subscription_guid | binary(16) | 发布上订阅版本的全局标识符。
subid | binary(16) | 匿名订阅的全局标识符。
immediate_sync | bit | 表明每次运行快照代理程序时，是否创建或重新创建同步文件。


MSsnapshot_agents

MSsnapshot_agents 表中每个与本地分发服务器关联的快照代理程序占一行。该表存储在分发数据库中。

列名 | 数据类型 | 描述
id | int | 快照代理程序的 ID。
name | nvarchar(100) | 快照代理程序的名称。
publisher_id | smallint | 发布服务器的 ID。
publisher_db | sysname | 发布服务器数据库名。
publication | sysname | 发布名。
publication_type | int | 发布类型： 0 = 事务 1 = 快照 2 = 合并
local_job | bit | 表明在本地分发服务器上是否有 SQL Server 代理程序作业。
job_id | binary(16) | 作业标识号。
profile_id | int | 来自 MSagent_profiles 表的配置 ID。


MSsnapshot_history

MSsnapshot_history 表包含与本地分发服务器关联的快照代理程序的历史记录行。该表存储在分发数据库中。

列名 | 数据类型 | 描述
agent_id | int | 快照代理程序的 ID。
runstatus | int | 运行状态： 1 = 开始 2 = 成功 3 = 正在进行 4 = 空闲 5 = 重试 6 = 失败
start_time | datetime | 开始执行作业的时间。
time | datetime | 记录消息的时间。
duration | int | 消息会话的持续时间（以秒为单位）。
comments | nvarchar(255) | 消息文本。
delivered_transactions | int | 在会话中传送的事务总数。
delivered_commands | int | 每秒传送的命令数。
delivery_rate | float | 平均每秒传送的命令。
error_id | int | Msrepl_error 系统表中的错误 ID。
timestamp | timestamp | 该表的时间戳列。


MSsub_identity_range

MSsub_identity_range 表为订阅提供标识范围管理支持。该表存储在订阅数据库中。

列名 | 数据类型 | 描述
objid | int | 含有正由复制管理的标识列的表的 ID。
range | bigint | 控制将在调整中的订阅服务器上指派的连续标识值的范围大小。
last_seed | bigint | 降低当前范围的边界。
threshold | int | 控制分发代理程序何时指派新标识范围的百分比值。当使用在阈值中指定的百分比值时，分发代理程序创建新的标识范围。


MSsubscriber_info

MSsubscriber_info 表中每对从本地分发服务器强制订阅的发布服务器/订阅服务器占一行。该表存储在分发数据库中。

列名 | 数据类型 | 描述
publisher | sysname | 发布服务器名。
subscriber | sysname | 订阅服务器名。
type | tinyint | 订阅服务器类型： 0 = Microsoft® SQL Server™ 订阅服务器 1 = ODBC 数据源
login | sysname | SQL Server 身份验证的登录。如果以 SQL Server 身份验证模式添加订阅服务器，则该登录以加密格式存储。
password | nvarchar(524) | SQL Server 身份验证的密码。如果以 SQL Server 身份验证模式添加订阅服务器，则该密码以加密格式存储。
description | nvarchar(255) | 对订阅服务器的描述。
security_mode | int | 实现的安全模式： 0 = SQL Server 身份验证 1 = Windows 身份验证


MSsubscriber_schedule

MSsubscriber_schedule 表包含每对发布服务器/订阅服务器的默认合并和事务同步调度。该表存储在分发数据库中。

列名 | 数据类型 | 描述
publisher | sysname | 发布服务器名。
subscriber | sysname | 订阅服务器名。
agent_type | smallint | 代理程序类型： 0 = 分发代理程序 1 = 合并代理程序
frequency_type | int | 调度分发代理程序的频率： 1 = 一次 2 = 按需 4 = 每日 8 = 每周 16 = 每月 32 = 每月相对信息 64 = 自动启用（默认） 124 = 反复出现
frequency_interval | int | 由 frequency_type 设置的频率值。
frequency_relative_interval | int | 分发代理程序的日期： 1 = 第一次（默认） 2 = 第二次 4 = 第三次 8 = 第四次 16 = 最后一次
frequency_recurrence_factor | int | frequency_type 使用的重复发生因子。
frequency_subday | int | 在定义的周期内的重新调度频率： 1 = 一次 2 = 秒 4 = 分钟（默认） 8 = 小时
frequency_subday_interval | int | frequency_subday 的间隔。
active_start_time_of_day | int | 一天中首次调度分发代理程序的时间，格式为 HHMMSS。
active_end_time_of_day | int | 一天中停止调度分发代理程序的时间，格式为 HHMMSS。
active_start_date | int | 首次调度分发代理程序的日期，格式为 YYYYMMDD。
active_end_date | int | 停止调度分发代理程序的日期，格式为 YYYYMMDD。


MSsubscription_agents

MSsubscription_agents 表由分发代理程序和可更新订阅服务器的触发器用于跟踪订阅服务器属性。该表存储在订阅服务器数据库中。

列名 | 数据类型 | 描述
id | int | 行的 ID。
publisher | sysname | 发布服务器名。
publisher_db | sysname | 发布数据库的名称。
publication | sysname | 发布名。
subscription_type | int | 订阅类型。 0 = 强制 1 = 请求 2 = 请求匿名
queue_id | sysname | 发布服务器上的 Microsoft 消息队列 ID。对基于 SQL 的排队更新，queue_id 被设置为 SQL。
update_mode | tinyint | 更新类型： 0 = 只读 1 = 即时更新 2 = 用 MSMQ 队列的排队更新 3 = 使用 MSMQ 队列并以排队更新作为故障转移的即时更新 4 =使用 SQL Server 队列的排队更新 5 = 使用 SQL Server 队列并以排队更新作为故障转移的即时更新
failover_mode | bit | 如果选定更新的故障转移类型，可供选择的故障转移类型有： 0 = 正使用即时更新。不启用故障转移。 1 = 正使用排队更新。启用故障转移。在 update_mode 值中指定用于故障转移的队列。
spid | int | 当前正在运行或刚运行过的分发代理程序使用的连接的系统进程 ID。
login_time | datetime | 当前正在运行或刚运行过的分发代理程序连接的日期和时间。
allow_subscription_copy | bit | 指定是否允许使用复制订阅数据库的能力。
attach_state | int | 仅限内部使用。
attach_version | binary(16) | 表示附加订阅版本的唯一的标识符。
last_sync_status | int | 当前正在运行或刚运行过的分发代理程序的最后运行状态。状态可以是： 1 = 已开始 2 = 已成功 3 = 进行中 4 = 空闲 5 = 重试 6 = 失败
last_sync_summary | sysname | 当前正在运行或刚运行过的分发代理程序的上一条消息。状态可以是： 已开始 已成功 进行中 空闲 重试 失败
last_sync_time | datetime | last_sync_summary 和 last_sync_status 列更新时的日期时间。作为 SqlServer 代理程序服务作业运行的请求或匿名分发代理程序将不更新这些列。在这种情况下将历史记录信息记录到作业历史表中。


MSsubscription_articles

MSsubscription_articles 表包含关于排队订阅中项目的信息。只为排队更新和以排队更新为故障转移的即时更新复制类型填充该表。

列名 | 数据类型 | 描述
agent_id | int | 为该项目服务的代理程序 ID。
artid | int | 来自 sysarticles 表的Article ID。
article | sysname | 来自 sysarticles 表的项目名。
dest_table | sysname | 来自 sysarticles 表的目的表名称。
owner | sysname | 订阅的所有者。
cft_table | sysname | 该项目的冲突表名称（用于排队更新复制类型）。
columns | binary(32) | 来自 sysarticles 表的发布表的复制列位图。


MSsubscription_properties

MSsubscription_properties 表包含请求分发代理程序的参数信息行。该表存储在订阅数据库中。

列名 | 数据类型 | 描述
publisher | sysname | 发布服务器名。
publisher_db | sysname | 发布服务器数据库名。
publication | sysname | 发布名。
publication_type | int | 发布类型： 0 = 事务 2 = 合并
publisher_login | sysname | 在发布服务器上用于 SQL Server 身份验证的登录 ID。
publisher_password | sysname | 在发布服务器上使用的 SQL Server 身份验证密码（加密）。
publisher_security_mode | int | 在发布服务器上实施的安全模式： 0 = SQL Server 身份验证 1 = Windows 身份验证 2 = 同步触发器使用静态 sysservers 项处理 RPC，并且 publisher 必须在 sysservers 表中定义为远程服务器或链接服务器。
distributor | sysname | 分发服务器的名称。
distributor_login | sysname | 在发布服务器上使用的 SQL Server 身份验证登录 ID。
distributor_password | sysname | 在发布服务器上使用的 SQL Server 身份验证密码（加密）。
distributor_security_mode | int | 在分发服务器上实现的安全模式： 0 = SQL Server 身份验证 1 = Windows 身份验证
ftp_address | sysname | 分发服务器的 FTP 服务网络地址。
ftp_port | int | 分发服务器的 FTP 服务端口号。
ftp_login | sysname | 用于连接到 FTP 服务的用户名。
ftp_password | sysname | 用于连接到 FTP 服务的用户密码。
alt_snapshot_folder | nvarchar(255) | 指定快照的备用文件夹的位置。
working_directory | nvarchar(255) | 用于存储数据和架构文件的工作目录名。
use_ftp | bit | 指定使用 FTP 而非常规协议来检索快照。如果值为 1，则使用 FTP。
dts_package_name | sysname | 指定 DTS 包的名称。
dts_package_password | nvarchar(524) | 指定包上的密码（如果存在）。NULL 值表示该包没有密码。
dts_package_location | int | DTS 包存储的位置。
enabled_for_syncmgr | bit | 指定能否通过 Microsoft 同步管理器同步订阅。如果是 0，则表示该订阅没有在同步管理器中注册。如果是 1，则表示该订阅在同步管理器中注册，可以在不启动 SQL Server 企业管理器的情况下进行同步处理。
offload_agent | bit | 指定是否可远程激活代理程序。如果是 0，表示不能远程激活代理程序。
offload_server | sysname | 指定用于远程激活的服务器的网络名称。
dynamic_snapshot_location | nvarchar(255) | 指定到保存快照文件的文件夹路径。


MSsubscriptions

Mssubscriptions 表中每个由本地分发服务器提供服务的订阅占一行。该表存储在分发数据库中。

列名 | 数据类型 | 描述
publisher_database_id | int | 发布服务器数据库的 ID。
publisher_id | smallint | 发布服务器的 ID。
publisher_db | sysname | 发布服务器数据库名。
publication_id | int | 发布的 ID。
article_id | int | 项目的 ID。
subscriber_id | smallint | 订阅服务器的 ID。
subscriber_db | sysname | 订阅数据库的名称。
subscription_type | int | 订阅的类型： 0 = 强制 1 = 请求 2 = 匿名
sync_type | tinyint | 同步处理的类型： 1 = 自动 2 = 不同步
status | tinyint | 订阅的状态： 0 = 非活动 1 = 已订阅 2 = 活动
subscription_seqno | varbinary(16) | 快照事务序列号。
snapshot_seqno_flag | bit | 1 = subscription_seqno 是快照序列号。
independent_agent | bit | 表明是否有针对此发布的独立的分发代理程序。
subscription_time | datetime | --
loopback_detection | bit | 分发代理程序是否将在订阅服务器发起的事务发回订阅服务器： 1 = 不发送回。 0 = 发送回。
agent_id | int | 代理程序的 ID。
update_mode | tinyint | 更新的类型。
publisher_seqno | varbinary(16) | 此订阅在发布服务器上的事务序列号。
ss_cplt_seqno | varbinary(16) | 用于表示并发快照处理完成的序列号。


MSsync_states

MSsync_states 表跟踪仍处于并发快照模式的发布。该表存储在分发数据库中。

列名 | 数据类型 | 描述
publisher_id | smallint | 发布服务器的 ID。
publisher_db | sysname | 发布数据库的名称。
publication_id | int | 发布的 ID。


restorefile

restorefile 表中每个已还原的文件（包括按文件组名间接还原的文件）占一行。该表存储在 msdb 数据库中。

列名 | 数据类型 | 描述
restore_history_id | int NOT NULL REFERENCES restorehistory(restore_history_id) | 标识相应还原操作的唯一标识号。
file_number | numeric(10,0) NULL | 已还原文件的文件标识号。每个数据库中此标识号必须唯一。
destination_phys_drive | varchar(260) NULL | 将文件还原到的驱动器或分区。
destination_phys_name | varchar(260) NULL | 文件名，其中不含将文件还原到的驱动器或分区信息。


restorefilegroup

restorefilegroup 表中每个已还原的文件组占一行。该表存储在 msdb 数据库中。

列名 | 数据类型 | 描述
restore_history_id | int NOT NULL REFERENCES restorehistory(restore_history_id) | 标识相应还原操作的唯一标识号
filegroup_name | nvarchar(128) NULL | 所还原文件组的名称


restorehistory

restorehistory 表中每个还原操作占一行。该表存储在 msdb 数据库中。

列名 | 数据类型 | 描述
restore_history_id | int NOT NULL IDENTITY PRIMARY KEY | 标识每个还原操作的唯一标识号。
restore_date | datetime NULL | 还原操作的日期和时间。
destination_database_name | nvarchar(128) NULL | 还原操作目的数据库的名称。
user_name | nvarchar(128) NULL | 执行还原操作用户的名称。
backup_set_id | int NOT NULL REFERENCES backupset(backup_set_id) | 标识被还原备份集的唯一标识号。
restore_type | char(1) NULL | 还原操作类型： D = 数据库 F = 文件 G = 文件组 L = 日志 V = 仅验证
replace | bit NULL | 表明还原操作是否指定 REPLACE 选项： 1 = 指定 0 = 未指定
recovery | bit NULL | 表明还原操作是指定 RECOVERY 还是指定 NORECOVERY 选项： 1 = RECOVERY 0 = NORECOVERY
重新启动 | bit NULL | 表明还原操作是否指定 RESTART 选项： 1 = 指定 0 = 未指定
stop_at | datetime NULL | 数据库要还原到的时间点。
device_count | tinyint NULL | 还原操作涉及的设备数。此数目可以小于备份使用的媒体家族数。
stop_at_mark_name | nvarchar(128) NULL | 表示恢复到包含命名标记的事务。
stop_before | bit NULL | 表示包含命名标记的事务是否包括在恢复中： 0 = 恢复在标记事务前停止。 1 = 恢复包括标记事务。


sysalerts

每个警报在表中占一行。警报是为响应事件而发送的消息。警报可向 Microsoft® SQL Server™ 环境之外转发消息，警报可以是电子邮件或呼叫程序消息。警报还可以生成任务。

列名 | 数据类型 | 描述
id | int | 警报 ID。
name | sysname | 警报名称。
event_source | nvarchar(100) | 事件源：SQL Server。
event_category_id | int | 留作以后使用。
event_id | int | 留作以后使用。
message_id | int | 用户定义的消息 ID 或对触发该警报的 sysmessages 消息的引用。
severity | int | 触发该警报的严重度。
enabled | tinyint | 警报的状态： 0 = 禁用。 1 = 启用。
delay_between_ responses | int | 该警报提示之间的等待周期（以秒为单位）。
last_occurrence_date | int | 警报的上次发生（日期）。
last_occurrence_time | int | 警报的上次发生（时间）。
last_response_date | int | 警报的上次提示（日期）。
last_response_time | int | 警报的上次提示（时间）。
notification_message | nvarchar(512) | 与警报一起发送的附加信息。
include_event_ description | tinyint | 表示是通过以下任一方式还是全部方式发送事件描述的位掩码： 1 = 电子邮件。 2 = 呼叫程序。
database_name | sysname | 该警报必须在其中发生才能触发该警报的数据库。
event_description_keyword | nvarchar(100) | 为触发警报所必须匹配的错误模式。
occurrence_count | int | 该警报的发生计数。
count_reset_date | int | 天（日期）计数将重置为 0。
count_reset_time | int | 时间计数将重置为 0。
job_id | uniqueidentifier | 该警报发生时所执行任务的 ID。
has_notification | int | 警报发生时接收电子邮件提示的操作员人数。
flags | int | 保留。
performance_condition | nvarchar(512) | 保留。
category_id | int | 保留。


sysaltfiles

在特殊情况下，包含与数据库中的文件相对应的行。该表存储在 master 数据库中。

列名 | 数据类型 | 描述
fileid | smallint | 每个数据库的唯一文件标识号。
groupid | smallint | 文件组标识号。
size | int | 文件大小（以 8 KB 页为单位）。
maxsize | int | 最大文件大小（以 8 KB 页为单位）。0 值表示不增长，–1 值表示文件应一直增长到磁盘已满。
growth | int | 数据库的增长大小。0 值表示不增长。根据状态的值，可以是页数或文件大小的百分比。如果 status 为 0x100000，则 growth 是文件大小的百分比；否则是页数。
status | int | 仅限内部使用。
perf | int | 保留。
dbid | smallint | 该文件所属数据库的数据库标识号。
name | nchar(128) | 文件的逻辑名称。
filename | nchar(260) | 物理设备的名称，包括文件的完整路径。


sysarticles

本地数据库中定义的每个项目在表中占一行。该表存储在发布的数据库中。

列名 | 数据类型 | 描述
artid | int | 为项目提供唯一 ID 号的标识列。
columns | varbinary(32) | 正在发布的表中的列。
creation_script | nvarchar(255) | 项目的架构脚本。
del_cmd | nvarchar(255) | 在 DELETE 上执行的命令；否则从日志构造。
description | nvarchar(255) | 项目的描述项。
dest_table | sysname | 目的表的名称。
filter | int | 存储过程 ID，用于水平分区。
filter_clause | ntext | 项目的 WHERE 子句，用于水平筛选。
ins_cmd | nvarchar(255) | 在 INSERT 上执行的命令；否则从日志构造。
name | sysname | 与项目关联的名称，在发布内是唯一的。
objid | int | 已发布的表对象 ID。
pubid | int | 项目所属发布的 ID。
pre_creation_cmd | tinyint | DROP TABLE、DELETE TABLE 或 TRUNCATE 的预创建命令： 0 = None。 1 = DROP。 2 = DELETE。 3 = TRUNCATE。
status | tinyint | article 选项的位掩码。status 是 tinyint，可以是下列值之一： 0 = 没有附加属性。 8 = 在 INSERT 语句中包含列名。 16（默认值）= 使用参数化语句。 24 = 既在 INSERT 语句中包含列名，又使用参数化语句。
sync_objid | int | 表示项目定义的表或视图的 ID。
type | tinyint | 项目的类型： 1 = 基于日志的项目。 3 = 带手工筛选的基于日志的项目。 5 = 带手工视图的基于日志的项目。 7 = 带手工筛选和手工视图的基于日志的项目。
upd_cmd | nvarchar(255) | 在 UPDATE 上执行的命令；否则从日志构造。
schema_option | binary(8) | 表示将写入脚本的内容。
dest_owner | sysname | 该表在目的数据库中的所有者。


sysarticleupdates

每个支持即时更新订阅的项目在表中占一行。该表存储在复制的数据库中。

列名 | 数据类型 | 描述
artid | int | 为项目提供唯一 ID 号的标识列。
pubid | int | 项目所属发布的 ID。
sync_ins_proc | int | 处理插入同步事务的存储过程 ID。
sync_upd_proc | int | 处理更新同步事务的存储过程 ID。
sync_del_proc | int | 处理删除同步事务的存储过程 ID。
autogen | bit | 表示自动生成存储过程： 0 = False，不自动。 1 = True，自动。
sync_upd_trig | int | 项目表上自动版本控制触发器的 ID。
conflict_tableid | int | 冲突表的 ID。
ins_conflict_proc | int | 用于将冲突写入 conflict_table 的过程 ID。
identity_support | bit | 指定使用排队更新时是否启用禁用自动标识范围处理。0 表示不支持标识范围。


syscacheobjects

包含有关如何使用高速缓存的信息。syscacheobjects 属于 master 数据库。下表显示高速缓存查找键。

列名 | 数据类型 | 描述
bucketid | int | 存储桶 ID 值表示的范围从 0 到（目录大小 - 1）。目录大小为哈希表的大小。
cacheobjtype | nvarchar(34) | 高速缓存中的对象类型： 已编译计划 可执行计划 分析树 游标分析树 扩展存储过程
objtype | nvarchar(16) | 对象的类型： 存储过程 准备语句 特殊查询（从 isql 或 osql 作为语言事件提交的 Transact SQL，与远程过程调用相对） ReplProc（复制过程） 触发器 视图 默认值 用户表 系统表 检查 规则
objid | int | 用于在高速缓存中查找对象的主要关键字之一。这是存储在 sysobjects 中的数据库对象（过程、视图、触发器等）的对象 ID。对于高速缓存对象（如特殊或准备 SQL），objid 为内部生成的值。
dbid | smallint | 在其中编译高速缓存对象的数据库 ID。
uid | smallint | 表示特殊查询计划和准备计划的编写者。-2 表示提交的批处理不依赖于隐性名称解析并能在不同的用户间共享。这是首选方法。任何其它值表示数据库中提交查询的用户 ID。
refcounts | int | 引用该高速缓存对象的其它高速缓存对象数。计数 1 为基数。
usecounts | int | 自开始以来使用该高速缓存对象的次数。
pagesused | int | 高速缓存对象消耗的内存页数。
setopts | int | 影响编译计划的 SET 选项设置。这些是高速缓存关键字的一部分。更改该列中的值表示用户已修改 SET 选项。这些选项包括： ANSI_PADDING FORCEPLAN CONCAT_NULL_YIELDS_NULL ANSI_WARNINGS ANSI_NULLS QUOTED_IDENTIFIER ANSI_NULL_DFLT_ON ANSI_NULL_DFLT_OFF
langid | smallint | 语言 ID。创建高速缓存对象的连接语言 ID。
dateformat | smallint | 创建高速缓存对象的连接日期格式。
status | int | 表示高速缓存对象是否是游标计划。目前只使用最小的有效位。
sqlbytes | int | 名称长度或提交的批处理长度。如果前 128 个字符相同，可用于区分两个名称或提交的批处理。
sql | nvarchar(256) | 过程名称或提交批处理的前 128 个字符。


syscategories

包含由 SQL Server 企业管理器用来组织作业、警报和操作员的分类。该表存储在 msdb 数据库中。

列名 | 数据类型 | 描述
category_id | int | 分类的 ID
category_class | int | 分类中的项目类型： 1 = 作业 2 = 警报 3 = 操作员
category_type | tinyint | 分类的类型： 1 = 本地 2 = 多服务器 3 = 无
name | sysname | 分类的名称


syscharsets

每个字符集在表中各占一行，表中还包含定义供 Microsoft® SQL Server™ 使用的排序次序。排序次序中的一个在 sysconfigures 中标记为默认排序次序，该次序是实际使用的唯一次序。

列名 | 数据类型 | 描述
type | smallint | 该行表示的实体类型。1001 是字符集；2001 是排序次序。
id | tinyint | 字符集或排序次序的唯一 ID。注意排序次序和字符集不能共享相同的 ID 号。保留从 1 到 240 的 ID 范围供 SQL Server 使用。
csid | tinyint | 如果该行表示字符集，则不使用该字段。如果该行表示排序次序，则该字段是在其上生成排序次序的字符集 ID。假设具有该 ID 的字符集行存在于该表中。
status | smallint | 内部系统状态信息位。
name | sysname | 字符集或排序次序的唯一名称。该字段必须只包含字母 A-Z 或 a-z、数字 0 – 9 和下划线 (_)。必须以字母开头。
description | nvarchar(255) | 字符集或排序次序功能的可选描述。
binarydefinition | varbinary(255) | 仅限内部使用。
definition | image | 字符集或排序次序的内部定义。该字段中的数据结构取决于类型。


syscolumns

每个表和视图中的每列在表中占一行，存储过程中的每个参数在表中也占一行。该表位于每个数据库中。

列名 | 数据类型 | 描述
name | sysname | 列名或过程参数的名称。
id | int | 该列所属的表对象 ID，或与该参数关联的存储过程 ID。
xtype | tinyint | systypes 中的物理存储类型。
typestat | tinyint | 仅限内部使用。
xusertype | smallint | 扩展的用户定义数据类型 ID。
length | smallint | systypes 中的最大物理存储长度。
xprec | tinyint | 仅限内部使用。
xscale | tinyint | 仅限内部使用。
colid | smallint | 列或参数 ID。
xoffset | smallint | 仅限内部使用。
bitpos | tinyint | 仅限内部使用。
reserved | tinyint | 仅限内部使用。
colstat | smallint | 仅限内部使用。
cdefault | int | 该列的默认值 ID。
domain | int | 该列的规则或 CHECK 约束 ID。
number | smallint | 过程分组时（0 表示非过程项）的子过程号。
colorder | smallint | 仅限内部使用。
autoval | varbinary(255) | 仅限内部使用。
offset | smallint | 该列所在行的偏移量；如果为负，表示可变长度行。
status | tinyint | 用于描述列或参数属性的位图： 0x08 = 列允许空值。 0x10 = 当添加 varchar 或 varbinary 列时，ANSI 填充生效。保留 varchar 列的尾随空格，保留 varbinary 列的尾随零。 0x40 = 参数为 OUTPUT 参数。 0x80 = 列为标识列。
type | tinyint | systypes 中的物理存储类型。
usertype | smallint | systypes 中的用户定义数据类型 ID。
printfmt | varchar(255) | 仅限内部使用。
prec | smallint | 该列的精度级别。
scale | int | 该列的小数位数。
iscomputed | int | 表示是否已计算该列的标志： 0 = 未计算。 1 = 已计算。
isoutparam | int | 表示该过程参数是否是输出参数： 1 = 真。 0 = 假。
isnullable | int | 表示该列是否允许空值： 1 = 真。 0 = 假。


syscomments

包含每个视图、规则、默认值、触发器、CHECK 约束、DEFAULT 约束和存储过程的项。text 列包含原始 SQL 定义语句，其最大大小限制为 4 MB。该表存储在每个数据库中。

重要 不应删除 syscomments 中的项。如果手工删除或修改 syscomments 中的项，则对应的存储过程将不能正常工作。若要隐藏或加密存储过程定义，请使用含有 ENCRYPTION 关键字的 CREATE PROCEDURE。

列名 | 数据类型 | 描述
id | int | 该文本适用的对象 ID。
number | smallint | 如果进行分组，则为过程分组内的号码。0 表示不是过程的项。
colid | smallint | 超过 4,000 个字符的对象定义的行序列号。
status | smallint | 仅限内部使用。
ctext | varbinary(8000) | SQL 定义语句的实际文本。
texttype | smallint | 0 = 用户提供的注释。 1 = 系统提供的注释。 4 = 加密的注释。
language | smallint | 仅限内部使用。
encrypted | bit | 表示过程是否已加密。 0 = 未加密。 1 = 已加密。
compressed | bit | 表示过程是否已压缩。 0 = 未压缩 1 = 已压缩
text | nvarchar(4000) | SQL 定义语句的实际文本。


sysconfigures

用户设置的每个配置选项在表中各占一行。sysconfigures 包含最近启动 Microsoft® SQL Server™ 前定义的配置选项，还包含最近启动后设置的所有动态配置选项。该表只位于 master 数据库中。

列名 | 数据类型 | 描述
value | int | 变量的用户可修改值（仅在已执行 RECONFIGURE 后由 SQL Server 使用）。
config | smallint | 配置变量号。
comment | nvarchar(255) | 对配置选项的解释。
status | smallint | 表示选项状态的位图。可能的值包括： 0 = 静态（该设置在服务器重新启动时生效）。 1 = 动态（该变量在 RECONFIGURE 语句执行时生效）。 2 = 高级（仅当设置了显示高级选项时才显示该变量）。 3 = 动态和高级。


sysconstraints

包含约束映射，映射到拥有该约束的对象。该系统目录存储在每个数据库中。

列名 | 数据类型 | 描述
constid | int | 约束号。
id | int | 拥有该约束的表 ID。
colid | smallint | 在其上定义约束的列 ID，如果是表约束则为 0。
spare1 | tinyint | 保留。
status | int | 位图指示状态。可能的值包括： 1 = PRIMARY KEY 约束。 2 = UNIQUE KEY 约束。 3 = FOREIGN KEY 约束。 4 = CHECK 约束。 5 = DEFAULT 约束。 16 = 列级约束。 32 = 表级约束。
actions | int | 保留。
error | int | 保留。


syscurconfigs

每个当前配置选项各占一项。另外，该表还包含四个描述配置结构的项。syscurconfigs 在由用户查询时动态生成。有关更多信息，请参见 sysconfigures。

列名 | 数据类型 | 描述
value | int | 用户可修改的变量值（仅在已执行 RECONFIGURE 的情况下由 Microsoft® SQL Server™ 使用）。
config | smallint | 配置变量号。
comment | nvarchar(255) | 对配置选项的解释。
status | smallint | 表示选项状态的位图。可能的值包括： 0 = 静态（该设置在服务器重新启动时生效）。 1 = 动态（该变量在 RECONFIGURE 语句执行时生效）。 2 = 高级（仅当设置了显示高级选项时才显示该变量）。 3 = 动态和高级。


sysdatabases

Microsoft® SQL Server™ 上的每个数据库在表中占一行。最初安装 SQL Server 时，sysdatabases 包含 master、model、msdb、mssqlweb 和 tempdb 数据库的项。该表只存储在 master 数据库中。

列名 | 数据类型 | 描述
name | sysname | 数据库的名称。
dbid | smallint | 数据库 ID。
sid | varbinary(85) | 数据库创建者的系统 ID。
mode | smallint | 用于创建数据库时在内部锁定该数据库。
status | int | 状态位，其中某些状态位可由用户使用 sp_dboption（read only、dbo use only、single user 等）进行设置： 1 = autoclose；使用 sp_dboption 设置。 4 = select into/bulkcopy；使用 sp_dboption 设置。 8 = trunc. log on chkpt；使用 sp_dboption 设置。 16 = torn page detection，使用 sp_dboption 设置。 32 = loading。 64 = pre recovery。 128 = recovering。 256 = not recovered。 512 = offline；使用sp_dboption 设置。 1024 = read only；使用 sp_dboption 设置。 2048 = dbo use only；使用 sp_dboption 设置。 4096 = single user；使用 sp_dboption 设置。 32768 = emergency mode。 4194304 = autoshrink。 1073741824 = cleanly shutdown。 可以同时打开多个位。
status2 | int | 16384 = ANSI null default；使用 sp_dboption 设置。 65536 = concat null yields null，使用 sp_dboption 设置。 131072 = recursive triggers，使用 sp_dboption 设置。 1048576 = default to local cursor，使用 sp_dboption 设置。 8388608 = quoted identifier，使用 sp_dboption 设置。 33554432 = cursor close on commit，使用 sp_dboption 设置。 67108864 = ANSI nulls，使用 sp_dboption 设置。 268435456 = ANSI warnings，使用 sp_dboption 设置。 536870912 = full text enabled，使用 sp_fulltext_database 设置。
crdate | datetime | 创建日期。
reserved | datetime | 留作以后使用。
category | int | 包含用于复制的信息位图： 1 = 已发布。 2 = 已订阅。 4 = 合并已发布。 8 = 合并已订阅。
cmptlevel | tinyint | 数据库的兼容级别。有关更多信息，请参见 sp_dbcmptlevel。
filename | nvarchar(260) | 数据库主文件的操作系统路径和名称。
version | smallint | 创建数据库时使用的 SQL Server 代码内部版本号。仅供 SQL Server 工具在内部用于升级处理。


sysdbmaintplan_databases

每个具有相关联的维护计划的数据库在表中占一行。该表存储在 msdb 数据库中。

列名 | 数据类型 | 描述
plan_id | uniqueidentifier | 维护计划 ID。
database_name | sysname | 与维护计划相关联的数据库名称。


sysdbmaintplan_history

执行的每个维护计划操作在表中占一行。该表存储在 msdb 数据库中。

列名 | 数据类型 | 描述
sequence_id | int | 维护计划执行的历史记录序列。
plan_id | uniqueidentifier | 维护计划 ID。
plan_name | sysname | 维护计划名称。
database_name | sysname | 与维护计划相关联的数据库名称。
server_name | sysname | 系统名称。
activity | nvarchar(128) | 维护计划执行的活动（例如备份事务日志等）。
succeeded | bit | 0 = 成功 1 = 失败
end_time | datetime | 完成操作的时间。
duration | int | 完成维护计划操作所需的时间。
start_time | datetime | 操作开始的时间。
error_number | int | 失败时报告的错误号。
message | nvarchar(512) | sqlmaint 生成的消息。


sysdbmaintplan_jobs

每个维护计划作业在表中占一行。该表存储在 msdb 数据库中。

列名 | 数据类型 | 描述
plan_id | uniqueidentifier | 维护计划 ID。
job_id | uniqueidentifier | 与维护计划相关联的作业 ID。


sysdbmaintplans

每个数据库维护计划在表中占一行。该表存储在 msdb 数据库中。

列名 | 数据类型 | 描述
plan_id | uniqueidentifier | 维护计划 ID。
plan_name | sysname | 维护计划名称。
date_created | datetime | 创建维护计划的日期。
owner | sysname | 维护计划的所有者。
max_history_rows | int | 在系统表中，为记录维护计划的历史所分配的最大行数。
remote_history_server | sysname | 远程服务器的名称，可以将历史报表写入该远程服务器中。
max_remote_history_rows | int | 远程服务器上的系统表中所分配的最大行数，可以将历史报表写入该远程服务器中。
user_defined_1 | int | 默认设置为 NULL。
user_defined_2 | nvarchar(100) | 默认设置为 NULL。
user_defined_3 | datetime | 默认设置为 NULL。
user_defined_4 | uniqueidentifier | 默认设置为 NULL。
log_shipping | bit | 日志传送状态： 0 = 禁用 1 = 启用


sysdepends

包含对象（视图、过程和触发器）与对象定义中包含的对象（表、视图和过程）之间的相关性信息。该表存储在每个数据库中。

列名 | 数据类型 | 描述
id | int | 对象 ID。
depid | int | 相关对象 ID。
数字 | smallint | 过程号。
depnumber | smallint | 相关过程号。
status | smallint | 内部状态信息。
depdbid | smallint | 保留。
depsiteid | smallint | 保留。
selall | bit | 如果对象用在 SELECT * 语句中，则打开。
resultobj | bit | 如果正在更新对象，则打开。
readobj | bit | 如果正在读取对象，则打开。


sysdevices

每个磁盘备份文件、磁带备份文件和数据库文件在表中占一行。该表只存储在 master 数据库中。

重要 该系统表提供向后兼容信息。在 Microsoft® SQL Server™ 的早期版本中，该表包含所有数据库文件的列表。在 SQL Server 7.0 版中，数据库文件列表存储在每个数据库的 sysfiles 系统表中。

列名 | 数据类型 | 描述
name | sysname | 备份文件或数据库文件的逻辑名称。
size | int | 以两千字节 (KB) 页为单位的文件大小。
low | int | 维护该列只是为了向后兼容。
high | int | 维护该列只是为了向后兼容。
status | smallint | 表示设备类型的位图： 1 = 默认磁盘 2 = 物理磁盘 4 = 逻辑磁盘 8 = 跳过首部 16 = 备份文件 32 = 串行写入 4096 = 只读
cntrltype | smallint | 控制器类型： 0 = 非光盘数据库文件 2 = 磁盘备份文件 3 - 4 = 磁盘/软盘备份文件 5 = 磁带备份文件 6 = 命名管道文件
phyname | nvarchar(260) | 物理文件名。


sysdownloadlist

包含所有目标服务器的下载指令队列。

列名 | 数据类型 | 描述
instance_id | int | 提供行的自然插入序列的标识列。
source_server | nvarchar(30) | 源服务器的名称。
operation_code | tinyint | 作业的操作代码： 1 = INS (INSERT) 2 = UPD (UPDATE) 3 = DEL (DELETE) 4 = START 5 = STOP
object_type | tinyint | 对象类型代码。对于 Microsoft® SQL Server™ 7.0 版，该值可为 1，与 JOB 相对应。
object_id1 | uniqueidentifier | 对象标识号。
target_server | nvarchar(30) | 目标服务器的名称。
error_message | nvarchar(1024) | 目标服务器在处理特定行时遇到错误时所出现的错误信息。
date_posted | datetime | 将作业发布到目标服务器的日期和时间。
date_downloaded | datetime | 上次下载作业的日期和时间。
status | tinyint | 作业状态： 0 = 尚未下载 1 = 已成功下载
deleted_object_name | sysname | 删除的对象的名称。

1. 如果 operation_code 列的值为 DELETE，则 object_id 列的值会是 -1（对应于值 ALL）。


sysfilegroups

数据库中的每个文件组在表中占一行。该表存储在每个数据库中。在该表中至少有一项用于主文件组。

列名 | 数据类型 | 描述
groupid | smallint | 每个数据库的唯一组标识号。
allocpolicy | smallint | 保留。
status | int | 0x8 = READ ONLY 0x10 = DEFAULT
groupname | sysname | 文件组的名称。


sysfiles

数据库中的每个文件在表中占一行。该系统表是虚拟表，不能直接更新或修改。

列名 | 数据类型 | 描述
fileid | smallint | 每个数据库的唯一文件标识号。
groupid | smallint | 文件组标识号。
size | int | 文件大小（以 8 KB 页为单位）。
maxsize | int | 最大文件大小（以 8 KB 页为单位）。0 值表示不增长，–1 值表示文件应一直增长到磁盘已满。
growth | int | 数据库的增长大小。0 值表示不增长。根据状态的值，可以是页数或文件大小的百分比。如果 status 包含 0x100000，则 growth 是文件大小的百分比；否则，它是页数。
status | int | growth 值（以兆字节 (MB) 或千字节 (KB) 为单位）的状态位。 0x1 = 默认设备。 0x2 = 磁盘文件。 0x40 = 日志设备。 0x80 = 自上次备份后已写入文件。 0x4000 = 由 CREATE DATABASE 语句 隐性创建的设备。 0x8000 = 在数据库创建过程中创建的设备。 0x100000 = 按百分比而不是按页数增长。
perf | int | 保留。
name | nchar(128) | 文件的逻辑名称。
filename | nchar(260) | 物理设备的名称，包括文件的完整路径。


sysforeignkeys

包含关于表定义中的 FOREIGN KEY 约束的信息。该表存储在每个数据库中。

列名 | 数据类型 | 描述
constid | int | FOREIGN KEY 约束的 ID。
fkeyid | int | 具有 FOREIGN KEY 约束的表对象 ID。
rkeyid | int | 在 FOREIGN KEY 约束中引用的表对象 ID。
fkey | smallint | 正在引用的列 ID。
rkey | smallint | 已引用的列 ID。
keyno | smallint | 该列在引用列列表中的位置。


sysfulltextcatalogs

列出全文目录集。

列名 | 数据类型 | 描述
ftcatid | smallint | 全文目录的标识符。
name | sysname | 用户提供的全文目录名。
status | smallint | 保留；仅限内部使用。
path | nvarchar(260) | 用户提供的根路径。NULL 值表示用户未提供路径，因而使用了默认（安装）路径。


sysindexes

数据库中的每个索引和表在表中各占一行。该表存储在每个数据库中。

列名 | 数据类型 | 描述
id | int | 表 ID（如果 indid = 0 或 255）。否则为索引所属表的 ID。
status | int | 内部系统状态信息。
first | binary(6) | 指向第一页或根页的指针。
indid | smallint | 索引 ID： 1 = 聚集索引 >1 = 非聚集 255 = 具有 text 或 image 数据的表条目
root | binary(6) | 如果 indid >= 1 和 < 255，root 是指向根页的指针。如果 indid = 0 或 indid = 255，root 是指向最后一页的指针。
minlen | smallint | 最小行大小。
keycnt | smallint | 键的数目。
groupid | smallint | 在其上创建对象的文件组 ID。
dpages | int | 如果 indid = 0 或 indid = 1，dpages 是已用数据页的计数。如果 indid = 255，其设置为 0。否则是已用索引页的计数。
reserved | int | 如果 indid = 0 或 indid = 1，reserved 是分配给所有索引和表数据的页计数。如果 indid = 255，reserved 是分配给 text 或 image 数据的页计数。否则是分配给索引的页计数。
used | int | 如果 indid = 0 或 indid = 1，used 是用于所有索引和表数据的总页数。如果 indid = 255，used 是用于 text 或 image 数据的页计数。否则是用于索引的页计数。
rowcnt | bigint | 基于 indid = 0 和 indid = 1 的数据级行计数。如果 indid = 255，rowcnt 设置为 0。
rowmodctr | int | 对自上次更新表的统计后插入、删除或更新行的总数进行计数。
xmaxlen | smallint | 最大行大小。
maxirow | smallint | 最大非叶索引行大小。
OrigFillFactor | tinyint | 创建索引时使用的起始填充因子值。不保留该值；然而，如果需要重新创建索引但记不住当初使用的填充因子，则该值可能很有帮助。
reserved1 | tinyint | 保留。
reserved2 | int | 保留。
FirstIAM | binary(6) | 保留。
impid | smallint | 保留。索引实现标志。
lockflags | smallint | 用于约束经过考虑的索引锁粒度。例如，对于本质上是只读的查找表，可以将其设置为仅进行表级锁定以使锁定成本减到最小。
pgmodctr | int | 保留。
keys | varbinary(816) | 组成索引键的列 ID 列表。
name | sysname | 表名（如果 indid = 0 或 255）。否则为索引的名称。
statblob | image | 统计 BLOB。
maxlen | int | 保留。
rows | int | 基于 indid = 0 和 indid = 1的数据级行数，该值对于 indid >1 重复。如果 indid = 255，rows 设置为 0。提供该列是为了向后兼容。


sysindexkeys

包含索引中的键或列的信息。该表存储在每个数据库中。

列名 | 数据类型 | 描述
id | int | 表 ID
indid | smallint | 索引 ID
colid | smallint | 列 ID
keyno | smallint | 该列在索引中的位置


sysjobhistory

包含有关由 SQL Server 代理程序调度作业的执行的信息。该表存储在 msdb 数据库中。

列名 | 数据类型 | 描述
instance_id | int | 行的唯一标识符。
job_id | uniqueidentifier | 作业 ID。
step_id | int | 作业中的步骤 ID。
step_name | sysname | 步骤的名称。
sql_message_id | int | 如果作业失败，则返回任何 Microsoft® SQL Server™ 错误信息的 ID。
sql_severity | int | 任何 SQL Server 错误的严重度。
message | nvarchar(1024) | SQL Server 错误的文本（若有）。
run_status | int | 作业的执行状态： 0 = 失败 1 = 成功 2 = 重试 3 = 取消 4 = 正在进行
run_date | int | 作业或步骤开始执行的日期。对于"正在进行"的历史记录，这是写入历史记录的日期/时间。
run_time | int | 作业或步骤完成的时间。
run_duration | int | 以 HHMMSS 格式执行作业或步骤所花费的时间。
operator_id_emailed | int | 作业完成时通知的操作员 ID。
operator_id_netsent | int | 作业完成时用消息通知的操作员 ID。
operator_id_paged | int | 作业完成时用寻呼机通知的操作员 ID。
retries_attempted | int | 尝试执行作业或步骤的重试次数。
server | nvarchar(30) | 执行作业时所在服务器的名称。


sysjobs

存储将由 SQL Server 代理程序执行的每个已调度作业的信息。该表存储在 msdb 数据库中。

列名 | 数据类型 | 描述
job_id | uniqueidentifier | 作业的唯一 ID。
originating_server | nvarchar(30) | 作业来自的服务器名称。
name | sysname | 作业的名称。
enabled | tinyint | 表示是否启用待执行的作业。
description | nvarchar(512) | 对作业的描述。
start_step_id | int | 执行作业的起始步骤 ID。
category_id | int | 作业分类的 ID。
owner_sid | varbinary(85) | 作业所有者的系统标识号 (SID)。
notify_level_ eventlog | int | 位掩码，它指示什么情况下通知事件应记录到 Microsoft® Windows NT® 的应用程序日志中： 0 = 从不 1 = 当作业成功时 2 = 当作业失败时 3 = 当作业完成时（与作业结果无关）
notify_level_email | int | 表示在何种情况下应在作业完成时发送提示电子邮件的位掩码： 0 = 从不 1 = 当作业成功时 2 = 当作业失败时 3 = 当作业完成时（与作业结果无关）
notify_level_netsend | int | 表示在何种情况下应在作业完成时发送网络消息的位掩码： 0 = 从不 1 = 当作业成功时 2 = 当作业失败时 3 = 当作业完成时（与作业结果无关）
notify_level_page | int | 表示在何种情况下应在作业完成时发送寻呼的位掩码： 0 = 从不 1 = 当作业成功时 2 = 当作业失败时 3 = 当作业完成时（与作业结果无关）
notify_email_ operator_id | int | 要通知的操作员的电子邮件名称。
notify_netsend_ operator_id | int | 发送网络消息时使用的计算机或用户 ID。
notify_page_ operator_id | int | 发送寻呼时使用的计算机或用户 ID。
delete_level | int | 表示在何种情况下应在作业完成时删除作业的位掩码： 0 = 从不 1 = 当作业成功时 2 = 当作业失败时 3 = 当作业完成时（与作业结果无关）
date_created | datetime | 作业的创建日期。
date_modified | datetime | 上次修改作业的日期。
version_number | int | 作业版本。


sysjobschedules

包含将由 SQL Server 代理程序执行的作业调度信息。该表存储在 msdb 数据库中。

列名 | 数据类型 | 描述
schedule_id | int | 调度 ID。
job_id | uniqueidentifier | 作业 ID。
name | sysname | 调度的名称。
enabled | int | 调度的启用状态。
freq_type | int | 调度执行的频率： 1 = 一次 4 = 每天 8 = 每周 16 = 每月 32 = 每月相对信息 64 = 在 SQL Server 代理程序启动时执行
freq_interval | int | 表示调度运行日期的值。 如果 freq_type 是 4（每天），则该值是每隔 freq_interval 天。 如果 freq_type 是 8（每周），则该值是表示周调度运行日期的位掩码。freq_interval 值是： 1 = 星期日 2 = 星期一 4 = 星期二 8 = 星期三 16 = 星期四 32 = 星期五 64 = 星期六 如果 freq_type 是 16（每月），则该值是月中的 freq_interval 天。 如果 freq_type 是 32（每月相对信息），则 freq_interval 可以是下列值之一： 1 = 星期日 2 = 星期一 3 = 星期二 4 = 星期三 5 = 星期四 6 = 星期五 7 = 星期六 8 = 日 9 = 工作日 10 = 周末
freq_subday_type | int | freq_subday_interval 的单位： 1 = 以指定的时间 2 = 秒 4 = 分钟 8 = 小时
freq_subday_interval | int | 在每个已调度作业执行之间发生的 freq_subday_type 周期数。
freq_relative_ interval | int | 当 freq_type 是 32（每月相对信息）时，每月已调度作业的 freq_interval 发生： 1 = 第一个 2 = 第二个 4 = 第三个 8 = 第四个 16 = 最后一个
freq_recurrence_ factor | int | 在已调度作业执行之间的星期数或月份数。
active_start_date | int | 开始执行作业的日期。
active_end_date | int | 停止执行作业的日期。
active_start_time | int | 开始执行作业的时间。
active_end_time | int | 停止执行作业的时间。
next_run_date | int | 下一次执行作业的日期。
next_run_time | int | 下一次执行作业的时间。
date_created | datetime | 已调度作业项的创建日期。


sysjobservers

存储特定作业与一个或更多目标服务器的关联或关系。

列名 | 数据类型 | 描述
job_id | uniqueidentifier | 作业标识号。
server_id | int | 服务器标识号。
last_run_outcome | tinyint | 作业上次运行的结果： 0 = 成功 1 = 失败 2 = 取消
last_outcome_ message | nvarchar(1024) | 与 last_run_outcome 列关联的消息（若有）。
last_run_date | int | 上次运行作业的日期。
last_run_time | int | 上次运行作业的时间。
last_run_duration | int | 作业运行的持续时间（以秒为单位）。


sysjobsteps

包含将由 SQL Server 代理程序执行的作业中每个步骤的信息。该表存储在 msdb 数据库中。

列名 | 数据类型 | 描述
job_id | uniqueidentifier | 作业 ID。
step_id | int | 作业中的步骤 ID。
step_name | sysname | 作业步骤的名称。
subsystem | nvarchar(40) | 由 SQL Server 代理程序用来执行作业步骤的子系统名称。
command | nvarchar(3200) | 由 subsystem 执行的命令。
flags | int | 保留。
additional_ parameters | ntext | 保留。
cmdexec_success_ code | int | 由 CmdExec 子系统步骤返回的表示是否成功的错误等级值。
on_success_action | tinyint | 当成功执行某个步骤时将要执行的操作。
on_success_step_id | int | 当成功执行某个步骤时将要执行的下一个步骤 ID。
on_fail_action | tinyint | 当未成功执行某个步骤时将要执行的操作。
on_fail_step_id | int | 当未成功执行某个步骤时将要执行的下一个步骤 ID。
server | sysname | 保留。
database_name | sysname | 数据库的名称，当 subsystem 为 TSQL 时在其中执行 command。
database_user_name | sysname | 数据库用户的名称，在执行步骤时将使用该用户的帐户。
retry_attempts | int | 当步骤失败时尝试的重试次数。
retry_interval | int | 每次重试尝试之间等待的时间。
os_run_priority | int | 保留。
output_file_name | nvarchar(200) | 文件的名称，当 subsystem 为 TSQL 或 CmdExece 时在该文件中保存步骤的输出。
last_run_outcome | int | 前一次作业步骤执行的结果。
last_run_duration | int | 前一次作业执行所用的时间。
last_run_retries | int | 上一次作业步骤执行时尝试的重试次数。
last_run_date | int | 作业步骤前一次执行的日期。
last_run_time | int | 作业步骤前一次执行的时间。


syslanguages

出现在 Microsoft® SQL Server™ 中的每种语言在表中各占一行。虽然美国英语不在 syslanguages 内，但该表始终可由 SQL Server 使用。该表只存储在 master 数据库中。

列名 | 数据类型 | 描述
langid | smallint | 唯一语言 ID。
dateformat | nchar(3) | 日期顺序（如 DMY）。
datefirst | tinyint | 一周的第一天：1 表示星期一，2 表示星期二，依此类推，直到 7 表示星期日。
upgrade | int | 留作系统使用。
name | sysname | 正式语言名称（例如，français）。
alias | sysname | 备用语言名称（如 French）。
months | nvarchar(372) | 按从一月到十二月的顺序排列的用逗号分隔的月份全称列表，每个名称最多包含 20 个字符。
shortmonths | varchar(132) | 按从一月到十二月的顺序排列的用逗号分隔的缩写月份名称列表，每个名称最多包含 9 个字符。
days | nvarchar(217) | 按从一月到十二月的顺序排列的用逗号分隔的天名称列表，每个名称最多包含 30 个字符。
lcid | int | 此种语言的 Microsoft Windows NT® 区域设置 ID。
mslangid | smallint | SQL Server 消息组 ID。

安装了 SQL Server 提供的三十三种语言。下面是语言列表。

用英语表示的名称 | NT LCID | SQL Server 消息组 ID
English | 1033 | 1033
German | 1031 | 1031
French | 1036 | 1036
Japanese | 1041 | 1041
Danish | 1030 | 1030
Spanish | 3082 | 3082
Italian | 1040 | 1040
Dutch | 1043 | 1043
Norwegian | 2068 | 2068
Portuguese | 2070 | 2070
Finnish | 1035 | 1035
Swedish | 1053 | 1053
Czech | 1029 | 1029
Hungarian | 1038 | 1038
Polish | 1045 | 1045
Romanian | 1048 | 1048
Croatian | 1050 | 1050
Slovak | 1051 | 1051
Slovene | 1060 | 1060
Greek | 1032 | 1032
Bulgarian | 1026 | 1026
Russian | 1049 | 1049
Turkish | 1055 | 1055
British English | 2057 | 1033
Estonian | 1061 | 1061
Latvian | 1062 | 1062
Lithuanian | 1063 | 1063
Brazilian | 1046 | 1046
Traditional Chinese | 1028 | 1028
Korean | 1042 | 1042
Simplified Chinese | 2052 | 2052
Arabic | 1025 | 1025
Thai | 1054 | 1054


syslockinfo

包含有关所有已授权、正在转换和正在等待的锁请求的信息。此表是锁管理器内部数据结构的非规范化表格格式视图，只存储在 master 数据库中。

列名 | 数据类型 | 描述
rsc_text | nchar(32) | 锁资源的文本化描述。包含资源名称的一部分。
rsc_bin | binary(16) | 二进制锁资源。包含锁管理器中所含的实际锁资源。对那些知道锁资源格式的工具包含该列，这些工具使用特定的锁资源格式生成自己的格式化锁资源和在 syslockinfo 上执行自联接。
rsc_valblk | binary(16) | 锁值块。有些资源类型可以在特定的锁资源中包含附加数据，锁管理器不对这类锁资源进行哈希运算以决定具体某个锁资源的所有关系。例如，页锁不归具体的对象 ID 所有。但是，对于锁升级和出于其它目的，页锁的对象 ID 可以放置在锁值块中。
rsc_dbid | smallint | 与资源关联的数据库 ID。
rsc_indid | smallint | 与资源关联的索引 ID（如果适合）。
rsc_objid | int | 与资源关联的对象 ID（如果适合）。
rsc_type | tinyint | 资源类型。可以是： 1 = NULL 资源（未使用）。 2 = 数据库。 3 = 文件。 4 = 索引。 5 = 表。 6 = 页。 7 = 键。 8 = 扩展盘区。 9 = RID（行 ID)。 10 = 应用程序。
rsc_flag | tinyint | 内部资源标志。
req_mode | tinyint | 锁请求模式。该列是请求者的锁模式，并且代表已授权模式，或代表转换或等待模式。可以是： 0 = NULL。不授权访问资源。用作占位符。 1 = Sch-S（架构稳定性）。确保不在任何会话控制架构元素上的架构稳定性锁时除去架构元素，如表或索引。 2 = Sch-M（架构修改）。必须由任何要更改指定资源架构的会话进行控制。确保没有其它的会话正在引用指定的对象。 3 = S（共享）。授权控制会话对资源进行共享访问。 4 = U（更新）。表示在最终可能更新的资源上获取更新锁。用于防止常见形式的死锁，这类死锁在多个会话锁定资源并且稍后可能更新资源时发生。 5 = X（排它）。授权控制会话对资源进行排它访问。 6 = IS（意向共享）。表示有意将 S 锁放置在锁层次结构内的某个从属资源上。 7 = IU（意向更新）。表示有意将 U 锁放置在锁层次结构内的某个从属资源上。 8 = IX（意向排它）。表示有意将 X 锁放置在锁层次结构内的某个从属资源上。 9 = SIU（共享意向更新）。表示对有意在锁层次结构内的从属资源上获取更新锁的资源进行共享访问。 10 = SIX（共享意向排它）。表示对有意在锁层次结构内的从属资源上获取排它锁的资源进行共享访问。 11 = UIX（更新意向排它）。表示更新锁控制有意在锁层次结构内的从属资源上获取排它锁的资源。 12 = BU。由大容量操作使用。 13 = RangeS_S（共享键范围和共享资源锁）。表示可串行范围扫描。 14 = RangeS_U（共享键范围和更新资源锁）。表示可串行更新扫描。 15 = RangeI_N（插入键范围和空资源锁）。用于在索引中插入新键之前测试范围。 16 = RangeI_S。通过 RangeI_N 和 S 锁的重叠创建的键范围转换锁。 17 = RangeI_U。通过 RangeI_N 和 U 锁的重叠创建的键范围转换锁。 18 = RangeI_X。通过 RangeI_N 和 X 锁的重叠创建的键范围转换锁。 19 = RangeX_S。通过 RangeI_N 和 RangeS_S 锁的重叠创建的键范围转换锁。20 = RangeX_U。通过 RangeI_N 和 RangeS_U 锁的重叠创建的键范围转换锁。 21 = RangeX_X（排它键范围和排它资源锁）。该转换锁在更新范围中的键时使用。
req_status | tinyint | 锁请求的状态。可以是： 1 = 已授予。 2 = 正在转换。 3 = 正在等待。
req_refcnt | smallint | 锁引用计数。事务每次请求具体某个资源上的锁时，引用计数便增加。直到引用计数等于 0 时才能释放锁。
req_cryrefcnt | smallint | 留作以后使用。总是设置为 0。
req_lifetime | int | 锁生存周期位图。在某些查询处理策略的过程中，必须维护资源上的锁，直到查询处理器已完成查询的某个具体阶段为止。查询处理器和事务管理器用锁生存周期位图表示在完成查询的某个阶段时可以释放的锁组。位图内的某些位用于表示即使锁的引用计数等于 0，也必须到事务结束时才释放的锁。
req_spid | int | 请求锁的会话的内部 Microsoft® SQL Server™ 进程 ID。
req_ecid | int | 执行环境 ID (ECID)。用于表示并行操作内拥有具体某个锁的线程。
req_ownertype | smallint | 与锁关联的对象类型。可以是下列选项之一： 1 = 事务。 2 = 游标。 3 = 会话。 4 = ExSession。 注意：3 和 4 代表会话锁的特殊版本，分别跟踪数据库锁和文件组锁。
req_transactionID | bigint | 用于 syslockinfo 和事件探查器事件中的唯一事务 ID。
req_transactionUOW | uniqueidentifier | 标识 DTC 事务的工作单元 ID (UOW)。对于非 MS DTC 事务，UOW 设置为 0。


syslogins

每个登录帐户在表中占一行。

列名 | 数据类型 | 描述
sid | varbinary(85) | 安全标识符。
status | smallint | 仅限内部使用。
createdate | datetime | 添加登录的日期。
updatedate | datetime | 更新登录的日期。
accdate | datetime | 仅限内部使用。
totcpu | int | 仅限内部使用。
totio | int | 仅限内部使用。
spacelimit | int | 仅限内部使用。
timelimit | int | 仅限内部使用。
resultlimit | int | 仅限内部使用。
name | varchar(30) | 用户的登录 ID。
dbname | nvarchar(128) | 建立连接时，用户的默认数据库名。
password | nvarchar(128) | 用户的加密密码（可以是 NULL）。
language | nvarchar(128) | 用户的默认语言。
denylogin | int | 如果登录是 Microsoft® Windows NT® 用户或组且已被拒绝访问，则为 1。
hasaccess | int | 如果已授权登录访问服务器，则为 1。
isntname | int | 如果登录是 Windows NT 用户或组，则为 1；如果登录是 Microsoft SQL Server™ 登录，则为 0。
isntgroup | int | 如果登录是 Windows NT 组，则为 1。
isntuser | int | 如果登录是 Windows NT 用户，则为 1。
sysadmin | int | 如果登录是 sysadmin 服务器角色成员，则为 1。
securityadmin | int | 如果登录是 securityadmin 服务器角色成员，则为 1。
serveradmin | int | 如果登录是 serveradmin 固定服务器角色成员，则为 1。
setupadmin | int | 如果登录是 setupadmin 固定服务器角色成员，则为 1。
processadmin | int | 如果登录是 processadmin 固定服务器角色成员，则为 1。
diskadmin | int | 如果登录是 diskadmin 固定服务器角色成员，则为 1。
dbcreator | int | 如果登录是 dbcreator 固定服务器角色成员，则为 1。
loginname | nvarchar(128) | 登录的实际名称，该名称可能不同于 SQL Server 所使用的登录名。


sysmembers

每个数据库角色成员在表中占一行。该表存储在每个数据库中。

列名 | 数据类型 | 描述
memberuid | smallint | 角色成员的用户 ID。
groupuid | smallint | 角色的用户 ID。


sysmergearticles

本地数据库中定义的每个合并项目在表中占一行。该表存储在发布数据库中。

列名 | 数据类型 | 描述
name | sysname | 项目名。
type | tinyint | 项目类型。
objid | int | 对象标识符。
sync_objid | int | 表示同步数据集的视图对象 ID。
view_type | tinyint | 视图的类型： 0 = 不是视图；使用所有的基对象。 1 = 永久视图。 2 = 临时视图。
artid | uniqueidentifier | 用于为给定项目提供唯一标识号的标识列。artid 是从 sysobjects.srcid 衍生而来。
description | nvarchar(255) | 对项目的简短描述。
pre_creation_ command | nvarchar(10) | 在订阅数据库中创建项目时采取的默认操作： None = 如果表已存在于订阅服务器中，则不采取操作。 Delete = 基于子集筛选中的 WHERE 子句发出删除。 Drop（默认值） = 在重新创建表之前将其除去。 Truncate = 与 delete 相同，但是删除页而非行。然而，不要使用 WHERE 子句。
pubid | uniqueidentifier | 当前项目所属发布的 ID。
nickname | int | 项目标识的别名映射。
column_tracking | int | 表示是否为项目执行列跟踪。
status | tinyint | 用于表示项目状态的位图。
conflict_table | sysname | 包含当前项目冲突记录的本地表名。该表仅用于提供信息，其内容可以由自定义冲突解决例程修改或删除，或直接由系统管理员修改或删除。
creation_script | nvarchar(255) | 该项目的创建脚本。
conflict_script | nvarchar(255) | 该项目的冲突脚本。
article_resolver | nvarchar(255) | 该项目的自定义行级冲突解决程序。
ins_conflict_proc | sysname | 用于将冲突写入 conflict_table 的过程。
insert_proc | sysname | 由默认冲突解决程序用来在同步过程中插入行的过程。
update_proc | sysname | 由默认冲突解决程序用来在同步过程中更新行的过程。
select_proc | sysname | 自动生成的存储过程的名称，合并代理程序用该存储过程完成锁定并查找项目的行和列。
schema_option | binary(8) | 表示将写入脚本的内容。
destination_ object | sysname | 在订阅服务器上创建的表名。
destination_owner | sysname | 目的对象所有者的名称。
resolver_clsid | nvarchar(1000) | 自定义冲突解决程序的 ID。
subset_ filterclause | nvarchar(2000) | 该项目的筛选子句。
missing_col_ count | int | 缺少的列的数目。
missing_cols | varbinary(128) | 缺少的列的位图。
excluded_cols | varbinary(128) | 将项目发送到订阅服务器时，从项目中排除的列的位图。
excluded_col_count | int | 排除的列的数目。
columns | varbinary(128) | 留作以后使用。
resolver_info | sysname | 存储自定义冲突解决程序所需的附加信息。
view_sel_proc | nvarchar(290) | 存储过程名，合并代理程序用该存储过程初始填充动态筛选发布中的项目，并且枚举在任何筛选发布中的已更改行。
gen_cur | int | 生成的项目基表的本地更改数。
vertical_partition | int | 指定在表项目上是否启用列筛选。0 表示没有垂直筛选并且发布所有列。
identity_support | int | 指定使用排队更新时是否启用自动标识范围处理。0 表示没有标识范围支持。
before_image_objid | int | 跟踪表对象 ID。当用 @keep_partition_changes = true 创建发布时，该跟踪表包含某些键列值。
before_view_objid | int | 视图表的对象 ID。视图所在的表用于在删除或更新行之前跟踪行是否属于特定的订阅服务器。只适用于用 @keep_partition_changes = true 创建发布时。
verify_resolver_signature | int | 指定在合并复制中使用冲突解决程序之前是否验证数字签名： 0 = 不验证签名。 1 = 验证签名以查看其是否来自信任源。
allow_interactive_resolver | bit | 指定是否在项目上启用交互式冲突解决程序。1 指定在项目上使用交互式冲突解决程序。
fast_multicol_updateproc | bit | 指定是否已启用合并代理程序，以将同一行中多列的更改应用于一个 UPDATE 语句。 0 = 为每一更改列发出一个单独的 UPDATE。 1 = 发出 UPDATE 语句以在一个语句中更新多列。
check_permissions | int | 当合并代理程序将更改应用于发布服务器时将要验证的表级权限的位图。check_permissions 有下列值之一： 0x00 = 将不检查权限。 0x10 = 在可以上载订阅服务器上所做的 INSERT 操作之前检查发布服务器上的权限。 0x20 = 在可以上载订阅服务器上所做的 UPDATE 操作之前检查发布服务器上的权限。 0x40 = 在可以上载订阅服务器上所做的 DELETE 操作之前检查发布服务器上的权限。


sysmergepublications

数据库中定义的每个合并发布在表中占一行。下表存储在发布和订阅数据库中。

列名 | 数据类型 | 描述
publisher | sysname | 默认服务器的名称。
publisher_db | sysname | 默认发布服务器数据库的名称。
name | sysname | 发布名。
description | nvarchar(255) | 对发布的简短描述。
retention | int | 以天数表示的整个发布集的保持期。
publication_type | tinyint | 表示发布是否已经过筛选： 0 = 未筛选。 1 = 已筛选。
pubid | uniqueidentifier | 该发布的唯一标识号；在添加发布时生成。
designmasterid | uniqueidentifier | 留作以后使用。
parentid | uniqueidentifier | 表示从其中创建当前对等发布或子集发布的父发布（用于层次发布拓朴）。
sync_mode | tinyint | 该发布的同步模式： 0 = 本机。 1 = 字符。
allow_push | int | 表示发布是否允许强制订阅。
allow_pull | int | 表示发布是否允许请求订阅。
allow_anonymous | int | 表示发布是否允许匿名订阅。
centralized_ conflicts | int | 表示是否在发布服务器中存储冲突记录： 0 = 冲突记录同时存储在导致冲突的发布服务器和订阅服务器上。 1 = 所有冲突记录都存储在发布服务器上。
status | tinyint | 留作以后使用。
snapshot_ready | tinyint | 表示发布快照已准备好使用： 0 = 快照已准备好使用。 1 = 快照未准备好使用。
enabled_for_ internet | bit | 表示是否通过 FTP 和其它服务将发布的同步文件表现在 Internet 上。
dynamic_filters | bit | 表示是否在动态属性上筛选发布。
snapshot_in_defaultfolder | bit | 指定快照文件是否存储在默认文件夹中： 0 = 快照文件存储在默认文件夹中。 1 = 快照文件存储在由 alt_snapshot_folder 指定的位置。
alt_snapshot_folder | nvarchar(255) | 快照的备用文件夹的位置。
pre_snapshot_script | nvarchar(255) | 指向 .sql 文件的指针，合并代理程序在订阅服务器上应用快照时将在任何复制对象脚本之前运行该文件。
post_snapshot_script | nvarchar(255) | 指向 .sql 文件的指针，合并代理程序在初始同步中应用了其它所有复制对象脚本和数据之后运行该文件。
compress_snapshot | bit | 指定写入 alt_snapshot_folder 位置的快照是否压缩为 Microsoft® CAB 格式。0 指定该文件不压缩。
ftp_address | sysname | 分发服务器的 FTP 服务网络地址。如果启用 FTP，指定供合并代理程序获取的发布快照文件的位置。
ftp_port | int | 分发服务器的 FTP 服务端口号。
ftp_subdirectory | nvarchar(255) | 可供合并代理程序获取的快照文件的子目录。
ftp_login | sysname | 用于连接到 FTP 服务的用户名。
ftp_password | nvarchar(524) | 用于连接到 FTP 服务的用户密码。
conflict_retention | int | 指定保留冲突的保持期（以天为单位）。从冲突表中清除冲突行之前指派默认值，即 14 天。
keep_before_values | int | 指定是否为该发布发生同步优化： 0 = 不优化同步，分区中的数据更改时将验证发送到所有订阅服务器的分区。 1 = 优化同步，只影响在更改的分区中有行的订阅服务器。
allow_subscription_copy | bit | 指定是否已启用复制订阅数据库的能力。0 表示不允许复制。
allow_synctoalternate | bit | 指定是否允许可选同步伙伴与该发布服务器同步。0 表示不允许。
validate_subscriber_info | nvarchar(500) | 列出正用于检索订阅服务器信息和在订阅服务器上验证动态筛选准则的函数。
ad_guidname | sysname | 指定该发布是否在 Microsoft® Active Directory™ 中发布。有效的 GUID 指定该发布在 Microsoft Active Directory 中发布，并且该 GUID 是相应的 Active Directory 发布对象 objectGUID。如果为 NULL，则该发布不在 Microsoft Active Directory 中发布。
backward_comp_level | int | 数据库兼容级别（60、65、70 和 80）。
max_concurrent_merge | int | 最大的并发合并进程数。该属性值为 0 表示对在给定时间运行的并发合并进程数没有限制。该属性对可以同时在合并发布上运行的并发合并进程数设置限制。如果同时调度的快照进程数比允许运行的数多，则多出的作业将放置在队列中等待，直到当前正在运行的合并进程完成。
max_concurrent_dynamic_snapshots | int | 可以在合并发布上运行的最大并发动态快照会话数。若为 0，则对任何时间可以同时在发布上运行的最大并发动态快照会话数没有限制。该属性对可以同时在合并发布上运行的最大并发快照进程数设置限制。如果同时调度的快照进程数比允许运行的数多，则多出的作业将放置在队列中等待，直到当前正在运行的合并进程完成。


sysmergeschemaarticles

跟踪合并复制的纯架构项目。该表存储在发布和订阅数据库中。

列名 | 数据类型 | 描述
name | sysname | 合并复制中的纯架构项目的名称
type | tinyint | 表示纯架构项目类型的值： 0x20 = 存储过程纯架构项目。 0x40 = 视图纯架构项目或索引视图纯架构项目。
objid | int | 项目基对象的对象标识符。可以是过程、视图、索引视图或 UDF 的对象标识符。
artid | uniqueidentifier | 项目 ID。
description | nvarchar(255) | 对项目的描述。
pre_creation_command | tinyint | 指定如果应用快照时表已存在于订阅服务器中，系统所做的操作。 None = 如果表已存在于订阅服务器中，则不采取操作。 Delete = 基于子集筛选中的 WHERE 子句发出删除。 Drop（默认值） = 在重新创建表之前将其除去。 Truncate = 与 delete 相同，但是删除页而非行。不要使用 WHERE 子句。
pubid | uniqueidentifier | 该发布的唯一标识符。
status | tinyint | 用于表示项目状态的位图。
creation_script | nvarchar(255) | 用于创建目标表的可选项目架构预创建脚本的路径和名称。
schema_option | binary(8) | 表示将写入脚本的内容。给定项目的架构生成选项的位掩码。它指定在目的数据库中自动为所有 CALL/MCALL/XCALL 创建存储过程。
destination_object | sysname | 订阅数据库中的目的对象名称。该值仅适用于纯架构项目，例如存储过程、视图和 UDF。
destination_owner | sysname | 如果非 dbo，则为订阅数据库中的对象所有者。


sysmergeschemachange

包含有关快照代理程序生成的已发布项目的信息。该表存储在发布和订阅数据库中。

列名 | 数据类型 | 描述
pubid | uniqueidentifier | 发布的 ID
artid | uniqueidentifier | 项目的 ID
schemaversion | int | 上次架构的更改量
schemaguid | uniqueidentifier | 上次架构的唯一 ID
schematype | int | 架构的类型： 1 = 架构 2 = 系统架构 3 = 触发器脚本
schematext | nvarchar(255) | 脚本文件名，或包含文件名的命令


sysmergesubscriptions

每个已知订阅服务器在表中占一行，并且该表是发布服务器的本地表。该表存储在发布和订阅数据库中。

列名 | 数据类型 | 描述
subid | uniqueidentifier | 订阅的唯一标识号。
partnerid | uniqueidentifier | 订阅的合作者 ID。
datasource_type | int | 数据源类型： 0 = Microsoft SQL Server。 2 = Jet OLE DB。
datasource_path | nvarchar(255) | 如果是 Jet 数据源，则为 .mdb 文件的路径。
srvid | int | 包含 sysservers.srvguid，并与 db_name 一起使得可以在本地服务器标识订阅。
db_name | sysname | 订阅数据库的名称。
pubid | uniqueidentifier | 从其中创建当前订阅的发布 ID。
status | tinyint | 订阅的状态： 0 = 非活动。 1 = 活动。 2 = 已删除。
subscriber_type | int | 订阅服务器的类型： 1 = 全局。 2 = 本地。 3 = 匿名。
subscription_type | int | 订阅的类型： 0 = 强制。 1 = 请求。 2 = 匿名。
priority | real | 指定订阅优先级并允许实现基于优先级的冲突解决。所有本地或匿名订阅为 0.00。
sync_type | tinyint | 同步处理的类型： 1 = 自动。 2 = 不同步。
description | nvarchar(255) | 对订阅的简短描述。
login_name | sysname | 创建订阅的用户名。
last_validated | datetime | 上次对订阅服务器数据进行成功验证的时间。
subscriber_server | sysname | 服务器的 ID。将订阅数据库的复本迁移到其它服务器时，用于将 srvid 字段映射到服务器特有的值。
use_interactive_resolver | bit | 指定调和期间是否使用交互式冲突解决程序。若为 0，则不使用交互式冲突解决程序。
publication | sysname | 发布名。
distributor | sysname | 作为分发代理程序服务器的计算机名。
validation_level | int | 在订阅上执行的验证类型。指定的验证级别可以是下列值之一： 0 = 不验证。 1 = 只验证行数。 2 = 验证行数和校验值。 3 = 验证行数和二进制校验值。
resync_gen | int | 将用于订阅的重新同步的生成数。值 –1 值表示不将订阅标记为重新同步。
attempted_validate | datetime | 上次在订阅上尝试的验证的 datetime。
last_sync_date | datetime | 同步的 datetime。
last_sync_status | int | 订阅状态： 0 = 所有作业正等待启动。 1 = 一个或多个作业正在启动。 2 = 所有作业已成功执行。 3 = 至少一个作业正在执行。 4 = 所有作业都已调度并处于空闲。 5 = 在以前的失败后至少有一个作业正在尝试执行。 6 = 至少一个作业不能成功执行。
last_sync_summary | sysname | 对上次同步结果的描述。


sysmergesubsetfilters

包含分区项目的联接筛选信息。该表存储在发布和订阅数据库中。

列名 | 数据类型 | 描述
filtername | sysname | 用于创建项目的筛选名称。
join_filterid | int | 表示联接筛选的对象 ID。
pubid | uniqueidentifier | 发布的 ID。
artid | uniqueidentifier | 项目的 ID。
art_nickname | int | 项目的别名。
join_articlename | sysname | 表名，要联接该表名以确定行是否属于该表。
join_nickname | int | 表的别名，要联接该表别名以确定行是否属于该表。
join_unique_key | int | 表示 join_tablename 唯一键上的联接。 0 = 不是唯一键。 1 = 唯一键。
expand_proc | sysname | 存储过程名，合并代理程序用该存储过程识别需要从订阅服务器中发送或删除的行。
join_filterclause | nvarchar(1000) | 用于联接的筛选子句。


sysmessages

每个可由 Microsoft® SQL Server™ 返回的系统错误和警告分别占一行。SQL Server 在用户的屏幕上显示对错误的描述。

列名 | 数据类型 | 描述
error | int | 唯一错误号。
severity | smallint | 错误的严重级别。
dlevel | smallint | 仅限内部使用。
description | nvarchar(255) | 对参数占位符错误的解释。
mslangid | smallint | 系统消息组 ID。


sysnotifications

每个提示在表中占一行。

列名 | 数据类型 | 描述
alert_id | int | 警报 ID。
operator_id | int | 操作员 ID，应向该 ID 发送此提示。
notification_method | tinyint | 提示方式： 1 = 电子邮件 2 = 寻呼机 4 = netsend 7 = 全部


sysobjects

在数据库内创建的每个对象（约束、默认值、日志、规则、存储过程等）在表中占一行。只有在 tempdb 内，每个临时对象才在该表中占一行。

列名 | 数据类型 | 描述
name | sysname | 对象名。
Id | int | 对象标识号。
xtype | char(2) | 对象类型。可以是下列对象类型中的一种： C = CHECK 约束 D = 默认值或 DEFAULT 约束 F = FOREIGN KEY 约束 L = 日志 FN = 标量函数 IF = 内嵌表函数 P = 存储过程 PK = PRIMARY KEY 约束（类型是 K） RF = 复制筛选存储过程 S = 系统表 TF = 表函数 TR = 触发器 U = 用户表 UQ = UNIQUE 约束（类型是 K） V = 视图 X = 扩展存储过程
uid | smallint | 所有者对象的用户 ID。
info | smallint | 保留。仅限内部使用。
status | int | 保留。仅限内部使用。
base_schema_ ver | int | 保留。仅限内部使用。
replinfo | int | 保留。供复制使用。
parent_obj | int | 父对象的对象标识号（例如，对于触发器或约束，该标识号为表 ID）。
crdate | datetime | 对象的创建日期。
ftcatid | smallint | 为全文索引注册的所有用户表的全文目录标识符，对于没有注册的所有用户表则为 0。
schema_ver | int | 版本号，该版本号在每次表的架构更改时都增加。
stats_schema_ ver | int | 保留。仅限内部使用。
type | char(2) | 对象类型。可以是下列值之一： C = CHECK 约束 D = 默认值或 DEFAULT 约束 F = FOREIGN KEY 约束 FN = 标量函数 IF = 内嵌表函数 K = PRIMARY KEY 或 UNIQUE 约束 L = 日志 P = 存储过程 R = 规则 RF = 复制筛选存储过程 S = 系统表 TF = 表函数 TR = 触发器 U = 用户表 V = 视图 X = 扩展存储过程
userstat | smallint | 保留。
sysstat | smallint | 内部状态信息。
indexdel | smallint | 保留。
refdate | datetime | 留作以后使用。
version | int | 留作以后使用。
deltrig | int | 保留。
instrig | int | 保留。
updtrig | int | 保留。
seltrig | int | 保留。
category | int | 用于发布、约束和标识。
cache | smallint | 保留。


sysoledbusers

每个指定的链接服务器的用户和密码映射在表中占一行。该表存储在 master 数据库中。

列名 | 数据类型 | 描述
rmtsrvid | smallint | 服务器的 SID（安全标识号）。
rmtloginame | nvarchar(128) | loginsid 映射到的链接 rmtservid 的远程登录名。
rmtpassword | nvarchar(128) | 链接 rmtsrvid 内的指定远程登录的加密密码。
loginsid | varbinary(85) | 要映射的本地登录 SID。
status | smallint | 如果该值为 1，映射应使用用户自己的凭据。
changedate | datetime | 上次更改映射信息的日期。


sysopentapes

当前打开的每个磁带设备在表中占一行。该视图存储在 master 数据库中。

列名 | 数据类型 | 描述
openTape | nvarchar(64) NOT NULL | 打开的磁带设备的物理文件名。有关打开和释放磁带设备的更多信息，请参见 BACKUP 和 RESTORE。


sysoperators

每个操作员在表中占一行。

列名 | 数据类型 | 描述
id | int | 操作员 ID。
name | sysname | 操作员名称。
enabled | tinyint | 警报提示的状态（布尔表达式）。如果为 1，则该操作员会在警报发生时收到提示。
email_address | nvarchar(100) | 该操作员的电子邮件地址。
last_email_date | int | 该操作员上次接收电子邮件警报提示的日期。
last_email_time | int | 该操作员上次接收电子邮件警报提示的时间。
pager_address | nvarchar(100) | 该操作员的呼叫程序地址。
last_pager_date | int | 该操作员上次接收呼叫警报提示的日期。
last_pager_time | int | 该操作员上次接收呼叫警报提示的时间。
weekday_pager_ start_time | int | 工作日（从星期一到星期五）的当天时间，该操作员在该时间后可以接收呼叫警报提示。
weekday_pager_ end_time | int | 工作日（从星期一到星期五）的当天时间，该操作员在该时间后不能接收呼叫警报提示。
saturday_pager_ start_time | int | 星期六的当天时间，该操作员在该时间后可以接收呼叫警报提示。
saturday_pager_ end_time | int | 星期六的当天时间，该操作员在该时间后不能接收呼叫警报提示。
sunday_pager_ start_time | int | 星期日的当天时间，该操作员在该时间后可以接收呼叫警报提示。
sunday_pager_ end_time | int | 星期日的当天时间，该操作员在该时间后不能接收呼叫警报提示。
pager_days | tinyint | 表示一周中某几天的位掩码，该操作员在这几天内可以接收呼叫警报提示。
netsend_address | nvarchar(100) | 保留。
last_netsend_ date | int | 上次将最新网络消息发送到指定操作员 ID 的日期。
last_netsend_ time | int | 上次将最新网络消息发送到指定操作员 ID 的时间。
category_id | int | 保留。


sysperfinfo

包括一个 Microsoft® SQL Server™ 表示法的内部性能计数器，可通过 Windows NT 性能监视器显示。

说明 Windows NT 性能监视器只有在使用 Microsoft Windows NT® 4.0 作为操作系统时才可用。

性能条件警报只供最前面的 99 个数据库使用。接在最前面的 99 个数据库之后创建的任何数据库都不会包括在 sysperfinfo 系统表中，并且，使用 sp_add_alert 过程会返回一个错误。

列名 | 数据类型 | 描述
object_name | nchar(128) | 性能对象名，如 SQL Server：锁管理器或 SQL Server：缓冲区管理器。
counter_name | nchar(128) | 对象内的性能计数器名称，如页请求或请求的锁。
instance_name | nchar(128) | 计数器的命名实例。例如，有为各类型的锁（如表锁、页锁、键锁等）维护的计数器。实例名在相似的计数器之间是有区别的。
cntr_value | int | 实际计数器值。大多数情况下，该值是一个级别或对实例事件发生进行计数的单调递增计数器。
cntr_type | int | Windows NT 4.0 性能构架定义的计数器类型。


syspermissions

包含有关对数据库内的用户、组和角色授予和拒绝的权限的信息。该表存储在每个数据库中。

列名 | 数据类型 | 描述
id | int | 对象权限的对象 ID；0 表示语句权限。
grantee | smallint | 受权限影响的用户、组或角色的 ID。
grantor | smallint | 被授予或废除权限的用户、组或角色的 ID。
actadd | smallint | 仅限内部使用。
actmod | smallint | 仅限内部使用。
seladd | varbinary(4000) | 仅限内部使用。
selmod | varbinary(4000) | 仅限内部使用。
updadd | varbinary(4000) | 仅限内部使用。
updmod | varbinary(4000) | 仅限内部使用。
refadd | varbinary(4000) | 仅限内部使用。
refmod | varbinary(4000) | 仅限内部使用。


sysprocesses

sysprocesses 表中保存关于运行在 Microsoft® SQL Server™ 上的进程的信息。这些进程可以是客户端进程或系统进程。sysprocesses 只存储在 master 数据库中。

列名 | 数据类型 | 描述
spid | smallint | SQL Server 进程 ID。
kpid | smallint | Microsoft Windows NT 4.0® 线程 ID。
blocked | smallint | 分块进程的进程 ID (spid)。
waittype | binary(2) | 保留。
waittime | int | 当前等待时间（以毫秒为单位）。当进程不处于等待时，为 0。
lastwaittype | nchar(32) | 表示上次或当前等待类型名称的字符串。
waitresource | nchar(32) | 锁资源的文本化表示法。
dbid | smallint | 当前正由进程使用的数据库 ID。
uid | smallint | 执行命令的用户 ID。
cpu | int | 进程的累计 CPU 时间。无论 SET STATISTICS TIME ON 选项是 ON 还是 OFF，都为所有进程更新该条目。
physical_io | int | 进程的累计磁盘读取和写入。
memusage | int | 当前分配给该进程的过程高速缓存中的页数。一个负数，表示进程正在释放由另一个进程分配的内存。
login_time | datetime | 客户端进程登录到服务器的时间。对于系统进程，是存储 SQL Server 启动发生的时间。
last_batch | datetime | 客户端进程上次执行远程存储过程调用或 EXECUTE 语句的时间。对于系统进程，是存储 SQL Server 启动发生的时间。
ecid | smallint | 用于唯一标识代表单个进程进行操作的子线程的执行上下文 ID。
open_tran | smallint | 进程的打开事务数。
status | nchar(30) | 进程 ID 状态（如运行、休眠等）。
sid | binary(85) | 用户的全局唯一标识符 (GUID)。
hostname | nchar(128) | 工作站的名称。
program_name | nchar(128) | 应用程序的名称。
hostprocess | nchar(8) | 工作站进程 ID 号。
cmd | nchar(16) | 当前正在执行的命令。
nt_domain | nchar(128) | 客户端的 Windows NT 4.0 域（如果使用 Windows 身份验证）或信任连接的 Windows NT 4.0 域。
nt_username | nchar(128) | 进程的 Windows NT 4.0用户名（如果使用 Windows 身份验证）或信任连接的 Windows NT 4.0 用户名。
net_address | nchar(12) | 指派给每个用户工作站上的网络接口卡唯一标识符。当用户登录时，该标识符插入 net_address 列。
net_library | nchar(12) | 用于存储客户端网络库的列。每个客户端进程都在网络连接上进入。网络连接有一个与这些进程关联的网络库，该网络库使得这些进程可以建立连接。有关更多信息，请参见客户端和服务器 Net-Library。
loginame | nchar(128) | 登录名。


sysprotects

包含有关已由 GRANT 和 DENY 语句应用于安全帐户的权限的信息。该表存储在每个数据库中。

列名 | 数据类型 | 描述
id | int | 将这些权限应用于的对象 ID。
uid | smallint | 将这些权限应用于的用户或组的 ID。
action | tinyint | 可以有下列权限之一： 26 = REFERENCES 178 = CREATE FUNCTION 193 = SELECT 195 = INSERT 196 = DELETE 197 = UPDATE 198 = CREATE TABLE 203 = CREATE DATABASE 207 = CREATE VIEW 222 = CREATE PROCEDURE 224 = EXECUTE 228 = BACKUP DATABASE 233 = CREATE DEFAULT 235 = BACKUP LOG 236 = CREATE RULE
protecttype | tinyint | 可以有下列值： 204 = GRANT_W_GRANT 205 = GRANT 206 = REVOKE
columns | varbinary(4000) | 将这些 SELECT 或 UPDATE 权限应用于的列的位图。位 0 表示所有的列，位 1 表示权限应用于该列，NULL 表示没有信息。
grantor | smallint | 发出 GRANT 或 REVOKE 权限的用户的用户 ID。


syspublications

数据库内定义的每个发布在表中占一行。该表存储在发布数据库中。

列名 | 数据类型 | 描述
description | nvarchar(255) | 发布的描述项。
name | sysname | 与发布关联的唯一名称。
pubid | int | 为发布提供唯一 ID 的标识列。
repl_freq | tinyint | 复制频率： 0 = 基于事务。 1 = 调度表刷新。
status | tinyint | 状态: 0 = 非活动。 1 = 活动。
sync_method | tinyint | 同步方法： 0 = 本机大容量复制程序（bcp 实用工具）。 1 = 字符大容量复制。 3 = 并发，表示在快照期间使用本机大容量复制（bcp 实用工具）但不锁定表。 4 = Concurrent_c，表示在快照期间使用字符大容量复制但不锁定表。
snapshot_jobid | binary(16) | 已调度任务 ID。
independent_ agent | bit | 指定是否有用于该发布的独立分发代理程序。 0 = 该发布使用共享的分发代理程序，每对发布服务器数据库/订阅服务器数据库都有一个共享的代理程序。 1 = 有用于该发布的独立分发代理程序。
immediate_sync | bit | 表示每次运行快照代理程序时是否都创建或重新创建同步文件。
enabled_for_ internet | bit | 表示是否通过 FTP 和其它服务将发布的同步文件表现到 Internet 上。
allow_push | bit | 表示该发布是否允许强制订阅。
allow_pull | bit | 表示该发布是否允许请求订阅。
allow_anonymous | bit | 表示该发布是否允许匿名订阅。
immediate_sync_ ready | bit | 表示快照代理程序是否已生成快照且该快照是否准备好用于新的订阅。仅对于即时更新发布才有意义。0 表示快照还没有准备好。
allow_sync_tran | bit | 指定是否允许在发布上使用即时更新订阅。0 表示不允许即时更新订阅。
autogen_sync_ procs | bit | 指定是否在发布服务器上为即时更新订阅生成同步存储过程。1 表示在发布服务器上生成同步存储过程。
retention | int | 为给定的发布保存的更改量（以小时为单位）。
allowed_queued_tran | bit | 指定是否已启用在订阅服务器上禁用更改排队直到这些更改可以应用到发布服务器。如果是 0，则不排队订阅服务器上的更改。
snapshot_in_defaultfolder | bit | 指定是否在默认文件夹中存储快照文件。如果是 0，则表示快照文件已存储在 alternate_snapshot_folder 所指定的备用位置。如果是 1，则可以在默认文件夹中找到快照文件。
alt_snapshot_folder | nvarchar(255) | 指定快照的备用文件夹的位置。
pre_snapshot_script | nvarchar(255) | 指定指向 .sql 文件位置的指针。在订阅服务器上应用快照时，分发代理程序将在运行任何复制的对象脚本之前运行快照前脚本。
post_snapshot_script | nvarchar(255) | 指定指向 .sql 文件位置的指针。分发代理程序将在初始同步过程中已应用所有其它复制的对象脚本和数据之后才运行快照后脚本。
compress_snapshot | bit | 指定将写入 @alt_snapshot_folder 位置的快照压缩为 Microsoft® CAB 格式。0 指定不压缩快照。
ftp_address | sysname | 分发服务器的 FTP 服务的网络地址。指定供订阅服务器的分发代理程序或合并代理程序获取的发布快照文件的位置。
ftp_port | int | 分发服务器的 FTP 服务的端口号。指定供订阅服务器的分发代理程序或合并代理程序获取的发布快照文件的位置。
ftp_subdirectory | nvarchar(255) | 指定供订阅服务器的分发代理程序或合并代理程序获取的快照文件的位置（如果发布支持使用 FTP 传播快照）。
ftp_login | sysname | 用于连接到 FTP 服务的用户名。
ftp_password | nvarchar(524) | 用于连接到 FTP 服务的用户密码。
allow_dts | bit | 指定发布允许数据转换。0 指定不允许 DTS 转换。
allow_subscription_copy | bit | 指定是否已启用复制订阅该发布的订阅数据库的能力。0 表示不允许复制。
centralized_conflicts | bit | 指定冲突记录是否存储在发布服务器上： 0 = 在引起冲突的发布服务器和订阅服务器上都存储冲突记录。 1 = 在发布服务器上存储冲突记录。
conflict_retention | int | 指定冲突保持期（以天为单位）。
conflict_policy | int | 指定使用排队更新订阅服务器选项时遵循的冲突解决策略。可以是下列值之一： 发布服务器在冲突中获胜。 订阅服务器在冲突中获胜。 3 = 重新初始化订阅。
queue_type | int | 指定所使用的队列类型。可以是下列值之一： msmq = 使用 Microsoft 消息队列存储事务。 sql = 使用 SQL Server 存储事务。 NULL = 默认为 sql，表示指定使用 SQL Server 存储事务。
ad_guidname | sysname | 指定是否在 Microsoft Active Directory 中发布发布内容。有效的全局唯一标识符 (GUID) 指定在 Microsoft Active Directory 中发布发布内容，且 GUID 是相应的 Active Directory 发布对象 objectGUID。如果为 NULL，则不在 Microsoft Active Directory 中发布发布内容。
backward_comp_level | int | 数据库兼容级别（60、65、70 和 80）。


sysreferences

包括 FOREIGN KEY 约束定义到所引用列的映射。该表存储在每个数据库中。

列名 | 数据类型 | 描述
constid | int | FOREIGN KEY 约束的 ID
fkeyid | int | 引用表的 ID
rkeyid | int | 被引用表的 ID
rkeyindid | smallint | 涵盖被引用键列的被引用表上唯一索引的索引 ID
keycnt | smallint | 键中的列数
forkeys | varbinary(32) | 仅限内部使用
refkeys | varbinary(32) | 仅限内部使用
fkeydbid | smallint | 保留
rkeydbid | smallint | 保留
fkey1 | smallint | 引用列的列 ID
fkey2 | smallint | 引用列的列 ID
fkey3 | smallint | 引用列的列 ID
fkey4 | smallint | 引用列的列 ID
fkey5 | smallint | 引用列的列 ID
fkey6 | smallint | 引用列的列 ID
fkey7 | smallint | 引用列的列 ID
fkey8 | smallint | 引用列的列 ID
fkey9 | smallint | 引用列的列 ID
fkey10 | smallint | 引用列的列 ID
fkey11 | smallint | 引用列的列 ID
fkey12 | smallint | 引用列的列 ID
fkey13 | smallint | 引用列的列 ID
fkey14 | smallint | 引用列的列 ID
fkey15 | smallint | 引用列的列 ID
fkey16 | smallint | 引用列的列 ID
rkey1 | smallint | 引用列的列 ID
rkey2 | smallint | 引用列的列 ID
rkey3 | smallint | 引用列的列 ID
rkey4 | smallint | 引用列的列 ID
rkey5 | smallint | 引用列的列 ID
rkey6 | smallint | 引用列的列 ID
rkey7 | smallint | 引用列的列 ID
rkey8 | smallint | 引用列的列 ID
rkey9 | smallint | 引用列的列 ID
rkey10 | smallint | 引用列的列 ID
rkey11 | smallint | 引用列的列 ID
rkey12 | smallint | 引用列的列 ID
rkey13 | smallint | 引用列的列 ID
rkey14 | smallint | 引用列的列 ID
rkey15 | smallint | 引用列的列 ID
rkey16 | smallint | 引用列的列 ID


sysremotelogins

每个允许调用 Microsoft® SQL Server™ 上的远程存储过程的远程用户占一行。

列名 | 数据类型 | 描述
remoteserverid | smallint | 远程服务器标识。
remoteusername | nvarchar(128) | 远程服务器上的用户登录名。
status | smallint | 选项的位图。
sid | varbinary(85) | Microsoft Windows NT® 用户安全 ID。
changedate | datetime | 添加远程用户的日期和时间。


sysreplicationalerts

包含有关导致复制警报激发的条件的信息。该表存储在 msdb 数据库中。

列名 | 数据类型 | 描述
alert_id | int | 警报 ID。
status | int | 用户定义值： 0 = 未服务 1 = 已服务
agent_type | int | 代理程序类型： 1 = 快照代理程序 2 = 日志读取器代理程序 3 = 分发代理程序 4 = 合并代理程序
agent_id | int | 表 MSsnapshot_agents、MSlogreader_agents、MSdistribution_agents 或 MSmerge_agents 中的代理程序 ID。
error_id | int | 存储于 MSrepl_errors 中的错误 ID。
alert_error_code | int | 将此记录记入日志时所引发警报的消息 ID。
time | datetime | 插入记录的时间。
publisher | sysname | 与激发此警报的代理程序相关联的发布服务器的名称。
publisher_db | sysname | 与激发此警报的代理程序相关联的发布服务器数据库。
publication | sysname | 与激发此警报的代理程序相关联的发布。
publication_type | int | 发布类型： 0 = 快照 1 = 事务 2 = 合并
subscriber | sysname | 与激发此警报的代理程序相关联的订阅服务器的名称。
subscriber_db | sysname | 与激发此警报的代理程序相关联的订阅服务器数据库的名称。
article | sysname | 与激发此警报的代理程序相关联的项目的名称。
destination_ object | sysname | 与此警报相关联的订阅表的名称。
source_object | sysname | 与此警报相关联的已发布表的名称。
alert_error_text | ntext | 警报的文本。


sysschemaarticles

跟踪事务和快照发布的纯架构项目。该表存储在发布数据库中。

列名 | 数据类型 | 描述
artid | int | 项目 ID。
creation_script | nvarchar(255) | 用于创建目标表的项目架构脚本的路径和名称。
description | nvarchar(255) | 项目的描述项。
dest_object | sysname | 如果项目是纯架构项目，则为订阅数据库中的对象名称，如存储过程、视图或 UDF。
name | sysname | 发布中的纯架构项目的名称。
objid | int | 项目基对象的对象标识符。可以是过程、视图、索引视图或 UDF 的对象标识符。
pubid | int | 发布的 ID。
pre_creation_cmd | tinyint | 指定当应用该项目的快照时，如果系统在订阅服务器上检测到同名的现有对象，系统应采取什么操作： 0 = 无。 1 = 删除目的表。 2 = 除去目的表。 3 = 截断目的表。
status | int | 用于表示项目状态的位图。
type | tinyint | 表示纯架构项目类型的值： 0x20 = 存储过程纯架构项目。 0x40 = 视图纯架构项目或索引视图纯架构项目。
schema_option | binary(8) | 给定项目的架构生成选项的位掩码。它指定在目的数据库中为所有的 CALL/MCALL/XCALL 自动创建存储过程。可以是下列值之一： 0x00 = 禁用通过快照代理程序生成脚本并使用 creation_script。 0x01 = 生成对象创建（CREATE TABLE、CREATE PROCEDURE 等等）。该值是存储过程项目的默认值。 0x02 = 生成项目的自定义存储过程（如果已定义）。 0x10 = 生成对应的聚集索引。 0x20 = 将用户定义数据类型转换为基本数据类型。 0x40 = 生成对应的非聚集索引。 0x80 = 在主键上包含声明引用完整性。 0x73 = 生成 CREATE TABLE 语句，创建聚集索引和非聚集索引，将用户定义数据类型转换为基本数据类型，以及生成要在订阅服务器上应用的自定义存储过程脚本。该值是除存储过程项目外的所有项目的默认值。 0x100 = 如果已定义，则复制表项目上的用户触发器。 0x200 = 复制外键约束。如果引用的表不是发布的一部分，将不复制发布表上的所有外键约束。 0x400 = 复制检查约束。 0x800= 复制默认值。 0x1000 = 复制列级排序规则。 0x2000 = 复制与已发布项目源对象关联的扩展属性。 0x4000 = 如果在表项目上定义，则复制唯一键。 0x8000 = 使用 ALTER TABLE 语句将表项目上的主键和唯一键作为约束复制。
dest_owner | sysname | 该表在目的数据库中的所有者。

sysservers

每个可由 Microsoft® SQL Server™ 作为 OLE DB 数据源访问的服务器在表中占一行。

列名 | 数据类型 | 描述
srvid | smallint | 远程服务器的 ID（只限本地使用）。
srvstatus | smallint | 仅限内部使用。
srvname | sysname | 服务器的名称。
srvproduct | nvarchar(128) | 远程服务器的产品名。
providername | nvarchar(128) | 用于访问此服务器的 OLE DB 提供程序名称。
datasource | nvarchar(4000) | OLE DB 数据源值。
location | nvarchar(4000) | OLE DB 位置值。
providerstring | nvarchar(4000) | OLE DB 提供程序字符串值。
schemadate | datetime | 此行的最新更新日期。
topologyx | int | 由 SQL Server 企业管理器服务器拓扑关系图使用。
topologyy | int | 由 SQL Server 企业管理器服务器拓扑关系图使用。
catalog | sysname | 与 OLE DB 提供程序进行连接时所使用的目录。
connecttimeout | int | 服务器连接的超时设置。
querytimeout | int | 对服务器的查询的超时设置。
srvnetname | char(30) | 保留（目前与 srvname 相同）。
isremote | bit | 如果服务器是远程服务器，则为 1；如果服务器是链接服务器，则为 0。
rpc | bit | 如果 sp_serveroption rpc 设置为 true/false，则为 1/0。
pub | bit | 如果 sp_serveroption rpc 设置为 true/false，则为 1/0。
sub | bit | 如果 sp_serveroption rpc 设置为 true/false，则为 1/0。
dist | bit | 如果 sp_serveroption dist 设置为 true/false，则为 1/0。
dpub | bit | 如果 sp_serveroption dpub 设置为 true/false，则为 1/0。
rpcout | bit | 如果 sp_serveroption rpc out 设置为 true/false，则为 1/0。
dataaccess | bit | 如果 sp_serveroption data access 设置为 true/false，则为 1/0。
collationcompatible | bit | 如果 collation compatible 设置为 true/false，则为 1/0。
system | bit | 如果 sp_serveroption system 设置为 true/false，则为 1/0。
useremotecollation | bit | 如果 use remote collation 设置为 true/false，则为 1/0。
lazyschemavalidation | bit | 如果 sp_serveroption lazy schema validation 设置为 true/false，则为 1/0。
collation | sysname | sp_serveroption collation name 设置的服务器排序规则。


syssubscriptions

对于该数据库中的每份订阅均包含一行信息。该表存储在发布数据库中。

列名 | 数据类型 | 描述
artid | int | 项目的唯一 ID
srvid | smallint | 订阅服务器的服务器 ID
dest_db | sysname | 目的数据库的名称
status | tinyint | 状态: 0 = 非活动 1 = 已订阅 2 = 活动
sync_type | tinyint | 同步处理的类型： 1 = 自动 2 = 无
login_name | sysname | 添加订阅时使用的登录名
subscription_type | int | 订阅的类型： 0 = 强制 1 = 请求
distribution_jobid | binary(16) | 分发代理程序的作业 ID
timestamp | timestamp | 时间戳
update_mode | tinyint | 更新模式： 0 = 只读 1 = 即时更新
loopback_detection | bit | 分发代理程序是否将在订阅服务器发起的事务发回订阅服务器： True = 不发回 False = 发回
queued_reinit | bit | 指定是否将项目标记为初始化或重新初始化。值 1 指定将订阅的项目标记为初始化或重新初始化。


systargetservergroupmembers

记录此多服务器组中当前所登记的目标服务器。

列名 | 数据类型 | 描述
servergroup_id | int | 服务器组 ID
server_id | int | 服务器 ID


systargetservergroups

记录此多服务器环境中当前所登记的目标服务器组。

列名 | 数据类型 | 描述
servergroup_id | int | 服务器组 ID
name | sysname | 服务器组名称


systargetservers

记录此多服务器操作域中当前所登记的目标服务器。

列名 | 数据类型 | 描述
server_id | int | 服务器 ID。
server_name | nvarchar(30) | 服务器名称。
location | nvarchar(200) | 指定目标服务器的位置。
time_zone_ adjustment | int | 与格林威治标准时间 (GMT) 之间的时差调整量（以小时为单位）。
enlist_date | datetime | 指定目标服务器的登记日期和时间。
last_poll_date | datetime | 指定目标服务器上一次为查找待运行作业而轮询多服务器的 sysdownloadlist 系统表的日期和时间。
status | int | 目标服务器的状态： 1 = 普通 2 = 重新同步挂起 4 = 置疑脱机
local_time_at_ last_poll | datetime | 上一次轮询目标服务器作业操作的日期和时间。
enlisted_by_nt_ user | nvarchar(100) | 在目标服务器上执行 sp_msx_enlist 的人员的用户名。
poll_internal | int | 目标服务器为获得新下载指令而轮询主服务器前要经过的秒数。


systaskids

包含一个映射，该映射将早期版本 Microsoft® SQL Server™ 创建的任务映射到当前版本的 SQL Server 企业管理器作业。该表存储在 msdb 数据库中。

列名 | 数据类型 | 描述
task_id | int | 任务 Id
job_id | uniqueidentifier | 任务所映射到的作业 Id


systypes

对于每种系统提供数据类型和用户定义数据类型，均包含一行信息。该表存储在每个数据库中。

这些是系统提供的数据类型及其 ID 号。

列名 | 数据类型 | 描述
name | sysname | 数据类型名称。
xtype | tinyint | 物理存储类型。
status | tinyint | 仅限内部使用。
xusertype | smallint | 扩展用户类型。
length | smallint | 数据类型的物理长度。
xprec | tinyint | 服务器所使用的内部精度。（不能在查询中使用。）
xscale | tinyint | 服务器所使用的内部小数位数。（不能在查询中使用。）
tdefault | int | 对此数据类型进行完整性检查的存储过程的 ID。
domain | int | 对此数据类型进行完整性检查的存储过程的 ID。
uid | smallint | 数据类型创建者的用户 ID。
reserved | smallint | 仅限内部使用。
usertype | smallint | 用户类型 ID。
variable | bit | 可变长度数据类型为 1；否则为 0。
allownulls | bit | 指出此数据类型的默认为空性。如果 CREATE 或 ALTER TABLE 指定了为空性，那么该值将替代此数据类型的默认为空性。
type | tinyint | 物理存储数据类型。
printfmt | varchar(255) | 保留。
prec | smallint | 此数据类型的精度级别。
scale | tinyint | 此数据类型的小数位数（根据精度）。


sysusers

数据库中每个 Microsoft® Windows 用户、Windows 组、Microsoft SQL Server™ 用户或 SQL Server 角色在表中占一行。

列名 | 数据类型 | 描述
uid | smallint | 用户 ID，在此数据库中是唯一的。1 是数据库所有者。
status | smallint | 仅限内部使用。
Name | sysname | 用户名或组名，在此数据库中是唯一的。
sid | varbinary(85) | 此条目的安全性标识符。
roles | varbinary(2048) | 仅限内部使用。
createdate | datetime | 帐户的添加日期。
updatedate | datetime | 帐户的上次修改日期。
altuid | smallint | 仅限内部使用。
password | varbinary(256) | 仅限内部使用。
gid | smallint | 此用户所属的组 ID。如果 uid = gid，那么此条目就定义一个组。
environ | varchar(255) | 保留。
hasdbaccess | int | 如果该帐户有数据库访问权限，则为 1。
islogin | int | 如果该帐户是有登录帐户的 Windows 组、Windows 用户或 SQL Server 用户，则为 1。
isntname | int | 如果该帐户是 Windows 组或 Windows 用户，则为 1。
isntgroup | int | 如果该帐户是 Windows 组，则为 1。
isntuser | int | 如果该帐户是 Windows 用户，则为 1。
issqluser | int | 如果该帐户是 SQL Server 用户，则为 1。
isaliased | int | 如果该帐户以另一个用户为别名，则为 1。
issqlrole | int | 如果该帐户是 SQL Server 角色，则为 1。
isapprole | int | 如果该帐户是应用程序角色，则为 1。


系统存储过程

在 Microsoft® SQL Server™ 中，许多管理和信息活动可以通过系统存储过程执行。系统存储过程按这些分类分组。

分类 | 描述
Active Directory 过程 | 用于在 Microsoft Windows® 2000 Active Directory™ 中注册 SQL Server 实例和 SQL Server 数据库。
目录过程 | 执行 ODBC 数据字典功能，并隔离 ODBC 应用程序，使之不受基础系统表更改的影响。
游标过程 | 执行游标变量功能。
数据库维护计划过程 | 用于设置确保数据库性能所需的核心维护任务。
分布式查询过程 | 用于执行和管理分布式查询。
全文检索过程 | 用于执行和查询全文索引。
日志传送过程 | 用于配置和管理日志传送。
OLE 自动化过程 | 允许在标准 Transact-SQL 批处理中使用标准 OLE 自动化对象。
复制过程 | 用于管理复制。
安全过程 | 用于管理安全性。
SQL 邮件过程 | 用于从 SQL Server 内执行电子邮件操作。
SQL 事件探查器过程 | 由 SQL 事件探查器用于监视性能和活动。
SQL Server 代理程序过程 | 由 SQL Server 代理程序用于管理调度的活动和事件驱动活动。
系统过程 | 用于 SQL Server 的常规维护。
Web 助手过程 | 由 Web 助手使用。
XML 过程 | 用于可扩展标记语言 (XML) 文本管理。
常规扩展过程 | 提供从 SQL Server 到外部程序的接口，以便进行各种维护活动。

说明 除非特别指明，所有系统存储过程返回 0 值表示成功，返回非零值则表示失败。

Active Directory 过程
sp_ActiveDirectory_Obj sp_ActiveDirectory_SCP

目录过程
sp_column_privileges | sp_special_columns
sp_columns | sp_sproc_columns
sp_databases | sp_statistics
sp_fkeys | sp_stored_procedures
sp_pkeys | sp_table_privileges
sp_server_info | sp_tables

游标过程
sp_cursor_list | sp_describe_cursor_columns
sp_describe_cursor | sp_describe_cursor_tables

数据库维护计划过程
sp_add_maintenance_plan | sp_delete_maintenance_plan_db
sp_add_maintenance_plan_db | sp_delete_maintenance_plan_job
sp_add_maintenance_plan_job | sp_help_maintenance_plan
sp_delete_maintenance_plan |

分布式查询过程
sp_addlinkedserver | sp_indexes
sp_addlinkedsrvlogin | sp_linkedservers
sp_catalogs | sp_primarykeys
sp_column_privileges_ex | sp_serveroption
sp_columns_ex | sp_table_privileges_ex
sp_droplinkedsrvlogin | sp_tables_ex
sp_foreignkeys |

全文检索过程
sp_fulltext_catalog | sp_help_fulltext_catalogs_cursor
sp_fulltext_column | sp_help_fulltext_columns
sp_fulltext_database | sp_help_fulltext_columns_cursor
sp_fulltext_service | sp_help_fulltext_tables
sp_fulltext_table | sp_help_fulltext_tables_cursor
sp_help_fulltext_catalogs |

日志传送过程
sp_add_log_shipping_database | sp_delete_log_shipping_database
sp_add_log_shipping_plan | sp_delete_log_shipping_plan
sp_add_log_shipping_plan_database | sp_delete_log_shipping_plan_database
sp_add_log_shipping_primary | sp_delete_log_shipping_primary
sp_add_log_shipping_secondary | sp_delete_log_shipping_secondary
sp_can_tlog_be_applied | sp_get_log_shipping_monitor_info
sp_change_monitor_role | sp_remove_log_shipping_monitor
sp_change_primary_role | sp_resolve_logins
sp_change_secondary_role | sp_update_log_shipping_monitor_info
sp_create_log_shipping_monitor_account | sp_update_log_shipping_plan
sp_define_log_shipping_monitor | sp_update_log_shipping_plan_database

OLE 自动化扩展存储过程
sp_OACreate | sp_OAMethod
sp_OADestroy | sp_OASetProperty
sp_OAGetErrorInfo | sp_OAStop
sp_OAGetProperty | Object Hierarchy Syntax

复制过程
sp_add_agent_parameter | sp_enableagentoffload
sp_add_agent_profile | sp_enumcustomresolvers
sp_addarticle | sp_enumdsn
sp_adddistpublisher | sp_enumfullsubscribers
sp_adddistributiondb | sp_expired_subscription_cleanup
sp_adddistributor | sp_generatefilters
sp_addmergealternatepublisher | sp_getagentoffloadinfo
sp_addmergearticle | sp_getmergedeletetype
sp_addmergefilter | sp_get_distributor
sp_addmergepublication | sp_getqueuedrows
sp_addmergepullsubscription | sp_getsubscriptiondtspackagename
sp_addmergepullsubscription_agent | sp_grant_publication_access
sp_addmergesubscription | sp_help_agent_default
sp_addpublication | sp_help_agent_parameter
sp_addpublication_snapshot | sp_help_agent_profile
sp_addpublisher70 | sp_helparticle
sp_addpullsubscription | sp_helparticlecolumns
sp_addpullsubscription_agent | sp_helparticledts
sp_addscriptexec | sp_helpdistpublisher
sp_addsubscriber | sp_helpdistributiondb
sp_addsubscriber_schedule | sp_helpdistributor
sp_addsubscription | sp_helpmergealternatepublisher
sp_addsynctriggers | sp_helpmergearticle
sp_addtabletocontents | sp_helpmergearticlecolumn
sp_adjustpublisheridentityrange | sp_helpmergearticleconflicts
sp_article_validation | sp_helpmergeconflictrows
sp_articlecolumn | sp_helpmergedeleteconflictrows
sp_articlefilter | sp_helpmergefilter
sp_articlesynctranprocs | sp_helpmergepublication
sp_articleview | sp_helpmergepullsubscription
sp_attachsubscription | sp_helpmergesubscription
sp_browsesnapshotfolder | sp_helppublication
sp_browsemergesnapshotfolder | sp_help_publication_access
sp_browsereplcmds | sp_helppullsubscription
sp_change_agent_parameter | sp_helpreplfailovermode
sp_change_agent_profile | sp_helpreplicationdboption
sp_changearticle | sp_helpreplicationoption
sp_changedistpublisher | sp_helpsubscriberinfo
sp_changedistributiondb | sp_helpsubscription
sp_changedistributor_password | sp_ivindexhasnullcols
sp_changedistributor_property | sp_helpsubscription_properties
sp_changemergearticle | sp_link_publication
sp_changemergefilter | sp_marksubscriptionvalidation
sp_changemergepublication | sp_mergearticlecolumn
sp_changemergepullsubscription | sp_mergecleanupmetadata
sp_changemergesubscription | sp_mergedummyupdate
sp_changepublication | sp_mergesubscription_cleanup
sp_changesubscriber | sp_publication_validation
sp_changesubscriber_schedule | sp_refreshsubscriptions
sp_changesubscriptiondtsinfo | sp_reinitmergepullsubscription
sp_changesubstatus | sp_reinitmergesubscription
sp_change_subscription_properties | sp_reinitpullsubscription
sp_check_for_sync_trigger | sp_reinitsubscription
sp_copymergesnapshot | sp_removedbreplication
sp_copysnapshot | sp_repladdcolumn
sp_copysubscription | sp_replcmds
sp_deletemergeconflictrow | sp_replcounters
sp_disableagentoffload | sp_repldone
sp_drop_agent_parameter | sp_repldropcolumn
sp_drop_agent_profile | sp_replflush
sp_droparticle | sp_replicationdboption
sp_dropanonymouseagent | sp_replication_agent_checkup
sp_dropdistpublisher | sp_replqueuemonitor
sp_dropdistributiondb | sp_replsetoriginator
sp_dropmergealternatepublisher | sp_replshowcmds
sp_dropdistributor | sp_repltrans
sp_dropmergearticle | sp_restoredbreplication
sp_dropmergefilter | sp_revoke_publication_access
 | sp_scriptsubconflicttable
sp_dropmergepublication | sp_script_synctran_commands
sp_dropmergepullsubscription | sp_setreplfailovermode
 | sp_showrowreplicainfo
sp_dropmergesubscription | sp_subscription_cleanup
sp_droppublication | sp_table_validation
sp_droppullsubscription | sp_update_agent_profile
sp_dropsubscriber | sp_validatemergepublication
sp_dropsubscription | sp_validatemergesubscription
sp_dsninfo | sp_vupgrade_replication
sp_dumpparamcmd |

安全过程
sp_addalias | sp_droprolemember
sp_addapprole | sp_dropserver
sp_addgroup | sp_dropsrvrolemember
sp_addlinkedsrvlogin | sp_dropuser
sp_addlogin | sp_grantdbaccess
sp_addremotelogin | sp_grantlogin
sp_addrole | sp_helpdbfixedrole
sp_addrolemember | sp_helpgroup
sp_addserver | sp_helplinkedsrvlogin
sp_addsrvrolemember | sp_helplogins
sp_adduser | sp_helpntgroup
sp_approlepassword | sp_helpremotelogin
sp_changedbowner | sp_helprole
sp_changegroup | sp_helprolemember
sp_changeobjectowner | sp_helprotect
sp_change_users_login | sp_helpsrvrole
sp_dbfixedrolepermission | sp_helpsrvrolemember
sp_defaultdb | sp_helpuser
sp_defaultlanguage | sp_MShasdbaccess
sp_denylogin | sp_password
sp_dropalias | sp_remoteoption
sp_dropapprole | sp_revokedbaccess
sp_dropgroup | sp_revokelogin
sp_droplinkedsrvlogin | sp_setapprole
sp_droplogin | sp_srvrolepermission
sp_dropremotelogin | sp_validatelogins
sp_droprole |

SQL 邮件过程
sp_processmail | xp_sendmail
xp_deletemail | xp_startmail
xp_findnextmsg | xp_stopmail
xp_readmail |

SQL 事件探查器过程
sp_trace_create | sp_trace_setfilter
sp_trace_generateevent | sp_trace_setstatus
sp_trace_setevent |

SQL Server 代理程序过程
sp_add_alert | sp_help_jobhistory
sp_add_category | sp_help_jobschedule
sp_add_job | sp_help_jobserver
sp_add_jobschedule | sp_help_jobstep
sp_add_jobserver | sp_help_notification
sp_add_jobstep | sp_help_operator
sp_add_notification | sp_help_targetserver
sp_add_operator | sp_help_targetservergroup
sp_add_targetservergroup | sp_helptask
sp_add_targetsvrgrp_member | sp_manage_jobs_by_login
sp_addtask | sp_msx_defect
sp_apply_job_to_targets | sp_msx_enlist
sp_delete_alert | sp_post_msx_operation
sp_delete_category | sp_purgehistory
sp_delete_job | sp_purge_jobhistory
sp_delete_jobschedule | sp_reassigntask
sp_delete_jobserver | sp_remove_job_from_targets
sp_delete_jobstep | sp_resync_targetserver
sp_delete_notification | sp_start_job
sp_delete_operator | sp_stop_job
sp_delete_targetserver | sp_update_alert
sp_delete_targetservergroup | sp_update_category
sp_delete_targetsvrgrp_member | sp_update_job
sp_droptask | sp_update_jobschedule
sp_help_alert | sp_update_jobstep
sp_help_category | sp_update_notification
sp_help_downloadlist | sp_update_operator
sp_helphistory | sp_update_targetservergroup
sp_help_job | sp_updatetask
 | xp_sqlagent_proxy_account

系统过程
sp_add_data_file_recover_suspect_db | sp_helpconstraint
sp_addextendedproc | sp_helpdb
sp_addextendedproperty | sp_helpdevice
sp_add_log_file_recover_suspect_db | sp_helpextendedproc
sp_addmessage | sp_helpfile
sp_addtype | sp_helpfilegroup
sp_addumpdevice | sp_helpindex
sp_altermessage | sp_helplanguage
sp_autostats | sp_helpserver
sp_attach_db | sp_helpsort
sp_attach_single_file_db | sp_helpstats
sp_bindefault | sp_helptext
sp_bindrule | sp_helptrigger
sp_bindsession | sp_indexoption
sp_certify_removable | sp_invalidate_textptr
sp_configure | sp_lock
sp_create_removable | sp_monitor
sp_createstats | sp_procoption
sp_cycle_errorlog | sp_recompile
sp_datatype_info | sp_refreshview
sp_dbcmptlevel | sp_releaseapplock
sp_dboption | sp_rename
sp_dbremove | sp_renamedb
sp_delete_backuphistory | sp_resetstatus
sp_depends | sp_serveroption
sp_detach_db | sp_setnetname
sp_dropdevice | sp_settriggerorder
sp_dropextendedproc | sp_spaceused
sp_dropextendedproperty | sp_tableoption
sp_dropmessage | sp_unbindefault
sp_droptype | sp_unbindrule
sp_executesql | sp_updateextendedproperty
sp_getapplock | sp_updatestats
sp_getbindtoken | sp_validname
sp_help | sp_who

Web 助手过程
sp_dropwebtask | sp_makewebtask
sp_enumcodepages | sp_runwebtask

XML 过程
sp_xml_preparedocument sp_xml_removedocument

常规扩展过程
xp_cmdshell | xp_logininfo
xp_enumgroups | xp_msver
xp_findnextmsg | xp_revokelogin
xp_grantlogin | xp_sprintf
xp_logevent | xp_sqlmaint
xp_loginconfig | xp_sscanf

API 系统存储过程

用户在 ADO、OLE DB、ODBC 和 DB-Library 应用程序上运行 SQL Server 事件探查器时，可能会注意到系统存储过程的使用不涉及 Transact-SQL 引用。这些存储过程由用于 SQL Server 的 Microsoft OLE DB 提供程序、SQL Server ODBC 驱动程序和 DB-Library 动态链接库 (DLL) 用来执行数据库 API 功能。这些过程只不过是提供程序或驱动程序所使用的机制，用来传达用户对 SQL Server 的请求。它们仅供用于 SQL Server 的 OLE DB 提供程序、SQL Server ODBC 驱动程序和 DB-Library DLL 在内部使用。不支持从 SQL Server 应用程序显式调用它们。

这些存储过程通过所支持的 API 函数，使得它们的全部功能均可由 SQL Sever 应用程序使用。例如，sp_cursor 系统存储过程的游标功能通过 OLE DB API 游标属性和方法可由 OLE DB 应用程序使用，通过 ODBE 游标特性和函数可由 ODBE 应用程序使用，通过 DB-library 游标库可由 DB-Library 应用程序使用。

这些系统存储过程支持 ADO、OLE DB、ODBC 和 DB-Library 游标库的游标功能：

sp_cursor | sp_cursorclose | sp_cursorexecute
sp_cursorfetch | sp_cursoropen | sp_cursoroption
sp_cursorprepare | sp_cursorunprepare |

这些系统存储过程支持 ADO、OLE DB 和 ODBC 中用于执行 Transact-SQL 语句的比较/执行模型：

sp_execute sp_prepare sp_unprepare

sp_createorphan 和 sp_droporphans 存储过程用于 ODBC ntext、text 和 image 的处理。

sp_reset_connection 存储过程由 SQL Server 用来支持事务中的远程存储过程调用。

sp_sdidebug 存储过程由 SQL Server 用来调试 Transact-SQL 语句。


sp_ActiveDirectory_Obj

控制在 Microsoft Windows® 2000 Active Directory™ 中注册 Microsoft® SQL Server™ 数据库。

语法

sp_ActiveDirectory_Obj [ @Action = ] N'action'

[, [ @ObjType = ] N'database' ]

    , [ @ObjName = ] N'database_name'

参数

[ @Action = ] N'action'

指定是否要创建、更新或删除注册 SQL Server 数据库的 Active Directory 对象。action 的数据类型为 nvarchar(20)，其默认值为 N'create'。

值 | 描述
create | 通过在 Active Directory 中创建 MS-SQL-SQLDatabase 对象，在 Active Directory 中注册 SQL Server 数据库。MS-SQL-SQLDatabase 对象在执行创建操作时记录数据库的特性。如果指定 create 且已注册数据库，则执行更新操作。
update | 通过在 Active Directory 中更新 MS-SQL-SQLDatabase 对象中记录的特性，在 Active Directory 中刷新为数据库注册的特性。如果指定 update 且未注册数据库，则执行创建操作。
delete | 通过从 Active Directory 中删除 MS-SQL_SQLDatabase 对象，删除数据库的 Active Directory 注册。

[ @ObjType = ] N'database' }

指定 sp_ActiveDirectory_Obj 在 Active Directory 中数据库对象上执行请求的操作。N'database' 的数据类型为 nvarchar(15)，其默认值为 N'database'。在 SQL Server 2000 中，N'database' 是唯一支持的值。

[ @ObjName = ] N'database_name'

指定为其执行注册操作的数据库的名称。database_name 的数据类型为 sysname，且必须为其指定一个值。database_name 必须指定存在于 SQL Server 实例中数据库的名称，在该实例中执行 sp_ActiveDirectory_Obj。database_name 必须遵从标识符的规则。

返回代码值
  1. 0（成功）或 1（失败）
结果集

无

注释

必须在 Active Directory 中注册当前 SQL Server 实例才能注册该实例中的任何数据库。如果从 Active Directory 中删除实例的注册，也将删除该实例中所有数据库的注册。

在 SQL Server 2000 中，数据库是使用 sp_ActiveDirectory_Obj 在 Active Directory 中直接注册的唯一实体。若要控制在 Active Directory 中注册 SQL Server 实例，请使用 sp_ActiveDirectory_SCP。若要控制在 Active Directory 中注册复制发布，请使用复制存储过程：sp_addpublication、sp_changepublication、sp_addmergepublication 和 sp_changemergepublication。

权限

只有 sysadmin 固定服务器角色和 db_owner 固定数据库角色的成员才能执行 sp_ActiveDirectory_SCP。

示例

下例在 Active Directory 中从当前 SQL Server 实例注册 Northwind 数据库。

DECLARE @RetCode INT

EXEC @RetCode = sp_ActiveDirectory_Obj @Action = N'create',
     @ObjType = N'database',
     @ObjName = 'Northwind'

PRINT 'Return code = ' + CAST(@RetCode AS VARCHAR)

请参见

Active Directory 集成

Active Directory 服务

sp_ActiveDirectory_SCP

sp_addmergepublication

sp_addpublication

sp_changemergepublication

sp_changepublication


sp_ActiveDirectory_SCP

控制在 Microsoft Windows® 2000 Active Directory™ 中注册 Microsoft® SQL Server™ 实例。sp_ActiveDirectory_SCP 的操作始终应用于当前连接到的 SQL Server 实例。

语法

sp_ActiveDirectory_SCP [ @Action = ] N'action'

参数

[ @Action = ] N'action'

指定是否要创建、更新或删除注册 SQL Server 实例的 Active Directory 对象。Action 的数据类型为 nvarchar(20)，其默认值为 N'create'。

值 | 描述
create | 通过在 Active Directory 中创建 MS-SQL-SQLServer 对象，在该目录中注册 SQL Server 实例。MS-SQL-SQLServer 对象在执行创建操作时记录 SQL Server 实例的特性。如果指定 create 且已注册了该实例，则执行更新操作。
update | 刷新在 Active Directory 中为当前 SQL Server 实例注册的特性。在 Active Directory 中更新 MS-SQL-SQLServer 对象中记录的特性。如果指定 update 且未注册该实例，则执行创建操作。
delete | 删除当前 SQL Server 实例的 Active Directory 注册。从 Active Directory 中删除 MS-SQL_SQLServer 对象。也将删除该实例中任何数据库和发布的注册。

返回代码值

0（成功）或 1（失败）

结果集

无

注释

在 Active Directory 中注册 SQL Server 实例后，可使用 sp_ActiveDirectory_Obj 注册该实例中的任何数据库，并且可使用 sp_addpublication 或 sp_addmergepublication 注册发布。

权限

只有 sysadmin 固定服务器角色的成员才可以执行 sp_ActiveDirectory_SCP。

示例

下例在 Active Directory 中注册当前 SQL Server 实例。

DECLARE @RetCode INT

EXEC @RetCode = sp_ActiveDirectory_SCP @Action = N'create'

PRINT 'Return code = ' + CAST(@RetCode AS VARCHAR)

请参见

Active Directory 集成

Active Directory 服务

sp_ActiveDirectory_Obj

sp_addmergepublication

sp_addpublication


sp_add_alert

创建一个警报。

语法

sp_add_alert [ @name = ] 'name'
[ , [ @message_id = ] message_id ]
[ , [ @severity = ] severity ]
[ , [ @enabled = ] enabled ]
[ , [ @delay_between_responses = ] delay_between_responses ]
[ , [ @notification_message = ] 'notification_message' ]
[ , [ @include_event_description_in = ] include_event_description_in ]
[ , [ @database_name = ] 'database' ]
[ , [ @event_description_keyword = ] 'event_description_keyword_pattern' ]
[ , { [ @job_id = ] job_id | [ @job_name = ] 'job_name' } ]
[ , [ @raise_snmp_trap = ] raise_snmp_trap ]
[ , [ @performance_condition = ] 'performance_condition' ]
[ , [ @category_name = ] 'category' ]

参数

[ @name = ] 'name'

警报的名称。此名称出现在为响应警报而发送的电子邮件或呼叫消息中。此名称必须唯一，可以包含百分比字符 (%)。name 的数据类型为 sysname，没有默认设置。

[ @message_id = ] message_id

用于定义警报的消息错误号。（通常与 sysmessages 表中的某个错误号对应。）message_id 的数据类型为 int，默认设置为 0。如果使用 severity 定义警报，则 message_id 必须为 0 或 NULL。

说明 只有写入 Microsoft® Windows NT® 应用程序日志的 sysmessages 错误才能导致发送警报。

[ @severity = ] severity

用于定义警报的严重级别（从 1 到 25）。只要存储于 sysmessages 表中的 Microsoft SQL Server™ 消息以指定严重度发送到 Microsoft Windows NT 应用程序日志中，就会导致发送警报。Severity 的数据类型为 int，默认设置为 0。如果 message_id 用于定义警报，severity 必须为 0。

[ @enabled = ] enabled

表明警报的当前状态。enabled 的数据类型为 tinyint，默认设置为 1（启用）。如果为 0，则不启用警报，也不激发。

[ @delay_between_responses = ] delay_between_responses

警报响应之间的等待间隔，以秒为单位。delay_between_responses 的数据类型为 int，默认设置为 0，这意味着响应之间不等待（每次出现警报都生成响应）。响应可同时为下列两种形式，或其中的一种：

  • 通过电子邮件或呼叫程序发送的一个或多个通知。

  • 执行作业。

    例如，通过设置该值，当警报在短时间内重复产生时，就有可能避免发送重复的电子邮件。

[ @notification_message = ] 'notification_message'

作为电子邮件、net send 或呼叫提示的一部分发送给操作员的可选附加消息。notification_message 的数据类型为 nvarchar(512)，默认设置为 NULL。指定 notification_message 有助于添加特殊说明，例如补救过程。

[ @include_event_description_in = ] include_event_description_in

表示 SQL Server 错误描述是否应包含在通知消息中。include_event_description_in 的数据类型为 tinyint，默认设置为 5（电子邮件和 net send），并且，它可以使下面的一个或多个值与 OR 逻辑运算符结合使用。

值 | 描述
0（默认值） | 无
1 | 电子邮件
2 | 呼叫程序
4 | net send

[ @database_name = ] 'database'

必须在其中出现错误才能激发警报的数据库。如果没提供database，则无论何处发生错误，警报都要启动。database 的数据类型为 sysname，默认设置为 NULL。

[ @event_description_keyword = ] 'event_description_keyword_pattern'

字符序列，对 SQL Server 错误的描述必须与此类似。可使用 Transact-SQL LIKE 表达式模式匹配字符。event_description_keyword_pattern 的数据类型为 nvarchar(100)，默认设置为 NULL。该参数在筛选对象名称（例如，%customer_table%）时很有用。

[ @job_id = ] job_id

响应该警报运行的作业的作业标识号。job_id 的数据类型为 uniqueidentifier，默认设置为 NULL。

[ @job_name = ] 'job_name'

响应该警报所执行的作业名称。job_name 的数据类型为 sysname，默认设置为 NULL。

说明 必须指定 job_id 或 job_name，但不能两个都指定。

[ @raise_snmp_trap = ] raise_snmp_trap

SQL Server 7.0 版中没有实现。

[ @performance_condition = ] 'performance_condition'

以格式 'item comparator value' 表达的一个值。performance_condition 的数据类型为 nvarchar(512)，默认设置为 NULL，由下列元素组成。

格式元素 | 描述
Item | 性能对象，性能计数器或计数器的命名实例
Comparator | 下列运算符之一：>、< 或 =
Value | 计数器的数值

说明 性能条件警报只供最前面的 99 个数据库使用。接在最前面的 99 个数据库之后创建的任何数据库都不会包括在 sysperfinfo 系统表中，并且，使用 sp_add_alert 过程会返回一个错误。

[ @category_name = ] 'category'

警报分类的名称。category 的数据类型为 sysname，默认设置为 NULL。

返回代码值

0（成功）或 1（失败）

结果集

无

注释

sp_add_alert 必须从 msdb 数据库运行。

在下列情况下，SQL Server 和 SQL Server 应用程序产生的错误/消息被发送到 Windows NT 应用程序日志，因此能产生警报：

  1. 严重度 19 或更高的 sysmessages 错误

  2. 任何使用 WITH LOG 语法唤醒调用的 RAISERROR 语句

  3. 所有用 sp_altermessage 修改或产生的 sysmessages 错误

  4. 所有用 xp_logevent 记录的日志事件

SQL Server 企业管理器提供了一种易用的图形界面来管理整个警报系统，这也是配置基本结构的推荐方式。

如果一个警报没有正常工作，请检查：

  • SQL Server代理程序服务是否正在运行。

  • 事件是否出现在 Windows NT 应用程序日志中。

  • 警报是否已被启用。
权限

只有 sysadmin 固定服务器角色的成员才能执行 sp_add_alert。

示例

下面的示例添加一个警报（测试警报），该警报在启动时唤醒调用备份客户数据库作业。

说明 此示例假设消息 55001 和备份用户数据库作业已经存在。示例只是出于说明性目的而显示。

USE msdb
EXEC sp_add_alert @name = 'Test Alert', @message_id = 55001,
   @severity = 0,
   @notification_message = 'Error 55001 has occurred. The database will
   be backed up...',
   @job_name = 'Back up the Customer Database'

请参见

sp_add_notification

sp_addtask

sp_altermessage

sp_delete_alert

sp_help_alert

sp_update_alert

sysperfinfo

系统存储过程


sp_add_category

将作业、警报或运算符的指定分类添加到服务器中。

语法

sp_add_category [ [ @class = ] 'class', ]
[ [ @type = ] 'type', ]
{ [ @name = ] 'name' }

参数

[ @class = ] 'class'

是要添加的分类的类。class 的数据类型为 varchar(8)，默认设置为 JOB，并且可以是下列某个值。

值 | 描述
JOB | 添加作业分类。
ALERT | 添加警报分类。
OPERATOR | 添加运算符分类。

[ @type = ] 'type'

是要添加的分类的类型。type 的数据类型为 varchar(12)，默认设置为 LOCAL，并且可以是下列某个值。

值 | 描述
LOCAL | 本地作业分类。
MULTI -SERVER | 多服务器作业分类。
NONE | 非 JOB 的类的分类。

[ @name = ] 'name'

要被添加的分类的名称。该名称在指定的类中必须唯一。name 的数据类型为 sysname，没有默认设置。

返回代码值

0（成功）或 1（失败）

结果集

无

注释

必须在 msdb 中执行 sp_add_category。

权限

只有 sysadmin 固定服务器角色或 db_owner 固定数据库角色的成员才能执行 sp_add_category。

示例

下面的示例创建名为 AdminJobs 的本地作业分类。

USE msdb
EXEC sp_add_category 'JOB', 'LOCAL', 'AdminJobs'

请参见

sp_delete_category

sp_help_category

sp_update_category

sysjobs

sysjobservers

系统存储过程


sp_add_data_file_recover_suspect_db

当由于文件组上的"空间不足"(1105) 错误而导致一个数据库上的恢复不能完成时，请为文件组添加一个数据文件。添加日志文件后，该存储过程关闭置疑设置并完成数据库的故障恢复。该参数和 ALTER DATABASE ADD FILE 的参数相同。

重要 此存储过程应按故障诊断恢复部分中的描述使用。

语法

sp_add_data_file_recover_suspect_db [ @dbName = ] 'database' ,
[ @filegroup = ] 'filegroup_name' ,
[ @name = ] 'logical_file_name' ,
[ @filename = ] 'os_file_name' ,
[ @size = ] 'size' ,
[ @maxsize = ] 'max_size' ,
[ @filegrowth = ] 'growth_increment'

参数

[@dbName =] 'database'

是数据库名。database 的数据类型为 sysname，没有默认设置。

[ @filegroup = ] 'filegroup_name'

添加文件的文件组。filegroup_name 的数据类型为 nvarchar(260)，默认设置为 NULL，指明 PRIMARY 文件。

[ @name = ] 'logical_file_name'

在 Microsoft SQL Server 中引用文件时的名称。此名称在服务器上必须唯一，logical_file_name 的数据类型为 nvarchar(260)，没有默认设置。

[@filename =] 'os_file_name'

由操作系统使用的文件的路径和文件名。该文件必须驻留在一个 SQL Server 实例上。os_file_name 的数据类型为 nvarchar(260)，没有默认设置。

[ @size = ] 'size'

文件的初始大小。可使用 MB 和 KB 后缀指定兆字节或千字节。默认值为 MB。指定一个整数，不要包含小数位。文件大小的最小值是 512 KB，如果没有指定大小，则默认设置为 1 MB。size 的数据类型为 nvarchar(20)，默认设置为 NULL。

[ @maxsize = ] 'max_size'

文件可以增长到的最大大小。可使用 MB 和 KB 后缀指定兆字节或千字节。默认值为 MB。指定一个整数，不要包含小数位。如果 max_size 没有被指定，则文件将增长到磁盘充满为止。当磁盘快要变满时，Microsoft Windows NT® 应用程序日志会警告管理员。max_size 的数据类型为 nvarchar(20)，默认设置为 NULL。

[ @filegrowth = ] 'growth_increment'

每次需要新的空间时为文件添加的空间。0 值表示不增长。该值可按 MB、KB 或 % 的形式指定。指定一个整数，不要包含小数位。当指定 % 时，增长增量是此增量发生时文件大小的指定百分比。如果未在数量后面指定 MB、KB 或 %，则默认值为 MB。如果没有指定 growth_increment，则默认设置为 10%，且最小值为 64 KB。指定的大小四舍五入到最接近 64 KB。growth_increment 的数据类型为 nvarchar(20)，默认设置为 NULL。

返回代码值

0（成功）或 1（失败）

结果集

无

权限

执行权限默认赋予 sysadmin 固定服务器角色的成员。这些权限是不可传递的。

示例

在下面的示例中，由于文件组 fg1 中空间不足（错误 1105），数据库 db1 被标记为置疑。

sp_add_data_file_recover_suspect_db db1, fg1, file2,
   'c:\Program Files\Microsoft SQL Server\MSSQL\Data\db1_file2.mdf', '1MB'

请参见

ALTER DATABASE

sp_add_log_file_recover_suspect_db

系统存储过程


sp_add_job

添加由 SQLServerAgent 服务执行的新作业。

语法

sp_add_job [ @job_name = ] 'job_name'
[ , [ @enabled = ] enabled ]
[ , [ @description = ] 'description' ]
[ , [ @start_step_id = ] step_id ]
[ , [ @category_name = ] 'category' ]
[ , [ @category_id = ] category_id ]
[ , [ @owner_login_name = ] 'login' ]
[ , [ @notify_level_eventlog = ] eventlog_level ]
[ , [ @notify_level_email = ] email_level ]
[ , [ @notify_level_netsend = ] netsend_level ]
[ , [ @notify_level_page = ] page_level ]
[ , [ @notify_email_operator_name = ] 'email_name' ]
[ , [ @notify_netsend_operator_name = ] 'netsend_name' ]
[ , [ @notify_page_operator_name = ] 'page_name' ]
[ , [ @delete_level = ] delete_level ]
[ , [ @job_id = ] job_id OUTPUT ]

参数

[ @job_name = ] 'job_name'

作业的名称。该名称必须唯一，不能包含百分比 (%) 字符。job_name 的数据类型为 sysname，没有默认设置。

[ @enabled = ] enabled

指明所添加的作业的状态。enabled 的数据类型为 tinyint，默认设置为 1（启用）。如果为 0，则不启用作业，也不按照其调度运行该作业；但是可以手工运行该作业。

[ @description = ] 'description'

是作业描述。description 是 nvarchar(512) 类型，其默认值为 NULL。如果省略 description，则使用"无可用的描述"。

[ @start_step_id = ] step_id

该作业所要执行的第一步的标识号。step_id 的数据类型为 int，默认设置为 1。

[ @category_name = ] 'category'

是作业分类。category 的数据类型为 sysname，默认设置为 NULL。

[ @category_id = ] category_id

用来指定作业分类的与语言无关的机制。category_id 的数据类型为 int，默认设置为 NULL。

[ @owner_login_name = ] 'login'

是拥有作业的登录的名称。login 的数据类型为 sysname，默认设置为 NULL，此时可解释为当前的登录名。

[ @notify_level_eventlog = ] eventlog_level

指明何时将该作业的项目放进 Microsoft® Windows NT® 应用程序日志中的值。eventlog_level 的数据类型为 int，可以为下列值之一。

值 | 描述
0 | 从不
1 | 成功后
2（默认值） | 失败后
3 | 始终

[ @notify_level_email = ] email_level

用于指明作业完成后何时发送电子邮件的值。email_level 的数据类型为 int，设置为 0，表示成功发送。email_level 和 eventlog_level 使用相同的值。

[ @notify_level_netsend = ] netsend_level

用于指明作业完成后何时发送网络消息的值。netsend_level 的数据类型为 int，默认设置为 0，表示从不发送。netsend_level 和 eventlog_level 使用相同的值。

[ @notify_level_page = ] page_level

用于指明作业完成后何时发送呼叫的值。page_level 的数据类型为 int，默认设置为 0，表示从不发送。page_level 和 eventlog_level 使用相同的值。

[ @notify_email_operator_name = ] 'email_name'

当达到 email_level 时，电子邮件所发送到的人员的电子邮件名称。email_name 的数据类型为 sysname，默认设置为 NULL。

[ @notify_netsend_operator_name = ] 'netsend_name'

在该作业完成时，将网络消息发送到的操作员的名称。netsend_name 的数据类型为 sysname，默认设置为 NULL。

[ @notify_page_operator_name = ] 'page_name'

该作业完成时要呼叫的人员的名称。page_name 的数据类型为 sysname，默认设置为 NULL。

[ @delete_level = ] delete_level

用于指明何时删除作业的值。delete_value 的数据类型为 int，默认设置为 0，表示从不删除。delete_level 和 eventlog_level 使用相同的值。

说明 当 delete_level 为 3 时，只执行一次作业，而不管任何为该作业定义的调度如何。而且，如果作业将其自身删除，则该作业的历史也将被删除。

[ @job_id = ] job_id OUTPUT

指派给成功创建的作业的作业标识号。job_id 是 uniqueidentifer 类型的输出变量，默认设置为 NULL。

返回代码值

0（成功）或 1（失败）

结果集

无

注释

@originating_server 存在于 sp_add_job 中，但没有列在参数里。保留 @originating_server 用于内部使用。

当执行 sp_add_job 添加完作业后，可使用 sp_add_jobstep 添加执行该作业活动的步骤。sp_add_jobschedule 可用于创建 SQLServerAgent 服务用于执行作业的调度。

SQL Server 企业管理器提供易于使用的图形方法来管理作业，建议使用该方法创建和管理作业基本结构。

权限

执行权限默认授予 public 角色。

示例
A. 添加作业

此示例添加一个名为 NightlyBackups 的新作业。

USE msdb
EXEC sp_add_job @job_name = 'NightlyBackups'
B. 添加带有呼叫程序、电子邮件和网络发送信息的作业

下面的示例创建名为 Ad hoc Sales Data Backup 的作业，该作业通知 janetl（通过寻呼机、电子邮件或网络弹出式消息）作业是否失败，并删除已成功完成的作业。

USE msdb
EXEC sp_add_job @job_name = 'Ad hoc Sales Data Backup',
   @enabled = 1,
   @description = 'Ad hoc backup of sales data',
   @owner_login_name = 'janet1',
   @notify_level_eventlog = 2,
   @notify_level_email = 2,
   @notify_level_netsend = 2,
   @notify_level_page = 2,
   @notify_email_operator_name = 'janet1',
   @notify_netsend_operator_name = 'janet1',
   @notify_page_operator_name = 'janet1',
   @delete_level = 1

请参见

sp_add_jobschedule

sp_add_jobstep

sp_delete_job

sp_help_job

sp_help_jobstep

sp_update_job

系统存储过程


sp_add_jobschedule

创建作业调度。

语法

sp_add_jobschedule [ @job_id = ] job_id, | [ @job_name = ] 'job_name',
[ @name = ] 'name'
[ , [ @enabled = ] enabled ]
[ , [ @freq_type = ] freq_type ]
[ , [ @freq_interval = ] freq_interval ]
[ , [ @freq_subday_type = ] freq_subday_type ]
[ , [ @freq_subday_interval = ] freq_subday_interval ]
[ , [ @freq_relative_interval = ] freq_relative_interval ]
[ , [ @freq_recurrence_factor = ] freq_recurrence_factor ]
[ , [ @active_start_date = ] active_start_date ]
[ , [ @active_end_date = ] active_end_date ]
[ , [ @active_start_time = ] active_start_time ]
[ , [ @active_end_time = ] active_end_time ]

参数

[ @jobid = ] job_id

将向其中添加调度的作业的作业标识号。job_id 的数据类型为 uniqueidentifier，默认设置为 NULL。

[ @job_name = ] 'job_name'

作业的名称，调度即添加到该作业中。job_name 的数据类型为 sysname，默认设置为 NULL。

说明 必须指定 job_id 或 job_name，但不能两个都指定。

[ @name = ] 'name'

调度的名称。name 的数据类型为 sysname，没有默认设置。

[ @enabled = ] enabled

指明调度的当前状态。enabled 的数据类型为 tinyint，默认设置为 1（启用）。如果为 0，则不启用调度。禁用该调度时，不运行作业。

[ @freq_type = ] freq_type

用于指明何时将执行作业的值。freq_type 的数据类型为 int，默认设置为 0，可以是下列值之一。

值 | 描述
1 | 一次
4 | 每天
8 | 每周
16 | 每月
32 | 每月，与 freq interval 相关
64 | 当 SQLServerAgent 服务启动时运行
128 | 计算机空闲时运行

[ @freq_interval = ] freq_interval

作业执行的天数。freq_interval 的数据类型为 int，默认设置为 0，依赖于 freq_type 的值。

freq_type 的值 | 对 freq_interval 的影响
1（一次） | 未使用 freq_interval。
4（每天） | 每个 freq_interval 日。
8（每周） | freq_interval 为下面的一个或多个值（与 OR 逻辑运算符结合使用）： 1 = 星期日 2 = 星期一 4 = 星期二 8 = 星期三 16 = 星期四 32 = 星期五 64 = 星期六
16（每月） | 每月的 freq_interval 日。
32（每月相对） | freq_interval 为下列值之一： 1 = 星期日 2 = 星期一 3 = 星期二 4 = 星期三 5 = 星期四 6 = 星期五 7 = 星期六 8 = 日 9 = 工作日 10 = 周末
64（当 SQLServerAgent 服务启动时） | 未使用 freq_interval。
128 | 未使用 freq_interval。

[ @freq_subday_type = ] freq_subday_type

指定 freq_subday_interval 的单位。freq_subday_type 为 int 类型，其默认值为 0，且可以取下列值之一。

值 | 描述（单位）
0x1 | 在指定的时间
0x4 | 分钟
0x8 | 小时

[ @freq_subday_interval = ] freq_subday_interval

作业每次执行之间要出现的 freq_subday_type 周期数。freq_subday_interval 的数据类型为 int，默认设置为 0。

[ @freq_relative_interval = ] freq_relative_interval

如果 freq_interval 是 32（每月相对），则为每月中已调度作业的 freq_interval 的发生情况。freq_relative_interval 的数据类型为 int，默认设置为 0，可以是下列值之一。

值 | 描述（单位）
1 | 第一页
2 | 秒
4 | 第三个
8 | 第四个
16 | 最后一页

[ @freq_recurrence_factor = ] freq_recurrence_factor

作业的已调度执行之间的周数或月数。只有当 freq_type 是 8、16 或 32 时，才使用 freq_recurrence_factor。freq_recurrence_factor 的数据类型为 int，默认设置为 0。

[ @active_start_date = ] active_start_date

作业可开始执行的日期。active_start_date 的数据类型为 int，默认设置为 NULL，该值表示当天的日期。日期的格式为 YYYYMMDD。如果 active_start_date 不为 NULL，则日期必须大于或等于 19900101。

[ @active_end_date = ] active_end_date

作业可停止执行的日期。active_end_date 的数据类型为 int，默认设置为 99991231，该值表示 9999 年 12 月 31 日。格式为 YYYYMMDD。

[ @active_start_time = ] active_start_time

在 active_start_date 和 active_end_date 之间的任何一天开始执行作业的时间。active_start_time 的数据类型为 int，默认设置为 000000，该值表示 24 小时制的上午 12:00:00，并且必须使用格式 HHMMSS 进行输入。

[ @active_end_time = ] active_end_time

在 active_start_date 和 active_end_date 之间的任何一天停止执行作业的时间。active_end_time 的数据类型为 int，默认设置为 235959，该值表示 24 小时制的下午 11:59:59，并且必须使用格式 HHMMSS 进行输入。

返回代码值

0（成功）或 1（失败）

结果集

无

注释

SQL Server 企业管理器提供易于使用的图形方法来管理作业，建议使用该方法创建和管理作业基本结构。

权限

执行权限默认授予 public 角色。

示例

此示例假设已经创建用来备份数据库的 NightlyBackup 作业。它将作业添加到名为 ScheduledBackup 的调度中，并且在每天上午 1:00 执行。

USE msdb
EXEC sp_add_jobschedule @job_name = 'NightlyBackup',
   @name = 'ScheduledBackup',
   @freq_type = 4, -- daily
   @freq_interval = 1,
   @active_start_time = 10000

请参见

修改和查看作业

sp_delete_jobschedule

sp_help_jobschedule

sp_update_jobschedule

系统存储过程


sp_add_jobserver

在指定的服务器中，以指定的作业为目标。

语法

sp_add_jobserver [ @job_id = ] job_id | [ @job_name = ] 'job_name'
[ , [ @server_name = ] 'server' ]

参数

[ @job_id = ] job_id

作业的标识号。job_id 的数据类型为 uniqueidentifer，默认设置为 NULL。

[ @job_name = ] 'job_name'

是作业的名称。job_name 为 sysname 类型，其默认值为 NULL。

说明 必须指定 job_id 或 job_name，但不能两个都指定。

[ @server_name = ] 'server'

以该作业作为目标的服务器的名称。server 的数据类型为 nvarchar(30)，默认设置为 N'(LOCAL)'，server 可以是本地服务器 (LOCAL)，或者是现有目标服务器的名称。

返回代码值

0（成功）或 1（失败）

结果集

无

注释

@automatic_post 存在于 sp_add_jobserver 中，但没有列在参数中。保留 @automatic_post 用于内部使用。

SQL Server 企业管理器提供易于使用的图形方法来管理作业，建议使用该方法创建和管理作业基本结构。

权限

执行许可权限默认授予本地作业的 public 角色。只有 sysadmin 固定服务器角色的成员才能执行多服务器作业的 sp_add_jobserver。

示例

此示例将 SEATTLE2 服务器指派给多服务器作业 — Weekly Sales Data Backup 作业。

说明 此示例假设 Weekly Sales Data Backup 作业已经存在。

USE msdb
EXEC sp_add_jobserver @job_name = 'Weekly Sales Data Backup',
   @server_name = 'SEATTLE2'

请参见

sp_apply_job_to_targets

sp_delete_jobserver

系统存储过程


sp_add_jobstep

将一个步骤（操作）添加到作业中。

语法

sp_add_jobstep [ @job_id = ] job_id | [ @job_name = ] 'job_name'
[ , [ @step_id = ] step_id ]
{ , [ @step_name = ] 'step_name' }
[ , [ @subsystem = ] 'subsystem' ]
[ , [ @command = ] 'command' ]
[ , [ @additional_parameters = ] 'parameters' ]
[ , [ @cmdexec_success_code = ] code ]
[ , [ @on_success_action = ] success_action ]
[ , [ @on_success_step_id = ] success_step_id ]
[ , [ @on_fail_action = ] fail_action ]
[ , [ @on_fail_step_id = ] fail_step_id ]
[ , [ @server = ] 'server' ]
[ , [ @database_name = ] 'database' ]
[ , [ @database_user_name = ] 'user' ]
[ , [ @retry_attempts = ] retry_attempts ]
[ , [ @retry_interval = ] retry_interval ]
[ , [ @os_run_priority = ] run_priority ]
[ , [ @output_file_name = ] 'file_name' ]
[ , [ @flags = ] flags ]

参数

[@job_id =] job_id

将步骤添加于其中的作业的标识号。job_id 的数据类型为 uniqueidentifier，默认设置为 NULL。

[@job_name =] 'job_name'

将步骤添加于其中的作业的名称。job_name 的数据类型为 sysname，默认设置为 NULL。

说明 必须指定 job_id 或 job_name，但不能两个都指定。

[@step_id =] step_id]

作业步骤的序列标识号。步骤标识号从 1 开始，并以 1 为增量，中间无间隙。如果在现有序列中插入步骤，则序列号可以自动调整。如果没有指定 step_id，则提供一个值。step_id 的数据类型为 int，默认设置为 NULL。

[@step_name =] 'step_name'

是步骤的名称。step_name 的数据类型为 sysname，没有默认设置。

[@subsystem =] 'subsystem'

是 SQL Server 代理服务用于执行 command 的子系统。subsystem 的数据类型为 nvarchar(40)，可以是下列值之一。

值 | 描述
'ACTIVESCRIPTING' | 动态脚本
'CMDEXEC' | 操作系统命令或可执行程序
'DISTRIBUTION' | 复制分发代理程序作业
'SNAPSHOT' | 复制快照代理程序作业
'LOGREADER' | 复制日志读取器代理程序作业
'MERGE' | 复制合并代理程序作业
'TSQL'（默认） | Transact-SQL 语句

[@command =] 'command'

SQLServerAgent 服务通过 subsystem 执行的命令。command 的数据类型为 nvarchar(3200)，默认设置为 NULL。command 可包括下面一个或多个区分大小写的令牌，这些令牌在运行时被替换。

值 | 描述
[A-DBN] | 数据库名称。如果由某个警报来运行作业，则在转换进程中，该标记会自动地替换版本 6.5 [DBN] 标记。
[A-SVR] | 服务器名称。如果由某个警报来运行作业，则在转换进程中，该标记会自动地替换版本 6.5 [SVR] 标记。
[A-ERR] | 错误号。如果由某个警报来运行作业，则在转换进程中，该标记会自动地替换版本 6.5 [ERR] 标记。
[A-SEV] | 错误严重度。如果由某个警报来运行作业，则在转换进程中，该标记会自动地替换版本 6.5 [SEV] 标记。
[A-MSG] | 消息文本。如果由某个警报来运行作业，则在转换进程中，该标记会自动地替换版本6.5 [MSG] 标记。
[DATE] | 当前日期（以 YYYYMMDD 格式）。
[JOBID] | 作业 ID。
[MACH] | 计算机名称。
[MSSA] | 主 SQLServerAgent 服务名。
[SQLDIR] | 安装 SQL Server 的目录。默认情况下，该值是 C:\Program Files\Microsoft SQL Server\MSSQL。
[STEPCT] | 该步骤执行次数（不包括重试）的计数。该步骤命令可以使用它来强制多步骤循环的终止。
[STEPID] | 步骤 ID。
[TIME] | 当前时间（以 HHMMSS 格式）。
[STRTTM] | 作业开始执行的时间（以 HHMMSS 格式）。
[STRTDT] | 作业开始执行的日期（以 YYYYMMDD 格式）。

[@additional_parameters =] 'parameters'

保留。parameters 的数据类型为 ntext，默认设置为 NULL。

[@cmdexec_success_code =] code

CmdExec 子系统命令返回的值，该值表明 command 成功执行。code 的数据类型为 int，默认设置为 0。

[@on_success_action =] success_action

步骤成功时所执行的操作。success_action 的数据类型为 tinyint，可以是下列值之一。

值 | 描述（操作）
1（默认值） | 成功后退出
2 | 失败后退出
3 | 转到下一步
4 | 转到步骤 on_success_step_id

[@on_success_step_id =] success_step_id

步骤成功并且 success_action 为 4 时所执行的该作业中步骤的 ID。success_step_id 的数据类型为 int，默认设置为0。

[@on_fail_action =] fail_action

步骤失败时所执行的操作。fail_action 的数据类型为 tinyint，可以是下列值之一。

值 | 描述（操作）
1 | 成功后退出
2（默认值） | 失败后退出
3 | 转到下一步
4 | 转到步骤 on_fail_step_id

[@on_fail_step_id =] fail_step_id

步骤失败并且 fail_action 为 4 时所要执行的该作业中步骤的 ID。fail_step_id 的数据类型为 int，默认设置为 0。

[@server =] 'server'

保留。server 的数据类型为 nvarchar(30)，默认值为 NULL。

[@database_name =] 'database'

执行 TSQL 步骤的数据库名称。database 的数据类型为 sysname，默认设置为 NULL，在该情况下使用 master 数据库。

[@database_user_name =] 'user'

是执行 TSQL 步骤时所使用的用户账号名称。user 为 sysname 类型，其默认值为 NULL。user 为 NULL 时，步骤运行在作业所有者的用户 database 上下文中。

[@retry_attempts =] retry_attempts

该步骤失败时所使用的重新尝试次数。retry_attempts 的数据类型为 int，默认设置为 0，表示不允许重新尝试。

[@retry_interval =] retry_interval

重新尝试之间的时间量（以分钟为单位）。retry_interval 的数据类型为 int，默认设置为 0，表示重试间隔为 0 分钟。

[@os_run_priority =] run_priority

保留。

[@output_file_name =] 'file_name'

保存该步骤的输出的文件名称。file_name 的数据类型为 nvarchar(200)，默认设置为 NULL。file_name 可以包含 command 下的一个或多个令牌。该参数只有同 TSQL 或 CmdExec 子系统上运行的命令一起使用时才有效。

[@flags =] flags

控制行为的选项。flags 的数据类型为 int，可以是下列值之一。

值 | 描述
2 | 追加到输出文件
4 | 重写输出文件
0（默认值） | 未设置选项

返回代码值

0（成功）或 1（失败）

结果集

无

注释

SQL Server 企业管理器提供易于使用的图形方法来管理作业，建议使用该方法创建和管理作业基本结构。

权限

执行权限默认授予 public 角色。

示例

下面的示例创建一个作业步骤，该作业步骤更改名为 sales 的数据库的只读访问权限。此外，此示例指定进行 5 次重新尝试，重试间隔为 5 分钟。

说明 此示例假设 Weekly Sales Data Backup 作业已经存在。

USE msdb
EXEC sp_add_jobstep @job_name = 'Weekly Sales Data Backup',
   @step_name = 'Set database to read only',
   @subsystem = 'TSQL',
   @command = 'exec sp_dboption ''sales'', ''read only'', ''true''',
   @retry_attempts = 5,
   @retry_interval = 5

请参见

修改和查看作业

sp_add_job

sp_add_jobschedule

sp_delete_jobstep

sp_help_job

sp_help_jobstep

sp_update_jobstep

系统存储过程


sp_add_log_file_recover_suspect_db

由于数据库上"日志空间不足"(9002) 错误造成恢复不能完成时，请将日志文件添加到文件组中。添加日志文件后，该存储过程关闭置疑设置并完成数据库的故障恢复。参数与 ALTER DATABASE ADD LOG FILE 中的参数相同。

重要 此存储过程应按故障诊断恢复部分中的描述使用。

语法

sp_add_log_file_recover_suspect_db [ @dbName = ] 'database' ,
[ @name = ] 'logical_file_name' ,
[ @filename = ] 'os_file_name' ,
[ @size = ] 'size' ,
[ @maxsize = ] 'max_size' ,
[ @filegrowth = ] 'growth_increment'

参数

[@dbName =] 'database'

是数据库名。database 的数据类型为 sysname，没有默认设置。

[@name =] 'logical_file_name'

在 Microsoft SQL Server 中引用文件时的名称。此名称在服务器上必须唯一，logical_file_name 的数据类型为 nvarchar(260)，没有默认设置。

[@filename =] 'os_file_name'

由操作系统使用的文件的路径和文件名。此文件必须驻留在安装有 SQL Server 的服务器上，os_file_name 的数据类型为 nvarchar(260)，没有默认设置。

[@size =] 'size'

文件的初始大小。可使用 MB 和 KB 后缀指定兆字节或千字节。默认值为 MB。指定一个整数，不要包含小数位。文件大小的最小值是 512 KB，如果没有指定大小，则默认设置为 1 MB。size 的数据类型为 nvarchar(20)，默认设置为 NULL。

[@maxsize =] 'max_size'

文件可以增长到的最大大小。可使用 MB 和 KB 后缀指定兆字节或千字节。默认值为 MB。指定一个整数，不要包含小数位。如果 max_size 没有被指定，则文件将增长到磁盘充满为止。当磁盘快要变满时，Microsoft Windows NT® 应用程序日志会警告管理员。max_size 的数据类型为 nvarchar(20)，默认设置为 NULL。

[@filegrowth =] 'growth_increment'

每次需要新的空间时为文件添加的空间大小。0 值表示不增长。该值可用 MB、KB 或百分比 (%) 来指定。指定一个整数，不要包含小数位。当指定 % 时，增长增量是此增量发生时文件大小的指定百分比。如果未在数量后面指定 MB、KB 或 %，则默认值为 MB。如果没有指定 growth_increment，则默认设置为 10%，且最小值为 64 KB。指定的大小四舍五入到最接近 64 KB。growth_increment 的数据类型为 nvarchar(20)，默认设置为 NULL。

返回代码值

0（成功）或 1（失败）

结果集

无

权限

执行权限默认赋予 sysadmin 固定服务器角色的成员。这些权限是不可传递的。

示例

在此示例中，数据库 db1 在故障恢复期间由于日志空间不足（错误 9002）而标记为置疑。

sp_add_log_file_recover_suspect_db db1, logfile2,
   'c:\Program Files\Microsoft SQL Server\MSSQL\Data\db1_logfile2.ldf',
   '1MB'

请参见

ALTER DATABASE

sp_add_data_file_recover_suspect_db

系统存储过程


sp_add_log_shipping_database

指定要日志传送主服务器上的数据库。

语法

sp_add_log_shipping_database [ @db_name = ] 'db_name' ,
[ @maintenance_plan_id = ] maintenance_plan_id

参数

[@db_name =] 'db_name'

日志传送的数据库的名称。该名称必须存在于 sysdatabases 中，db_name 的数据类型为 sysname。

[@maintenance_plan_id =] maintenance_plan_id

维护计划负责备份该数据库的事务日志。maintenance_plan_id 的数据类型为 uniqueidentifier，默认设置为 NULL。

返回代码值

0（成功）或 1（失败）

权限

只有 sysadmin 固定服务器角色的成员才可以执行 sp_add_log_shipping_database。

示例
EXEC   msdb.dbo.sp_add_log_shipping_database N'pubs'


sp_add_log_shipping_plan

创建新的日志传送计划。在 log_shipping_plans 表中插入一行。

语法

sp_add_log_shipping_plan [ @plan_name = ] 'plan_name' ,
[ @description = ] 'description' ,
[ @source_server = ] 'source_server' ,
[ @source_dir = ] 'source_dir' ,
[ @destination_dir = ] 'destination_dir' ,
[ @history_retention_period = ] history_retention_period ,
[ @file_retention_period = ] file_retention_period ,
 [ @copy_frequency = ] copy_frequency ,
[ @restore_frequency = ] restore_frequency ,
[ @plan_id = ] plan_id OUTPUT

参数

[@plan_name =] 'plan_name'

计划的名称。此名称必须唯一，不能含有百分比 (%) 字符。plan_name 的数据类型为 sysname，没有默认设置。

[@description =] 'description'

计划的描述。description 的数据类型为 nvarchar(500)，默认设置为 NULL。

[@source_server =] 'source_server'

源服务器的名称。source_server 的数据类型为 sysname。

[@source_dir =] 'source_dir'

事务日志文件将被复制到目录的完整路径。source_dir 的数据类型为 nvarchar(500)。

[@destination_dir =] 'destination_dir'

事务日志将要复制到的目录。destination_dir 的数据类型为 nvarchar(500)。

[@history_retention_period =] history_retention_period

历史记录被删除前保留在 log_shipping_history 表中的时间，单位为分钟。history_retention_period 的数据类型为 int，默认设置为 2,880 分钟（两天）。

[@file_retention_period =] file_retention_period

在删除之前将日志记录文件存储在第二个服务器上的时间长度，以分钟单位。file_retention_period 的数据类型为 int，默认值为 2,880 分钟（两天）。

[@copy_frequency =] copy_frequency

复制计划的频率，单位为分钟。copy_frequency 的数据类型为 int，默认设置为 5 分钟。

[@restore_frequency =] restore_frequency

计划的还原作业发生的频率，单位为分钟。restore_frequency 的数据类型为 int，默认设置为 5 分钟。

[@plan_id =] plan_id OUTPUT

指派给成功创建的计划的计划标识号。plan_id 是 uniqueidentifier 类型的输出变量，默认设置为 NULL。

返回代码值

0（成功）或 1（失败）

注释

sp_add_log_shipping_plan 也可用于创建两个作业以执行该计划的复制和装载。

在成功执行 sp_add_log_shipping_plan 后，可以执行 sp_add_log_shipping plan_database 以将数据库添加到计划中。

权限

只有 sysadmin 固定服务器角色的成员才可以执行 sp_add_log_shipping_plan。

示例
EXEC   msdb.dbo.sp_add_log_shipping_plan
   @plan_name=N'Pubs database backup'
   @description= N'Log shipping the pubs database',
   @source_server= N'my_source',
   @source_dir= N'\\my_source\pubs_logshipping',
   @destination_dir= N'c:\logshipping\pubs',
   @history_retention_period= 60,  -- 1 hour
   @file_retention_period= 1440,  -- 1 day
   @copy_frequency= 10,  -- copy files every 10 minutes
   @restore_frequency= 30  -- load files every 30 minutes


sp_add_log_shipping_plan_database

将新数据库添加到现有的日志传送计划。

语法

sp_add_log_shipping_plan_database
{ [ @plan_id = ] plan_id | [ @plan_name = ] 'plan_name' }
{ , [ @source_database = ] 'source_database' }
{ , [ @destination_database = ] 'destination_database' }
[ , [ @load_delay = ] load_delay ]
[ , [ @load_all = ] load_all ]
[ , [ @copy_enabled = ] copy_enabled ]
[ , [ @load_enabled = ] load_enabled ]

参数

[@plan_id =] plan_id

数据库将被添加到的计划标识号。plan_id 的数据类型为 uniqueidentifier，默认设置为 NULL。

[@plan_name =] 'plan_name'

数据库将要添加到的计划名称。plan_name 的数据类型为 sysname，默认设置为 NULL。

说明 必须指定 plan_id 或 plan_name。二者不能同时指定。

[@source_database =] 'source_database'

源服务器上的数据库名称。source_database 的数据类型为 sysname，没有默认设置。

[@destination_database =] 'destination_database'

目标数据库的名称。destination_database 的数据类型为 sysname，没有默认设置。目标数据库在 log_shipping_plan_database 表中必须唯一。

[@load_delay =] load_delay

在装载事务日志之前要等待的时间，以分钟为单位。load_delay 的数据类型为 int，默认设置为零 (0)。

[@load_all =] load_all

指定当作业运行时应该装载所有新近复制的事务日志。如果将此值设置为零 (0)，则当作业运行时只加载一个事务日志。如果此值为一 (1)，则装载所有复制的事务日志。load_all 的数据类型为 bit，默认设置为一 (1)。

[@copy_enabled =] copy_enabled

指定是否要执行该数据库的复本。copy_enabled 的数据类型为 bit。值为一 (1) 意味着应该执行复本；值为零 (0) 意味着没有制作复本。

[@load_enabled =] load_enabled

指定是否应该执行该数据库的事务日志装载。load_enabled 的数据类型为 bit。值为一 (1) 意味着应该执行装载；值为零 (0) 意味着没有执行装载。

返回代码值

0（成功）或 1（失败）

权限

只有 sysadmin 固定服务器角色的成员才可以执行 sp_add_log_shipping_plan_database。

示例

注意此示例假定 'Pubs database backup' 计划已经存在。

EXECUTE   msdb.dbo.sp_add_log_shipping_plan_database
   @plan_name = N'Pubs database backup',
   @source_database = N'Pubs',
   @destination_database = N'pubs_standby',
   @load_delay = 60  –– wait an hour before loading the transaction logs


sp_add_log_shipping_primary

将新的主服务器添加到 log_shipping_primaries 表。

语法

sp_add_log_shipping_primary
{ [ @primary_server_name = ] 'primary_server_name' ,
{ [ @primary_database_name = ] 'primary_database_name' }
[ , [ @maintenance_plan_id = ] maintenance_plan_id ]
[ , [ @backup_threshold = ] backup_threshold ]
[ , [ @threshold_alert = ] threshold_alert ]
[ , [ @threshold_alert_enabled = ] threshold_alert_enabled ]
[ , [ @planned_outage_start_time = ] planned_outage_start_time ]
[ , [ @planned_outage_end_time = ] planned_outage_end_time ]
[ , [ @planned_outage_weekday_mask = ] planned_outage_weekday_mask ]
[ , [ @primary_id = ] primary_id OUTPUT ]

参数

[@primary_server_name =] 'primary_server_name'

主服务器名称。primary_server_name 的数据类型为 sysname，没有默认值。

[@primary_database_name =] 'primary_database_name'

主服务器上的数据库名称。primary_database_name 的数据类型为 sysname，没有默认值。

[@maintenance_plan_id =] maintenance_plan_id

备份事务日志的维护计划的 ID。maintenance_plan_id 的数据类型为 uniqueidentifier，默认设置为 NULL。

[@backup_threshold =] backup_threshold

在最后一次备份后 threshold_alert 错误产生之前的时间长度，以分钟为单位。backup_threshold 的数据类型为 int，默认设置为 60 分钟。

[@threshold_alert =] threshold_alert

超出备份阈值时引发的错误。threshold_alert 的数据类型为 int，默认设置为 NULL。

[@threshold_alert_enabled =] threshold_alert_enabled

指定当超出 backup_threshold 值时是否发出警报。默认设置为一 (1)，意味着将发出警报。threshold_alert_enabled 的数据类型为 bit。

[@planned_outage_start_time =] planned_outage_start_time

计划的停歇启动的时间，格式为 HHMMSS。在计划的停歇期间，如果超出备份阈值将不会发出警报。planned_outage_start_time 的数据类型为 int，默认设置为零 (0)。

[@planned_outage_end_time =] planned_outage_end_time

计划的停歇结束的时间，格式为 HHMMSS。planned_outage_end_time 的数据类型为 int，默认设置为零 (0)。

[@planned_outage_weekday_mask =] planned_outage_weekday_mask

指定计划的停歇发生在星期几。planned_outage_weekday_mask 的数据类型为 int，默认设置为零 (0)。它可以是下列值中的一个或多个。

值 | 天
1 | 星期日
2 | 星期一
4 | 星期二
8 | 星期三
16 | 星期四
32 | 星期五
64 | 星期六

[@primary_id =] primary_id OUTPUT

新主服务器和数据库对的唯一 ID。primary_id 的数据类型为 uniqueidentifier。

返回代码值

0（成功）或 1（失败）

注释

若要指定监视主服务器，请在监视服务器上执行 sp_add_log_shipping_primary。

权限

只有 sysadmin 固定服务器角色的成员才可以执行sp_add_log_shipping_primary。


sp_add_log_shipping_secondary

将第二台服务器添加到 log_shipping_secondaries 表。

语法

sp_add_log_shipping_secondary { [ @primary_id = ] primary_id }
{ , [ @secondary_server_name = ] 'secondary_server_name' }
{ , [ @secondary_database_name = ] 'seconday_database_name' }
[ , [ @secondary_plan_id = ] secondary_plan_id ]
[ , [ @copy_enabled = ] copy_enabled ]
[ , [ @load_enabled = ] load_enabled ]
[ , [ @out_of_sync_threshold = ] out_of_sync_threshold ]
[ , [ @threshold_alert = ] 'threshold_alert' ]
[ , [ @threshold_alert_enabled = ] threshold_alert_enabled ]
[ , [ @planned_outage_start_time = ] planned_outage_start_time ]
[ , [ @planned_outage_end_time = ] planned_outage_end_time ]
[ , [ @planned_outage_weekday_mask = ] planned_outage_weekday_mask ]

参数

[@primary_id =] primary_id

主服务器的 ID。primary_id 的数据类型为 int，没有默认设置。

[@secondary_server_name =] 'secondary_server_name'

第二台服务器的名称。secondary_server_name 的数据类型为 sysname，没有默认值。

[@secondary_database_name =] 'secondary_database_name'

第二个数据库的名称。secondary_database_name 的数据类型为 sysname，没有默认设置。

[@secondary_plan_id =] secondary_plan_id

第二台服务器上日志传送计划的 ID。secondary_plan_id 的数据类型为 uniqueidentifier，默认设置为 NULL。

[@copy_enabled =] copy_enabled

指定是否在第二台服务器上启用数据库的复本。默认设置为一 (1)，意味着启用复本；值为零 (0) 意味着不启用复本。copy_enabled 的数据类型为 bit。

[@load_enabled =] load_enabled

指定是否在第二台服务器上启用数据库的装载。默认设置 1 (1) 意味着启用装载；0 (0) 表示没有启用装载。load_enabled 的数据类型为 bit。

[@out_of_sync_threshold =] out_of_sync_threshold

从上一次装载之后至引发错误之前的时间（以分钟计）。out_of_sync_threshold 的数据类型为 int，默认设置为 60 分钟。

[@threshold_alert =] 'threshold_alert'

超出 out-of-sync 阈值时引发的错误。threshold_alert 的数据类型为 int，默认设置为 14,421。

[@threshold_alert_enabled =] threshold_alert_enabled

指定当超出 out-of-sync 阈值时是否引发警报。默认设置为一 (1)，意味着将发出警报，值为零 (0) 意味着不会发出警报，threshold_alert_enabled 的数据类型为 bit。

[@planned_outage_start_time =] planned_outage_start_time

计划的停歇开始的时间，格式为 HHMMSS。在计划的停歇期间，如果超出偏离同步阈值将不会发出警报。planned_outage_start_time 的数据类型为 int，默认设置为零 (0)。

[@planned_outage_end_time =] planned_outage_end_time

计划的停歇结束的时间，格式为 HHMMSS。planned_outage_end_time 的数据类型为 int，默认设置为零 (0)。

[@planned_outage_weekday_mask =] planned_outage_weekday_mask

指定计划的停歇发生在星期几。planned_outage_weekday_mask 的数据类型为 int，默认设置为零 (0)。它可以是下列值中的一个或多个。

值 | 天
1 | 星期日
2 | 星期一
4 | 星期二
8 | 星期三
16 | 星期四
32 | 星期五
64 | 星期六

返回代码值

0（成功）或 1（失败）

注释

该过程用于将第二个数据库添加到现有的主数据库中。

权限

只有 sysadmin 固定服务器角色的成员才可以执行 sp_add_log_shipping_secondary。


sp_add_maintenance_plan

添加维护计划并返回该计划 ID。

语法

sp_add_maintenance_plan [ @plan_name = ] 'plan_name' ,
@plan_id = 'plan_id' OUTPUT

参数

[@plan_name =] 'plan_name'

指定要添加的维护计划的名称。plan_name 的数据类型为 varchar(128)。

@plan_id = 'plan_id'

指定维护计划的 ID。plan_id 的数据类型为 uniqueidentifier。

返回代码值

0（成功）或 1（失败）

注释

sp_add_maintenance_plan（必须从 msdb 数据库中运行）创建一个新的空维护计划。若要添加一个或多个数据库并将它们和一个或多个作业关联，请执行 sp_add_maintenance_plan_db 和 sp_add_maintenance_plan_job。

权限

只有 sysadmin 固定服务器角色的成员才可以执行 sp_add_maintenance_plan。

示例

创建一个名为 Myplan 的维护计划。

DECLARE   @myplan_id UNIQUEIDENTIFIER
EXECUTE   sp_add_maintenance_plan N'Myplan',@plan_id=@myplan_id OUTPUT
PRINT   'The id for the maintenance plan "Myplan" is:'+convert(varchar(256),@myplan_id)
GO

若成功创建了维护计划，则将返回计划 ID。

'The id for the maintenance plan "Myplan" is:' FAD6F2AB-3571-11D3-9D4A-00C04FB925FC


sp_add_maintenance_plan_db

将数据库和维护计划相关联。

语法

sp_add_maintenance_plan_db [ @plan_id = ] 'plan_id' ,
[ @db_name = ] 'database_name'

参数

[@plan_id =] 'plan_id'

指定维护计划的计划 ID。plan_id 的数据类型为 uniqueidentifier，并且必须是一个有效的 ID。

[@db_name =] 'database_name'

指定要添加到维护计划的数据库的名称。在数据库添加到计划之前，它必须已经创建或者已经存在。database_name 的数据类型为 sysname。

返回代码值

0（成功）或 1（失败）

注释

必须从 msdb 数据库运行 sp_add_maintenance_plan_db。

权限

只有 sysadmin 固定服务器角色的成员才可以执行 sp_add_maintenance_plan_db。

示例

下面的示例将 Northwind 数据库添加到 sp_add_maintenance_plan 中创建的维护计划。

Execute   sp_add_maintenance_plan_db N'FAD6F2AB-3571-11D3-9D4A-00C04FB925FC',N'Northwind'


sp_add_maintenance_plan_job

将维护计划和现有的作业相关联。

语法

sp_add_maintenance_plan_job [ @plan_id = ] 'plan_id'
, [ @job_id = ] 'job_id'

参数

[@plan_id =] 'plan_id'

指定维护计划的 ID。plan_id 的数据类型为 uniqueidentifier 并且必须是有效 ID。

[@job_id =] 'job_id'

指定要与维护计划相关联的作业的 ID。job_id 的数据类型为 uniqueidentifier，并且必须是有效的 ID。若要创建一个或多个作业，请执行 sp_add_job，或者使用 SQL Server 企业管理器。

返回代码值

0（成功）或 1（失败）

注释

必须从 msdb 数据库运行 sp_add_maintenance_plan_job。

权限

只有 sysadmin 固定服务器角色的成员才可以执行 sp_add_maintenance_plan_job。

示例

下面的示例将作业"B8FCECB1-E22C-11D2-AA64-00C04F688EAE"添加到使用 sp_add_maintenance_plan_job 创建的维护计划。

EXECUTE   sp_add_maintenance_plan_job N'FAD6F2AB-3571-11D3-9D4A-00C04FB925FC', N'B8FCECB1-E22C-11D2-AA64-00C04F688EAE'


sp_add_notification

设置警报提示。

语法

sp_add_notification [ @alert_name = ] 'alert' ,
[ @operator_name = ] 'operator' ,
[ @notification_method = ] notification_method

参数

[@alert_name =] 'alert'

该提示的警报。alert 的数据类型为 sysname，没有默认设置。

[@operator_name =] 'operator'

警报发生时要提示的操作员。operator 的数据类型为 sysname，没有默认设置。

[@notification_method =] notification_method

通知操作员的方法。notification_method 的数据类型为 tinyint，没有默认设置，可以为下列一个或多个与 OR 逻辑运算符结合使用的值。

值 | 描述
1 | 电子邮件
2 | 呼叫程序
4 | net send

返回代码值

0（成功）或 1（失败）

结果集

无

注释

必须从 msdb 数据库运行 sp_add_notification。

SQL Server 企业管理器提供一种简单的图形方法管理整个警报系统。推荐使用 SQL Server 企业管理器配置警报基本结构。

若要发送响应警报的提示，必须首先配置 Microsoft® SQL Server™ 代理程序发送邮件。有关更多信息，请参见配置 SQLServerAgent 服务。

如果发送电子邮件或呼叫程序提示时出现故障，则该故障将被记录到 SQL Server 代理程序服务错误日志中。

权限

只有 sysadmin 固定服务器角色的成员才可以执行 sp_add_notification。

示例

此示例为指定警报（测试警报）添加电子邮件通知。

说明 此示例假设测试警报已经存在，并且 stevenb 是有效的操作员名称。

USE msdb
GO
EXEC sp_add_notification 'Test Alert', 'stevenb', 1

请参见

sp_delete_notification

sp_help_notification

sp_update_notification

系统存储过程


sp_add_operator

创建与警报和作业一起使用的操作员（提示接收者）。

语法

sp_add_operator [ @name = ] 'name'
[ , [ @enabled = ] enabled ]
[ , [ @email_address = ] 'email_address' ]
[ , [ @pager_address = ] 'pager_address' ]
[ , [ @weekday_pager_start_time = ] weekday_pager_start_time ]
[ , [ @weekday_pager_end_time = ] weekday_pager_end_time ]
[ , [ @saturday_pager_start_time = ] saturday_pager_start_time ]
[ , [ @saturday_pager_end_time = ] saturday_pager_end_time ]
[ , [ @sunday_pager_start_time = ] sunday_pager_start_time ]
[ , [ @sunday_pager_end_time = ] sunday_pager_end_time ]
[ , [ @pager_days = ] pager_days ]
[ , [ @netsend_address = ] 'netsend_address' ]
[ , [ @category_name = ] 'category' ]

参数

[@name =] 'name'

操作员（提示接收者）的名称。此名称必须唯一，不能含有百分比 (%) 字符。name 的数据类型为 sysname，没有默认设置。

[@enabled =] enabled

表示操作员的当前状态。enabled 的数据类型为 tinyint，默认设置为 1（已启用）。如果为 0，则未启用操作员，并且不能接收提示。

[@email_address =] 'email_address'

操作员的电子邮件地址。该字符串直接传递到电子邮件系统。email_address 的数据类型为 nvarchar(100)，默认值为 NULL。

说明 如果 email_address 或 pager_addresss 为物理地址 ('SMTP:jdoe@xyz.com') 而不是别名 ('jdoe')，则该值必须包含在方括号内：'[SMTP:jdoe@xyz.com]'。

[@pager_address =] 'pager_address'

操作员的呼叫程序地址。该字符串直接传递到电子邮件系统。pager_addresss 的数据类型为 narchar(100)，默认设置为 NULL。

[@weekday_pager_start_time =] weekday_pager_start_time

Microsoft® SQL Server™ 代理程序在工作日（星期一到星期五）将呼叫提示发送给指定操作员之前的时间。weekday_pager_start_time 的数据类型为 int，默认设置为 090000，表示 24 小时制的上午 9:00，且必须使用 HHMMSS 的形式输入。

[@weekday_pager_end_time =] weekday_pager_end_time

SQLServerAgent 服务在工作日（星期一到星期五）不再将呼叫提示发送给指定操作员之前的时间。weekday_pager_end_time 的数据类型为 int，默认设置为 180000，表示 24 小时制的下午 6:00，且必须使用 HHMMSS 的形式输入。

[@saturday_pager_start_time =] saturday_pager_start_time

SQL Server 代理服务在星期六将呼叫提示发送给指定操作员之前的时间。saturday_pager_start_time 的数据类型为 int，默认设置为 090000，表示 24 小时制的上午 9:00，且必须使用 HHMMSS 的形式输入。

[@saturday_pager_end_time =] saturday_pager_end_time

SQLServerAgent 服务在星期六不再将呼叫提示发送给指定操作员之前的时间。saturday_pager_end_time 的数据类型为 int，默认设置为 180000，表示 24 小时制的下午 6:00，且必须使用 HHMMSS 的形式输入。

[@sunday_pager_start_time =] sunday_pager_start_time

SQLServerAgent 服务在星期天将呼叫提示发送给指定操作员之前的时间，sunday_pager_start_time 的数据类型为 int，默认设置为 090000，表示 24 小时制的上午 9:00，且必须使用 HHMMSS 的形式输入。

[@sunday_pager_end_time =] sunday_pager_end_time

SQLServerAgent 服务在星期天不再将呼叫提示发送给指定操作员之前的时间。sunday_pager_end_time 的数据类型为 int，默认设置为 180000，表示 24 小时制的下午 6:00，且必须使用 HHMMSS 的形式输入。

[@pager_days =] pager_days

一个数字，表示操作员可以接受呼叫的日期（受限于指定的开始/结束时间）。pager_days 的数据类型为 tinyint，默认设置为 0，表示操作员不再有空接受呼叫。有效值从 0 到 127。对于所需的日期，可通过将单个值相加计算 pager_days。例如，从星期一到星期五为 2+4+8+16+32 = 62。

值 | 描述
1 | 星期日
2 | 星期一
4 | 星期二
8 | 星期三
16 | 星期四
32 | 星期五
64 | 星期六

[@netsend_address =] 'netsend_address'

网络消息发送到的操作员的网络地址。netsend_address 的数据类型为 nvarchar(100)，默认值为 NULL。

[@category_name =] 'category'

该警报的类别名称。category 的数据类型为 sysname，默认值为 NULL。

返回代码值

0（成功）或 1（失败）

结果集

无

注释

必须从 msdb 数据库运行 sp_add_operator。

电子邮件系统支持呼叫，如果想使用呼叫，则该系统必须有电子邮件到呼叫程序的能力。

SQL Server 企业管理器提供易于使用的图形方法来管理作业，建议使用该方法创建和管理作业基本结构。

权限

只有 sysadmin 固定服务器角色的成员才可以执行 sp_add_operator。

示例

此示例设置 janetl 的操作员信息。启用操作员信息，这样，呼叫程序将从星期一到星期五的上午 8 点到下午 5 点通知 janetl。

use msdb
exec sp_add_operator @name = 'Janet Leverling',
   @enabled = 1,
   @email_address ='janetl',
   @pager_address = '5673219@mypagerco.com',
   @weekday_pager_start_time = 080000,
   @weekday_pager_end_time = 170000,
   @pager_days = 62

请参见

sp_delete_operator

sp_help_operator

sp_update_operator

系统存储过程


sp_add_targetservergroup

添加指定的服务器组。

语法

sp_add_targetservergroup [ @name = ] 'name'

参数

[@name =] 'name'

要创建的服务器组的名称。name 的数据类型为 sysname，没有默认值，name 不能包含逗号。

返回代码值

0（成功）或 1（失败）

结果集

无

注释

目标服务器组提供将一组目标服务器作为作业目标的简单方法。有关更多信息，请参见本卷中的"sp_apply_job_to_targets"。

权限

只有 sysadmin 固定服务器角色的成员才可以执行这一过程。

示例

下面的示例创建名为 Servers Processing Customer Orders 的目标服务器组。

USE msdb
EXEC sp_add_targetservergroup 'Servers Processing Customer Orders'

请参见

sp_delete_targetservergroup

sp_help_targetservergroup

sp_update_targetservergroup

系统存储过程


sp_add_targetsvrgrp_member

将指定的目标服务器添加到指定的目标服务器组。

语法

sp_add_targetsvrgrp_member [ @group_name = ] 'group_name' ,
[ @server_name = ] 'server_name'

参数

[@group_name =] 'group_name'

组的名称。group_name 的数据类型为 sysname，没有默认值。

[@server_name =] 'server_name'

要添加到指定的组中的服务器的名称。server_name 的数据类型为 nvarchar(30)，没有默认值。

返回代码值

0（成功）或 1（失败）

结果集

无

注释

一个目标服务器可以是多个目标服务器组的成员。

权限

只有 sysadmin 固定服务器角色的成员才可以执行这一过程。

示例

下面的示例添加组 Servers Maintaining Customer Information，并将 LONDON1 服务器添加到该组中。

USE msdb
EXEC sp_add_targetsvrgrp_member 'Servers Maintaining Customer Information', 'LONDON1'

请参见

sp_delete_targetsvrgrp_member

系统存储过程


sp_addalias

在数据库中，把登录映射到用户。为向后兼容性提供 sp_addalias。Microsoft® SQL Server™ 7.0 版提供角色，并提供向角色授予权限的能力，作为使用别名的另一种方法。

语法

sp_addalias [ @loginame = ] 'login'
, [ @name_in_db = ] 'alias_user'

参数

[ @loginame = ] 'login'

准备化名的登录名。login 的数据类型为 sysname，没有默认设置。login 必须是有效的 SQL Server 登录名或是具有连接 SQL Server 权限的 Microsoft Windows NT® 用户。login不得已经存在，也不能化名为数据库中的已有用户。

[ @name_in_db = ] 'alias_user'

登录映射到的用户名称。alias_user 的数据类型为 sysname，没有默认设置。alias_user 必须是数据库中有效的 Windows NT 或 SQL Server 用户，在该数据库中登录使用别名。指定 Windows NT 用户时，请指定 Windows NT 用户在数据库中已知的名称（用 sp_grantdbaccess 添加）。

返回代码值

0（成功）或 1（失败）

注释

可以映射到任何数据库的用户的登录。只能在用户必须使用别名的数据库中执行 sp_addalias。当用户用 login 连接到 SQL Server 时，用户可以在适用于 alias_user 的权限下，在数据库中执行活动。

说明 sa 登录不能用别名。

在下列情况下，登录可以使用数据库：

  • 在该数据库中，登录拥有与之相关的用户帐户。

  • 在数据库中，登录拥有一个用户别名，该别名已被 sysadmin 固定服务器角色的数据库所有者或成员使用 sp_addalias 进行添加。

  • guest 帐户已被添加到数据库中。

不能在用户定义事务处理中执行 sp_addalias。

以下显示几个与 sp_addalias 一同使用的系统存储过程。

存储过程 | 描述
sp_helplogins | 返回有效 login 值的列表。
sp_helpuser | 返回数据库中有效alias_user 值的列表，在该数据库中要使用登录。
sp_dropalias | 删除一项别名映射。

权限

只有 sysadmin 固定服务器角色成员和 db_accessadmin 及 db_owner 固定数据库角色成员才能执行 sp_addalias。

示例

下面的示例允许 SQL Server 登录 Victoria（它不是当前数据库的一个用户）以便将当前数据库和别名 Victoria 用到一个当前数据库已经存在的用户 (Albert) 中。

EXEC sp_addalias 'Victoria', 'Albert'

请参见

sp_addlogin

sp_addrole

sp_adduser

sp_dropalias

sp_helplogins

sp_helpuser

系统存储过程


sp_addapprole

在当前数据库中添加一个特殊类型的角色以使应用程序安全。

语法

sp_addapprole [ @rolename = ] 'role'
[ @password = ] 'password'

参数

[ @rolename = ] 'role'

新角色的名称。role 的数据类型为 sysname，没有默认设置。role 必须是有效的标识符，并且不能是当前数据库中已经存在的标识符。

[ @password = ] 'password'

激活角色所需的密码。password 的数据类型为 sysname，没有默认设置。password 以加密形式存储。

返回代码值

0（成功）或 1（失败）

注释

Microsoft® SQL Server™ 角色可以包含 1 到 128 个字符，包括字母、符号和数字。但是，角色不能：

  1. 含有反斜线 (\)。

  2. 为 NULL 或空字符串。

标准角色和应用程序角色间的基本差别是：

  1. 应用程序角色不包含成员。用户、Microsoft Windows NT® 组和角色无法添加到应用程序角色中。当通过特定的一个或多个应用程序为用户的连接激活应用程序角色时，就会获得该应用程序角色的权限。带有应用程序角色的用户关联是由能够运行某个可以激活该角色，而不是该角色的某个成员的应用程序产生的。

  2. 应用程序角色默认设置为未激活状态。使用 sp_setapprole 激活它们，同时需要一个密码。例如，密码可以通过应用程序提示由用户提供，然而，该密码通常包含在应用程序内。在密码被发送到 SQL Server 时，它可以被加密。

  3. 当一个应用程序角色被该应用程序激活以用于连接时，连接会在连接期间永久地失去数据库中所有用来登录的权限、用户帐户、其它组或数据库角色。连接获得与数据库的应用程序角色相关联的权限，应用程序角色存在于该数据库中。因为应用程序角色只能应用于它们所存在的数据库中，所以连接只能通过授予其它数据库中 guest 用户帐户的权限，获得对另一个数据库的访问。因此，如果数据库中没有 guest 用户帐户，则连接无法获得对该数据库的访问。如果 guest 用户帐户确实存在于数据库中，但是访问对象的权限没有被明确地授予 guest，那么不论是谁创建的对象，连接都不能访问该对象。用户从应用程序角色获得的权限仍然有效，直到连接从 SQL Server 注销为止。

用户定义事务内不能执行 sp_addapprole。

权限

只有 sysadmin 固定服务器角色成员和 db_owner 及 db_securityadmin 固定数据库角色成员才能执行 sp_addapprole。

示例

下面的示例用密码 xyz_123 将新应用程序角色 SalesApp 添加到当前数据库中。

EXEC sp_addapprole 'SalesApp', 'xyz_123'

请参见

应用程序安全性和应用程序角色

SQL Server 登录、用户、角色和密码的规则

sp_dropapprole

sp_setapprole

系统存储过程


sp_addextendedproc

将新扩展存储过程的名称注册到 Microsoft® SQL Server™ 上。

语法

sp_addextendedproc [ @functname = ] 'procedure' ,
[ @dllname = ] 'dll'

参数

[ @functname = ] 'procedure'

在动态链接库 (DLL) 内调用的函数名称。procedure 的数据类型为 nvarchar(517)，没有默认设置。procedure 能够可选地包含 owner.function 形式的所有者名称。

[ @dllname = ] 'dll'

包含该函数的 DLL 名称。dll 的数据类型为 varchar(255)，没有默认设置。

返回代码值

0（成功）或 1（失败）

结果集

无

注释

使用 Microsoft Open Data Services 的程序员可以创建扩展存储过程。创建扩展存储过程后，必须使用 sp_addextendedproc 将此存储过程添加到 SQL Server 上。有关更多信息，请参见创建扩展存储过程。

只将一个扩展存储过程添加到 master 数据库中。若要从非 master 的数据库中执行扩展存储过程，请用 master 限定扩展存储过程的名称。

sp_addextendedproc 将条目添加到 sysobjects 中，用 SQL Server 注册新扩展存储过程名称。同样在 syscomments 表中添加一个条目。

权限

只有 sysadmin 固定服务器角色的成员才可以执行 sp_addextendedproc。

示例

下例添加 xp_hello 扩展存储过程。

USE master
EXEC sp_addextendedproc xp_hello, 'xp_hello.dll'

请参见

EXECUTE

GRANT

REVOKE

sp_dropextendedproc

sp_helpextendedproc

系统存储过程


sp_addextendedproperty

将新扩展属性添加到数据库对象中。如果属性已经存在，则过程失败。

语法

sp_addextendedproperty
[ @name = ] { 'property_name' }
[ , [ @value = ] { 'value' }
[ , [ @level0type = ] { 'level0_object_type' }
, [ @level0name = ] { 'level0_object_name' }
[ , [ @level1type = ] { 'level1_object_type' }
, [ @level1name = ] { 'level1_object_name' }
[ , [ @level2type = ] { 'level2_object_type' }
, [ @level2name = ] { 'level2_object_name' }
]
]
]
]

参数

[ @name = ] { 'property_name' }

要添加的属性名称。property_name 的数据类型为 sysname，它不能是 NULL。名称可能还包括空白或非字母数字字符串和二进制值。

[ @value = ] { 'value' }

将要与属性相关联的值。value 的数据类型为 sql_variant，带有默认设置 NULL。value 的大小不能超过 7,500 字节；否则 SQL Server 会产生错误。

[ @level0type = ] { 'level0_object_type' }

用户或用户定义类型。level0_object_type 的数据类型为 varchar(128)，其默认值为 NULL。有效的输入是 USER、TYPE 和 NULL。

[ @level0name = ] { 'level0_object_name' }

指定的 0 级对象类型的名称。level0_object_name 的数据类型为 sysname，其默认值为 NULL。

[ @level1type = ] { 'level1_object_type' }

1 级对象的类型。level1_object_type 的数据类型为 varchar(128)，其默认值为 NULL。有效的输入是 TABLE、VIEW、PROCEDURE、FUNCTION、DEFAULT、RULE 和 NULL。

[ @level1name = ] { 'level1_object_name' }

指定的 1 级对象类型的名称。level1_object_name 的数据类型为 sysname，其默认值为 NULL。

[ @level2type = ] { 'level2_object_type' }

2 级对象的类型。level2_object_type 的数据类型为 varchar(128)，其默认值为 NULL。有效的输入是 COLUMN、PARAMETER、INDEX、CONSTRAINT、TRIGGER 和 NULL。

[ @level2name = ] { 'level2_object_name' }

指定的 2 级对象类型的名称。level2_object_name 的数据类型为 sysname,其默认值为 NULL。

返回代码值

0（成功）或 1（失败）

注释

系统对象不允许有扩展属性。

对象是按级别区分的，0 级为最高，2 级为最低。当用户添加、更新或删除扩展属性时，必须指定所有更高级别的对象。例如，如果用户要向 1 级对象添加扩展属性，就必须指定所有 0 级信息。如果用户要向 2 级对象添加扩展属性，则必须提供关于 0 级和 1 级的所有信息。

在每个级别上，对象类型和对象名可唯一地标识对象。如果指定了一个对中的任一方，则必须指定另一方。

给定了有效 property_name 和 value，如果没有任何对象类型和名称，则属性属于当前数据库。如果指定对象类型和名称，则还必须指定父对象和类型。否则，SQL Server 会产生错误。

权限

db_owner 和 db_ddladmin 固定数据库角色的成员可以将扩展属性添加到任何对象中。用户可以为他们所拥有的对象添加扩展属性。然而，只有 db_owner 可以将属性添加到用户名称中。

示例

下面的示例将属性 ('caption,' 'Employee ID') 添加到表"T1"的"ID"列中。

CREATE   table T1 (id int , name char (20))
GO
EXEC   sp_addextendedproperty 'caption', 'Employee ID', 'user', dbo, 'table', T1, 'column', id

请参见

fn_listextendedproperty


sp_addgroup

在当前的数据库中创建一个组。为了向后兼容性，将 sp_addgroup 包含在其中。Microsoft® SQL Server™ 7.0 版使用角色而不是组。使用 sp_addrole 添加一个角色。

语法

sp_addgroup [ @grpname = ] 'group'

参数

[ @grpname = ] 'group'

要添加的组的名称。group 的数据类型为 sysname，没有默认设置。

返回代码值

0（成功）或 1（失败）

注释

sp_addgroup 调用 sp_addrole 来添加一个新组。

权限

只有 sysadmin 固定服务器角色成员和 db_securityadmin 及 db_owner 固定数据库角色成员才能执行 sp_addgroup。

示例

下面的示例创建 accounting 组。

EXEC sp_addgroup 'accounting'

请参见

sp_addrole

sp_changegroup

sp_dropgroup

sp_helpgroup

sp_helprole

系统存储过程


sp_addlinkedserver

创建一个链接的服务器，使其允许对分布式的、针对 OLE DB 数据源的异类查询进行访问。在使用 sp_addlinkedserver 创建链接的服务器之后，此服务器就可以执行分布式查询。如果链接服务器定义为 Microsoft® SQL Server™，则可执行远程存储过程。

语法

sp_addlinkedserver [ @server = ] 'server'
[ , [ @srvproduct = ] 'product_name' ]
[ , [ @provider = ] 'provider_name' ]
[ , [ @datasrc = ] 'data_source' ]
[ , [ @location = ] 'location' ]
[ , [ @provstr = ] 'provider_string' ]
[ , [ @catalog = ] 'catalog' ]

参数

[ @server = ] 'server'

要创建的链接服务器的本地名称，server 的数据类型为 sysname，没有默认设置。

如果有多个 SQL Server 实例，server 可以为 servername\instancename。此链接的服务器可能会被引用为下面示例的数据源：

SELECT *FROM    [servername\instancename.]pubs.dbo.authors.

如果未指定 data_source，则服务器为该实例的实际名称。

[ @srvproduct = ] 'product_name'

要添加为链接服务器的 OLE DB 数据源的产品名称。product_name 的数据类型为 nvarchar(128)，默认设置为 NULL。如果是 SQL Server，则不需要指定 provider_name、data_source、location、provider_string 以及目录。

[ @provider = ] 'provider_name'

与此数据源相对应的 OLE DB 提供程序的唯一程序标识符 (PROGID)。provider_name 对于安装在当前计算机上指定的 OLE DB 提供程序必须是唯一的。provider_name 的数据类型为nvarchar(128)，默认设置为 NULL。OLE DB 提供程序应该用给定的 PROGID 在注册表中注册。

[ @datasrc = ] 'data_source'

由 OLE DB 提供程序解释的数据源名称。data_source 的数据类型为 nvarchar(4000)，默认设置为 NULL。data_source 被当作 DBPROP_INIT_DATASOURCE 属性传递以便初始化 OLE DB 提供程序。

当链接的服务器针对于 SQL Server OLE DB 提供程序创建时，可以按照 servername\instancename 的形式指定 data_source，它可以用来连接到运行于特定计算机上的 SQL Server 的特定实例上。servername 是运行 SQL Server 的计算机名称，instancename 是用户将被连接到的特定 SQL Server 实例的名称。

[ @location = ] 'location'

OLE DB 提供程序所解释的数据库的位置。location 的数据类型为 nvarchar(4000)，默认设置为 NULL。location 作为 DBPROP_INIT_LOCATION 属性传递以便初始化 OLE DB 提供程序。

[ @provstr = ] 'provider_string'

OLE DB 提供程序特定的连接字符串，它可标识唯一的数据源。provider_string 的数据类型为 nvarchar(4000)，默认设置为 NULL。Provstr 作为 DBPROP_INIT_PROVIDERSTRING 属性传递以便初始化 OLE DB 提供程序。

当针对 Server OLE DB 提供程序提供了链接服务器后，可将 SERVER 关键字用作 SERVER=servername\instancename 来指定实例，以指定特定的 SQL Server 实例。servername 是 SQL Server 在其上运行的计算机名称，instancename 是用户连接到的特定的 SQL Server 实例名称。

[ @catalog = ] 'catalog'

建立 OLE DB 提供程序的连接时所使用的目录。catalog 的数据类型为sysname，默认设置为 NULL。catalog 作为 DBPROP_INIT_CATALOG 属性传递以便初始化 OLE DB 提供程序。

返回代码值

0（成功）或 1（失败）

结果集

如果没有指定参数，则 sp_addlinkedserver 返回此消息：

Procedure 'sp_addlinkedserver' expects parameter '@server', which was not supplied.

使用适当 OLE DB 提供程序和参数的 sp_addlinkedserver 返回此消息：

Server added.
注释

下表显示为可通过 OLE DB 访问的数据源设置链接服务器的方法。对于给定的数据源，可以使用多种方法为其设置链接服务器，下表中可能有不止一行适用于一种数据源类型。下表也显示了用于设置链接服务器的 sp_addlinkedserver 参数值。

远程 OLE DB 数据源 | OLE DB 提供程序 | product_name | provider_name | data_source | location | provider_string | catalog
SQL Server | 用于 SQL Server 的 Microsoft OLE DB 提供程序 | SQL Server (1)（默认值） | - | - | - | - | -
SQL Server | 用于 SQL Server 的 Microsoft OLE DB 提供程序 | SQL Server | SQLOLEDB | SQL Server 的网络名称（用于默认实例） | - | - | 数据库名称（可选）
SQL Server | 用于 SQL Server 的 Microsoft OLE DB 提供程序 | - | SQLOLEDB | 服务器名\实例名（对于特定实例） | - | - | 数据库名称（可选）
Oracle | 用于 Oracle 的 Microsoft OLE DB 提供程序 | 任何 (2) | MSDAORA | 用于 Oracle 数据库的 SQL*Net 别名 | - | - | -
Access/ Jet | 用于 Jet 的 Microsoft OLE DB 提供程序 | 任何 | Microsoft.Jet.OLEDB.4.0 | Jet 数据库文件的完整路径名 | - | - | -
ODBC 数据源 | 用于 ODBC 的 Microsoft OLE DB 提供程序 | 任何 | MSDASQL | ODBC 数据源的系统 DSN | - | - | -
ODBC 数据源 | 用于 ODBC 的 Microsoft OLE DB 提供程序 | 任何 | MSDASQL | - | - | ODBC 连接字符串 | -
文件系统 | 用于索引服务的 Microsoft OLE DB 提供程序 | 任何 | MSIDXS | 索引服务目录名称 | - | - | -
Microsoft Excel 电子表格 | 用于 Jet 的 Microsoft OLE DB 提供程序 | 任何 | Microsoft.Jet.OLEDB.4.0 | Excel 文件的完整路径名 | - | Excel 5.0 | -
IBM DB2 数据库 | 用于 DB2 的Microsoft OLE DB 提供程序 | 任何 | DB2OLEDB | - | - | 请参见用于 DB2 文档的 Microsoft OLE DB 提供程序 | DB2 数据库的目录名

(1 ) 这种设置链接服务器的方式强制链接服务器的名称与远程 SQL Server 的网络名称相同。使用 server 指定服务器。
(2 ) "任何"指产品名称可以任意。

data_source、location、provider_string 和 catalog 参数标识链接服务器指向的数据库。如果任一参数为 NULL 值，则不设置相应的 OLE DB 初始化属性。

说明 若要在 SQL Server 6.x 版上使用 SQL Server 2000 版的 Microsoft OLE DB 提供程序，请在 6.x 版 SQL Server 上运行 \Microsoft SQL Server\Install\Instcat.sql 脚本。此脚本对于在 SQL Server 6.x 服务器上运行分布式查询是基本的。

在群集环境中，当指定指向 OLE DB 数据源的文件名时，应使用通用命名规则 (UNC) 名称或共享驱动器指定位置。

权限

执行许可权限默认授予 sysadmin 和 setupadmin 固定服务器角色的成员。

示例
A. 使用用于 SQL Server 的 Microsoft OLE DB 提供程序
  1. 使用用于 SQL Server 的 OLE DB 创建链接服务器

    下面的示例创建一台名为 SEATTLESales 的链接服务器，该服务器使用用于 SQL Server 的 Microsoft OLE DB 提供程序。

    USE master
GO
EXEC sp_addlinkedserver
    'SEATTLESales',
    N'SQL Server'
GO
  2. 在 SQL Server 的实例上创建链接服务器

    此示例在 SQL Server 的实例上创建一台名为 S1_instance1 的链接服务器，该服务器使用 SQL Server 的 Microsoft OLE DB 提供程序。

    EXEC    sp_addlinkedserver    @server='S1_instance1', @srvproduct='',
                                @provider='SQLOLEDB', @datasrc='S1\instance1'
B. 使用用于 Jet 的 Microsoft OLE DB 提供程序

此示例创建一台名为 SEATTLE Mktg 的链接服务器。

说明 本示例假设已经安装 Microsoft Access 和示例 Northwind 数据库，且 Northwind 数据库驻留在 C:\Msoffice\Access\Samples。

USE master
GO
-- To use named parameters:
EXEC sp_addlinkedserver
   @server = 'SEATTLE Mktg',
   @provider = 'Microsoft.Jet.OLEDB.4.0',
   @srvproduct = 'OLE DB Provider for Jet',
   @datasrc = 'C:\MSOffice\Access\Samples\Northwind.mdb'
GO
-- OR to use no named parameters:
USE master
GO
EXEC sp_addlinkedserver
   'SEATTLE Mktg',
   'OLE DB Provider for Jet',
   'Microsoft.Jet.OLEDB.4.0',
   'C:\MSOffice\Access\Samples\Northwind.mdb'
GO
C. 使用用于 Oracle 的 Microsoft OLE DB 提供程序

此示例创建一台名为 LONDON Mktg 的链接服务器，该服务器使用用于 Oracle 的 Microsoft OLE DB 提供程序，并且假设此 Oracle 数据库的 SQL*Net 别名为 MyServer。

USE master
GO
-- To use named parameters:
EXEC sp_addlinkedserver
   @server = 'LONDON Mktg',
   @srvproduct = 'Oracle',
   @provider = 'MSDAORA',
   @datasrc = 'MyServer'
GO
-- OR to use no named parameters:
USE master
GO
EXEC sp_addlinkedserver
   'LONDON Mktg',
   'Oracle',
   'MSDAORA',
   'MyServer'
GO
D. 将 data_source 参数与用于 ODBC 的 Microsoft OLE DB 提供程序一起使用

此示例创建一台名为 SEATTLE Payroll 的链接服务器，该服务器使用用于 ODBC 的 Microsoft OLE DB 提供程序和 data_source 参数。

说明 在执行 sp_addlinkedserver 之前，必须在服务器上将指定的 ODBC 数据源名称定义为系统 DSN。

USE master
GO
-- To use named parameters:
EXEC sp_addlinkedserver
   @server = 'SEATTLE Payroll',
   @provider = 'MSDASQL',
   @datasrc = 'LocalServer'
GO
-- OR to use no named parameters:
USE master
GO
EXEC sp_addlinkedserver
   'SEATTLE Payroll',
   '',
   'MSDASQL',
   'LocalServer'
GO
E. 将 provider_string 参数与用于 ODBC 的 Microsoft OLE DB 提供程序一起使用

此示例创建一台名为 LONDON Payroll 的链接服务器，该服务器使用用于 ODBC 的 Microsoft OLE DB 提供程序和 provider_string 参数。

说明 有关 ODBC 连接字符串的更多信息，请参见 SQLDriverConnect 和如何分配句柄并与 SQL Server (ODBC) 连接。

USE master
GO
-- To use named parameters:
EXEC sp_addlinkedserver
   @server = 'LONDON Payroll',
   @provider = 'MSDASQL',
   @provstr = 'DRIVER={SQL Server};SERVER=MyServer;UID=sa;PWD=;'
GO
-- OR to use no named parameters:
USE master
GO
EXEC sp_addlinkedserver
   'LONDON Payroll',
   '',
   'MSDASQL',
   NULL,
   NULL,
   'DRIVER={SQL Server};SERVER=MyServer;UID=sa;PWD=;'
GO
F. 在 Excel 电子表格上使用用于 Jet 的 Microsoft OLE DB 提供程序

若要创建使用用于 Jet 的 Microsoft OLE DB 提供程序以访问 Excel 电子表格的链接服务器定义，请首先在 Excel 中创建一个命名的范围以指定要在 Excel 工作表中选择的行和列。然后，可将此范围的名称引用为分布式查询中的表名称。

EXEC sp_addlinkedserver 'ExcelSource',
   'Jet 4.0',
   'Microsoft.Jet.OLEDB.4.0',
   'c:\MyData\DistExcl.xls',
   NULL,
   'Excel 5.0'
GO

为了访问 Excel 电子表格中的数据，请将某个范围内的单元与某个名称相关联。通过将范围的名称用作表名称，可以访问指定的已命名范围。下列查询利用前面设置的链接服务器，可访问称为 SalesData 的命名范围。

SELECT *
FROM EXCEL...SalesData
GO
G. 使用用于检索服务的 Microsoft OLE DB 提供程序

此示例创建一台链接服务器，并且使用 OPENQUERY 从为检索服务启用的链接服务器和文件系统中检索信息。

EXEC sp_addlinkedserver FileSystem,
   'Index Server',
   'MSIDXS',
   'Web'
GO
USE pubs
GO
IF EXISTS(SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES
      WHERE TABLE_NAME = 'yEmployees')
   DROP TABLE yEmployees
GO
CREATE TABLE yEmployees
 (
  id       int         NOT NULL,
  lname    varchar(30) NOT NULL,
  fname    varchar(30) NOT NULL,
  salary   money,
  hiredate datetime
 )
GO
INSERT yEmployees VALUES
 (
  10,
  'Fuller',
  'Andrew',
  $60000,
  '9/12/98'
 )
GO
IF EXISTS(SELECT TABLE_NAME FROM INFORMATION_SCHEMA.VIEWS
      WHERE TABLE_NAME = 'DistribFiles')
   DROP VIEW DistribFiles
GO
CREATE VIEW DistribFiles
 AS
 SELECT *
 FROM OPENQUERY(FileSystem,
                 'SELECT Directory,
                    FileName,
                    DocAuthor,
                    Size,
                    Create,
                    Write
                  FROM SCOPE('' "c:\My Documents" '')
                  WHERE CONTAINS(''Distributed'') > 0
                    AND FileName LIKE ''%.doc%'' ')
 WHERE DATEPART(yy, Write) = 1998
GO
SELECT *
FROM DistribFiles
GO
SELECT Directory,
  FileName,
  DocAuthor,
  hiredate
FROM DistribFiles D, yEmployees E
WHERE D.DocAuthor = E.FName + ' ' + E.LName
GO
H. 使用用于 Jet 的 Microsoft OLE DB 提供程序访问文本文件

此示例创建一台直接访问文本文件的链接服务器，而没有将这些文件链接为 Access .mdb 文件中的表。提供程序是 Microsoft.Jet.OLEDB.4.0，提供程序字符串为"Text"。

数据源是包含文本文件的目录的完整路径名。schema.ini 文件（描述文本文件的结构）必须与此文本文件存在于相同的目录中。有关创建 schema.ini 文件的更多信息，请参见 Jet 数据库引擎文档。

--Create a linked server
EXEC sp_addlinkedserver txtsrv, 'Jet 4.0',
   'Microsoft.Jet.OLEDB.4.0',
   'c:\data\distqry',
   NULL,
   'Text'
GO

--Set up login mappings
EXEC sp_addlinkedsrvlogin txtsrv, FALSE, Admin, NULL
GO

--List the tables in the linked server
EXEC sp_tables_ex txtsrv
GO

--Query one of the tables: file1#txt
--using a 4-part name
SELECT *
FROM txtsrv...[file1#txt]
I. 使用用于 DB2 的 Microsoft OLE DB 提供程序

下面的示例创建一台名为 DB2 的链接服务器，该服务器使用用于 DB2 的 Microsoft OLE DB 提供程序。

EXEC sp_addlinkedserver
   @server='DB2',
   @srvproduct='Microsoft OLE DB Provider for DB2',
   @catalog='DB2',
   @provider='DB2OLEDB',
   @provstr='Initial Catalog=PUBS;Data Source=DB2;HostCCSID=1252;Network Address=XYZ;Network Port=50000;Package Collection=admin;Default Schema=admin;'

请参见

配置链接服务器

用 SQL Server 测试过的 OLE DB 提供程序

sp_addlinkedsrvlogin

sp_addserver

sp_dropserver

sp_serveroption

sp_setnetname

系统存储过程

系统表


sp_addlinkedsrvlogin

创建或更新本地 Microsoft® SQL Server™ 实例上的登录与链接服务器上远程登录之间的映射。

语法

sp_addlinkedsrvlogin [ @rmtsrvname = ] 'rmtsrvname'
[ , [ @useself = ] 'useself' ]
[ , [ @locallogin = ] 'locallogin' ]
[ , [ @rmtuser = ] 'rmtuser' ]
[ , [ @rmtpassword = ] 'rmtpassword' ]

参数

[@rmtsrvname =] 'rmtsrvname'

是应用登录映射的链接服务器名称。rmtsrvname 的数据类型为 sysname，没有默认设置。

[@useself =] 'useself'

决定用于连接到远程服务器的登录名称。useself 的数据类型为 varchar(8)，默认设置为 TRUE。true 值指定 SQL Server 验证的登录使用其自己的凭据以连接到 rmtsrvname，而忽略 rmtuser 和 rmtpassword 参数。false 值指定 rmtuser 和 rmtpassword 参数用来连接到特定 locallogin 的 rmtsrvname。如果 rmtuser 和 rmtpassword 也设置为 NULL，则连接链接服务器不需使用任何登录或密码。对于 Windows NT 身份验证登录而言，useself 为 true 则无效，除非 Microsoft Windows NT® 环境支持安全帐户委托，并且，提供程序支持 Windows 身份验证（此时不再需要创建值为 true 的映射，不过创建仍然有效）。

[ @locallogin =] 'locallogin'

本地服务器上的登录。locallogin 的数据类型为 sysname，默认设置为 NULL。NULL 值指定此条目将应用于所有连接到 rmtsrvname 的本地登录。如果值不为 NULL，则 locallogin 可以是一个 SQL Server 登录或 Windows NT 用户。必须授予 Windows NT 用户直接访问 SQL Server 或通过其作为已授予访问权限的组的成员来访问 SQL Server 的权限。

[@rmtuser =] 'rmtuser'

当 useself 为 false 时，用来连接 rmtsrvname 的用户名，rmtuser 的数据类型为 sysname，默认设置为 NULL。

[@rmtpassword =] 'rmtpassword'

与 rmtuser 相关的密码。rmtpassword 的数据类型为 sysname，默认设置为 NULL。

返回代码值

0（成功）或 1（失败）

注释

当用户登录到本地服务器并执行分布式查询，以访问链接服务器上的表时，本地服务器必须登录链接服务器上，代表该用户访问该表。使用 sp_addlinkedsrvlogin 来指定本地服务器登录链接服务器的登录凭据。

本地服务器上所有登录和链接服务器上的远程登录之间的默认映射通过执行 sp_addlinkedserver 自动创建。默认映射说明连接到链接服务器代表的登录时，SQL Server 使用本地登录的用户凭据（等同于将链接服务器的 @useself 设置为 true 时执行 sp_addlinkedsrvlogin）。使用 sp_addlinkedsrvlogin 只可以更改特定的本地服务器的默认映射或添加新映射。若要删除默认映射或任何其它映射，请使用 sp_droplinkedsrvlogin。

当所有下列条件存在时，SQL Server 可以自动地使用正在发出查询的用户的 Windows NT 安全凭据（Windows NT 用户名称和密码），以连接到链接服务器，而不是必须使用 sp_addlinkedsrvlogin 创建一个预设的登录映射。

  1. 使用 Windows 身份验证模式，用户连接到 SQL Server。

  2. 在客户端和发送服务器上安全帐户委托是可用的。

  3. 提供程序支持 Windows 身份验证模式（例如，运行于 Windows NT 上的 SQL Server）。

使用映射（此映射通过在本地 SQL Server 上执行 sp_addlinkedsrvlogin 定义）的链接服务器执行身份验证后，远程数据库中单独对象的权限由链接服务器决定，而不是由本地服务器决定。

不能从用户定义的事务中执行 sp_addlinkedsrvlogin。

权限

只有 sysadmin 和 securityadmin 固定服务器角色的成员才可以执行 sp_addlinkedsrvlogin。

示例
A. 使用各自的用户凭据将所有本地登录连接到链接服务器

此示例创建一个映射，以确保所有到本地服务器的登录都使用其各自的用户凭据连接到链接服务器 Accounts。

EXEC sp_addlinkedsrvlogin 'Accounts'

或

EXEC sp_addlinkedsrvlogin 'Accounts', 'true'
B. 使用指定的用户和密码将所有本地登录连接到链接服务器

此示例创建一个映射，以确保所有到本地服务器的登录都使用相同的登录 SQLUser 和密码 Password 连接到链接服务器 Accounts。

EXEC sp_addlinkedsrvlogin 'Accounts', 'false', NULL, 'SQLUser', 'Password'
C. 不使用任何用户凭据将所有本地登录连接到链接服务器

此示例创建一个映射，以确保所有到本地服务器的登录都连接到链接服务器 mydb，而不使用登录或密码（mydb 不需要登录或密码）。

EXEC sp_addlinkedsrvlogin 'mydb', 'false', NULL, NULL, NULL

-或-

EXEC sp_addlinkedsrvlogin 'mydb', 'false'
D. 使用不同的用户凭据将特定的登录连接到链接服务器

此示例创建一个映射，以确保只有 Windows NT 用户 Domain\Mary 使用登录 MaryP 和密码 NewPassword 连接到链接服务器 Accounts。

EXEC sp_addlinkedsrvlogin 'Accounts', 'false', 'Domain\Mary', 'MaryP', 'NewPassword'
E. 将特定的登录连接到 Excel 电子表格（链接服务器）

此示例首先创建一个名为 ExcelSource 的链接服务器，定义为 Microsoft Excel 电子表格 DistExcl.xls，然后创建一个映射以允许 SQL Server 登录 sa 使用 Excel 登录 Admin 连接到 ExcelSource，并且没有密码。

EXEC sp_addlinkedserver 'ExcelSource', 'Jet 4.0',
   'Microsoft.Jet.OLEDB.4.0',
   'c:\MyData\DistExcl.xls',
   NULL,
   'Excel 5.0'
GO
EXEC sp_addlinkedsrvlogin 'ExcelSource', 'false', 'sa', 'Admin', NULL

请参见

配置链接服务器

建立链接服务器的安全性

sp_addlinkedserver

sp_droplinkedsrvlogin

系统存储过程


sp_addlogin

创建新的 Microsoft® SQL Server™ 登录，使用户得以连接使用 SQL Server 身份验证的 SQL Server 实例。

语法

sp_addlogin [ @loginame = ] 'login'
[ , [ @passwd = ] 'password' ]
 [ , [ @defdb = ] 'database' ]
[ , [ @deflanguage = ] 'language' ]
[ , [ @sid = ] sid ]
[ , [ @encryptopt = ] 'encryption_option' ]

参数

[@loginame =] 'login'

登录的名称。login 的数据类型为 sysname，没有默认设置。

[@passwd =] 'password'

登录密码。password 的数据类型为 sysname，默认设置为 NULL。sp_addlogin 执行后，password 被加密并存储在系统表中。

[@defdb =] 'database'

登录的默认数据库（登录后登录所连接到的数据库）。database 的数据类型为 sysname，默认设置为 master。

[@deflanguage =] 'language'

用户登录到 SQL Server 时系统指派的默认语言。language 的数据类型为 sysname，默认设置为 NULL。如果没有指定 language，那么 language 被设置为服务器当前的默认语言（由 sp_configure 配置变量 default language 定义）。更改服务器的默认语言不会更改现有登录的默认语言。language 保持与添加登录时所使用的默认语言相同。

[@sid =] sid

安全标识号 (SID)。sid 的数据类型为 varbinary(16)，默认设置为 NULL。如果 sid 为 NULL，则系统为新登录生成 SID。尽管使用 varbinary 数据类型，非 NULL 的值也必须正好为 16 个字节长度，且不能事先存在。SID 很有用，例如，如果要编写 SQL Server 登录脚本，或要将 SQL Server 登录从一台服务器移动到另一台，并且希望登录在服务器间具有相同的 SID 时。

[@encryptopt =] 'encryption_option'

指定当密码存储在系统表中时，密码是否要加密。encryption_option 的数据类型为 varchar(20)，可以是下列值之一。

值 | 描述
NULL | 加密密码。这是默认设置。
skip_encryption | 密码已加密。SQL Server 应该存储值而且不用重新对其加密。
skip_encryption_old | 已提供的密码由 SQL Server 较早版本加密。SQL Server 应该存储值而且不用重新对其加密。此选项只供升级使用。

返回代码值

0（成功）或 1（失败）

注释

SQL Server 登录和密码可包含 1 到 128 个字符，包括任何字母、符号和数字。但是，登录不能：

  1. 含有反斜线 (\)。

  2. 是保留的登录名称，例如 sa 或 public，或者已经存在。

  3. 为 NULL，或为空字符串 ('')。

如果提供默认数据库的名称，则不用执行 USE 语句就可以连接到指定的数据库。但是，不能使用默认的数据库，直到数据库所有者（使用 sp_adduser 或 sp_addrolemember）或 sp_addrole 授予对该数据库的访问权限为止。

SID 号是唯一的 Microsoft Windows NT® 用户标识号。必须保证每个用户的 SID 号在 Windows NT 域中的唯一性。SQL Server 自动使用 Windows NT SID 标识 Windows NT 用户和组，并为 SQL Server 登录生成一个 SID。

将登录添加到 SQL Server 时，如果密码已经是加密的形式，则使用 skip_encryption 取消密码加密是有用的。如果此密码由以前的 SQL Server 版本加密，则使用 skip_encryption_old。

不能从用户定义的事务中执行 sp_addlogin。

下表显示了几个与 sp_addlogin 一起使用的存储过程。

存储过程 | 描述
sp_grantlogin | 添加 Windows NT 用户或组。
sp_password | 更改用户密码。
sp_defaultdb | 更改用户的默认数据库。
sp_defaultlanguage | 更改用户的默认语言。

权限

只有 sysadmin 和 securityadmin 固定服务器角色的成员才可以执行 sp_addlogin。

示例
A. 创建没有密码和主默认数据库的登录 ID

下面的示例为用户 Victoria 创建一个 SQL Server 登录名，没有指定密码或默认数据库。

EXEC sp_addlogin 'Victoria'
B. 创建登录 ID 和默认数据库

此示例为用户 Albert 创建一个 SQL Server 登录，并指定密码 food 以及名为 corporate 的默认数据库。

EXEC sp_addlogin 'Albert', 'food', 'corporate'
C.创建使用其它默认语言的登录 ID

下面的示例为用户 Claire Picard 创建一个 SQL Server 登录名，密码为"caniche"，默认数据库为 public_db，默认语言为 French。

EXEC sp_addlogin 'Claire Picard', 'caniche', 'public_db', 'french'
D. 创建带有特定 SID 的登录 ID

下面的示例为用户 Michael 创建一个 SQL Server 登录名，密码为"chocolate"，默认数据库为 pubs，默认语言为 us_english，SID 为 0x0123456789ABCDEF0123456789ABCDEF。

EXEC sp_addlogin 'Michael', 'chocolate', 'pubs', 'us_english', 0x0123456789ABCDEF0123456789ABCDEF
E. 创建登录 ID 并且不加密密码

下例在 Server1 上为用户 Margaret 创建了一个密码为"Rose"的 SQL Server 登录，再析取此加密密码，然后使用前面加密的密码将用户登录 Margaret 添加到 Server2，但不对此密码进一步加密。之后，用户 Margaret 即可使用密码"Rose"登录到 Server2。

-- Server1
EXEC sp_addlogin Margaret, Rose

--Results
New login created.

-- Extract encrypted password for Margaret
SELECT CONVERT(VARBINARY(32), password)
   FROM syslogins
   WHERE name = 'Margaret'

--Results
------------------------------------------------------------------
0x2131214A212B57304F5A552A3D513453

(1 row(s) affected)

-- Server2
EXEC sp_addlogin 'Margaret', 0x2131214A212B57304F5A552A3D513453,
   @encryptopt = 'skip_encryption'

请参见

sp_addrole

sp_addrolemember

sp_adduser

sp_defaultdb

sp_defaultlanguage

sp_droplogin

sp_grantlogin

sp_helpuser

sp_password

sp_revokelogin

xp_logininfo


sp_addmessage

将新的错误信息添加到 sysmessages 表。

语法

sp_addmessage [ @msgnum =] msg_id ,
[ @severity = ] severity ,
[ @msgtext = ] 'msg'
[ , [ @lang = ] 'language' ]
[ , [ @with_log = ] 'with_log' ]
[ , [ @replace = ] 'replace' ]

参数

[@msgnum =] msg_id

消息的 ID。msg_id 的数据类型为 int，默认设置为 NULL。用户定义错误信息的可接受值从 50001 开始。msg_id 和 language 的组合必须是唯一的；如果特定语言的 ID 已经存在，则返回一个错误。

[@severity =] severity

错误的严重级别。severity 的数据类型为 smallint，默认设置为 NULL。有效级别为 1 到 25。只有系统管理员可以使用从 19 到 25 之间的严重级别添加消息。

[@msgtext =] 'msg'

错误信息的文本。msg 的数据类型为 nvarchar(255)，默认设置为 NULL。

[@lang =] 'language'

该消息的语言。language 的数据类型为 sysname，默认设置为 NULL。因为同一服务器上可以安装多种语言，所以 language 将指定写每条消息所用的语言。省略 language 时，语言是会话的默认语言。

[@with_log =] 'with_log'

当发生消息时是否将消息写入 Microsoft® Windows NT® 应用程序日志中。with_log 的数据类型为 varchar(5)，默认设置为 FALSE。如果为 true，则错误总是写入 Windows NT 应用程序日志。如果为 false，则错误并不是每次都写入应用程序日志，但可以写入 Windows NT 应用程序日志，这取决于错误是如何产生的。只有 sysadmin 服务器角色的成员才能使用该选项。

说明 如果消息写入了 Windows NT 应用程序日志，它也将被写入 Microsoft SQL Server™ 错误日志文件。

[@replace =] 'replace'

如果指定为字符串 REPLACE，则新消息文本和严重级别将重写现有的错误信息。replace 的数据类型为 varchar(7)，默认设置为 NULL。如果 msg_id 已经存在，则必须指定该选项。如果要替换美国英语的消息，则所有具有相同 msg_id 的其它语言的所有消息严重级别都将被替换。

返回代码值

0（成功）或 1（失败）

结果集

无

注释

对于本地化，在能够以其它语言添加消息之前，消息的美国英语版本必须已经存在。消息的严重度必须匹配。

当本地化包含参数的消息时，使用与原始消息中的参数相应的参数个数。在每个参数个数后都插入感叹号 (!)。

原始消息 | 本地化的消息
'Original message param 1:%s, param 2:%d' | "本地化的消息参数 1: %1!, 参数 2: %2!'

由于语言语法不同，所以本地化消息中的参数个数可能不会以原始消息中相同的序列出现。

权限

只有 sysadmin 和 serveradmin 固定服务器角色成员才能执行该存储过程。

示例
A. 定义自定义的消息

此示例将自定义的消息添加到 sysmessages。

USE master
EXEC sp_addmessage 50001, 16,
   N'Percentage expects a value between 20 and 100.
   Please reexecute with a more appropriate value.'
B. 用两种语言添加消息

此示例首先用美国英语添加一条消息，然后用法语添加相同的消息。

USE master
EXEC sp_addmessage @msgnum = 60000, @severity = 16,
   @msgtext = N'The item named %s already exists in %s.',
   @lang = 'us_english'

EXEC sp_addmessage @msgnum = 60000, @severity = 16,
   @msgtext = N'L''élément nommé %1! existe déjà dans %2!',
   @lang = 'French'

请参见

错误信息严重级别

RAISERROR

sp_altermessage

sp_dropmessage

系统存储过程


sp_addremotelogin

在本地服务器上添加新的远程登录 ID，允许远程服务器连接并执行远程过程调用。

语法

sp_addremotelogin [ @remoteserver = ] 'remoteserver'
[ , [ @loginame = ] 'login' ]
[ , [ @remotename = ] 'remote_name' ]

参数

[@remoteserver =] 'remoteserver'

远程登录应用到的远程服务器的名称。remoteserver 的数据类型为 sysname，没有默认值。如果只给定了 remoteserver，则 remoteserver 上的所有用户都将映射为本地服务器上现有的同名登录。本地服务器必须能识别该服务器（使用 sp_addserver 添加）。当 remoteserver 上的用户连接到运行 Microsoft® SQL Server™ 的本地服务器以执行远程存储过程时，他们以与各自在 remoteser 上的登录相匹配的本地登录连接。remoteserver 是启动远程过程调用的服务器。

[@loginame =] 'login'

本地 SQL Server 上的用户的登录 ID。login 的数据类型为 sysname，默认值为 NULL。login 必须已经存在于本地 SQL Server 上。如果没有指定 login，则 remoteserver 上的所有用户都映射为特定的本地登录。当 remoteserver 上的用户连接到本地 SQL Server 以执行远程存储过程时，他们将作为 login 连接。

[@remotename =] 'remote_name'

远程服务器上的用户的登录 ID。remote_name 的数据类型为 sysname，默认值为 NULL。remote_name 必须存在于 remoteserver。如果指定了 remote_name，则该特定用户 remote_name 被映射为本地服务器上的 login。当 remoteserver 上的 remote_name 连接到本地的 SQL Server 以执行远程存储过程时，他们将作为 login 连接。remote_name 的登录 ID 可以与远程服务器上的登录 ID login 不同。

返回代码值

0（成功）或 1（失败）

注释

若要执行分布式查询，请使用 sp_addlinkedsrvlogin。

每个远程登录项都有一个状态。默认的状态是 not trusted。当收到状态为 not trusted 的远程登录时，SQL Server 将检查密码。若要不检查密码，请使用 sp_remoteoption 将状态改为 trusted。

不能在用户定义的事务中使用 sp_addremotelogin。

权限

只有 sysadmin 和 securityadmin 固定服务器角色的成员才能执行 sp_addremotelogin。

示例
A. 一对一映射

下面的示例在远程服务器 Accounts 和本地服务器有相同的用户登录时将远程名称映射为本地名称。

EXEC sp_addremotelogin 'ACCOUNTS'
B. 多对一映射

下面的示例创建一个条目，该条目将来自远程服务器 Accounts 的所有用户都映射为本地登录 ID Albert。

EXEC sp_addremotelogin 'ACCOUNTS', 'Albert'
C. 使用显式一对一映射

下面的示例将来自远程服务器 Accounts 上的远程用户 Chris 的远程登录映射为本地用户 salesmgr。

EXEC sp_addremotelogin 'ACCOUNTS', 'salesmgr', 'Chris'

请参见

远程服务器的安全性

sp_addlinkedsrvlogin

sp_addlogin

sp_addserver

sp_dropremotelogin

sp_grantlogin

sp_helpremotelogin

sp_helpserver

sp_remoteoption

sp_revokelogin

系统存储过程


sp_addrole

在当前数据库创建新的 Microsoft® SQL Server™ 角色。

语法

sp_addrole [ @rolename = ] 'role'
[ , [ @ownername = ] 'owner' ]

参数

[@rolename =] 'role'

新角色的名称。role 的数据类型为 sysname，没有默认值。role 必须是有效标识符，并且不能已经存在于当前数据库中。

[@ownername =] 'owner'

新角色的所有者，owner 的数据类型为 sysname，默认值为 dbo。owner 必须是当前数据库中的某个用户或角色。当指定 Microsoft Windows NT® 用户时，请指定该 Windows NT 用户在数据库中可被识别的名称（用 sp_grantdbaccess 添加）。

返回代码值

0（成功）或 1（失败）

注释

SQL Server 角色可以包含 1 到 128 个字符，包括字母、符号及数字。但是，角色不能：

  • 含有反斜线符号 (\)。

  • 为 NULL，或为空字符串 ('')。

在添加角色之后，可以使用 sp_addrolemember 添加安全帐户，使其成为该角色的成员。当使用 GRANT、DENY 或 REVOKE 语句将权限应用于角色时，角色的成员将继承这些权限，就好像将权限直接应用于其帐户一样。

说明 无法创建新的固定服务器角色。只能在数据库级别上创建角色。

不能在用户定义的事务内使用 sp_addrole。

权限

只有 sysadmin 固定服务器角色及 db_securityadmin 和 db_owner 固定数据库角色的成员才能执行 sp_addrole。

示例

下面的示例将名为 Managers 的新角色添加到当前数据库中。

EXEC sp_addrole 'Managers'

请参见

创建用户定义的 SQL Server 数据库角色

sp_addrolemember

sp_droprole

sp_helprole

系统存储过程


sp_addrolemember

将安全帐户作为当前数据库中现有 Microsoft® SQL Server™ 数据库角色的成员进行添加。

语法

sp_addrolemember [ @rolename = ] 'role' ,
[ @membername = ] 'security_account'

参数

[@rolename =] 'role'

当前数据库中 SQL Server 角色的名称。role 的数据类型为 sysname，没有默认值。

[@membername =] 'security_account'

添加到角色的安全帐户。security_account 的数据类型为 sysname，没有默认值。security_account 可以是所有有效的 SQL Server 用户、SQL Server 角色或是所有已授权访问当前数据库的 Microsoft Windows NT® 用户或组。当添加 Windows NT 用户或组时，请指定在数据库中用来识别该 Windows NT 用户或组的名称（使用 sp_grantdbaccess 添加）。

返回代码值

0（成功）或 1（失败）

注释

当使用 sp_addrolemember 将安全帐户添加到角色时，新成员将继承所有应用到角色的权限。

在添加 SQL Server 角色，使其成为另一个 SQL Server 角色的成员时，不能创建循环角色。例如，如果 YourRole 已经是 MyRole 的成员，就不能将 MyRole 添加成为 YourRole 的成员。此外，也不能将固定数据库或固定服务器角色，或者 dbo 添加到其他角色。例如，不能将 db_owner 固定数据库角色添加成为用户定义的角色 YourRole 的成员。

只能使用 sp_addrolemember 将成员添加到 SQL Server 角色。使用 sp_addsrvrolemember 将成员添加到固定服务器角色。在 SQL Server 中，将成员添加到 Windows NT® 组是不可能的。

在用户定义的事务中不能使用 sp_addrolemember。

权限

只有 sysadmin 固定服务器角色和 db_owner 固定数据库角色中的成员可以执行 sp_addrolemember，以将成员添加到固定数据库角色。角色所有者可以执行 sp_addrolemember，将成员添加到自己所拥有的任何 SQL Server 角色。db_securityadmin 固定数据库角色的成员可以将用户添加到任何用户定义的角色。

示例
A. 添加 Windows NT 用户

下面的示例将 Windows NT 用户 Corporate\JeffL 添加到 Sales 数据库，使其成为用户 Jeff。然后，再将 Jeff 添加到 Sales 数据库的 Sales_Managers 角色中。

说明 由于 Corporate\JeffL 在 Sales 数据库中被当作是用户 Jeff，所以必须使用 sp_addrolemember 来指定用户名 Jeff。

USE Sales
GO
EXEC sp_grantdbaccess 'Corporate\JeffL', 'Jeff'
GO
EXEC sp_addrolemember 'Sales_Managers', 'Jeff'
B. 添加 SQL Server 用户

下面的示例将 SQL Server 用户 Michael 添加到当前数据库中的 Engineering 角色。

EXEC sp_addrolemember 'Engineering', 'Michael'

请参见

将成员添加到 SQL Server 数据库角色

sp_addsrvrolemember

sp_droprolemember

sp_grantdbaccess

系统存储过程


sp_addserver

定义远程服务器或本地 Microsoft® SQL Server™ 的名称。提供 sp_addserver 是为向后兼容。请使用 sp_addlinkedserver。

语法

sp_addserver [ @server = ] 'server'
[ , [ @local = ] 'local' ]
    [ , [ @duplicate_ok = ] 'duplicate_OK' ]

参数

[@server =] 'server'

服务器的名称。虽然不允许使用空格，但是服务器的名称必须是唯一的，而且遵循 Microsoft Windows NT® 计算机名称的规则。server 是的数据类型为 sysname，无默认设置。

如果有多个 SQL Server 实例，server 可以为 servername\instancename。

[@local =] 'LOCAL'

指定要添加的服务器是本地服务器还是远程服务器。@local 的数据类型为 varchar(10)，默认值为 NULL。指定 @local 为 LOCAL 将定义 @server 为本地服务器的名称并使 @@SERVERNAME 函数返回 server。（在安装过程中，安装程序将该变量设置为计算机名。建议不要更改该名称。默认情况下，用户可通过计算机名连接到 SQL Server 而无需额外的配置。）只有将服务器关闭然后重新启动后，本地的定义才会生效。每个服务器中只能定义一个本地服务器。

[@duplicate_ok =] 'duplicate_OK'

指定是否允许重复的服务器名。@duplicate_OK 的数据类型为 varchar(13)，默认值为 NULL。@duplicate_OK 只能有 duplicate_OK 或 NULL 这两个值。如果指定了 duplicate_OK，则即使要添加的服务名已经存在，也不会发生错误。如果没有使用命名参数，则必须指定 @local。

返回代码值

0（成功）或 1（失败）

注释

若要执行运行较早版本的 SQL Server 的远程服务器上的存储过程（远程过程调用），请使用 sp_addserver 添加远程服务器。若要执行运行 SQL Server 7.0 的远程服务器上的存储过程（或任何分布式查询），请使用 sp_addlinkedserver 添加服务器。

若要设置或清除服务器选项，请使用 sp_serveroption。

在用户定义的事务内不能使用 sp_addserver。

权限

只有 setupadmin 和 sysadmin 固定服务器角色的成员才能执行 sp_addserver。

示例

下面的示例在本地服务器上为远程服务器 ACCOUNTS 创建一个条目。

sp_addserver 'ACCOUNTS'

请参见

sp_addlinkedserver

sp_addremotelogin

sp_dropremotelogin

sp_dropserver

sp_helpremotelogin

sp_helpserver

sp_serveroption

系统存储过程


sp_addsrvrolemember

添加登录，使其成为固定服务器角色的成员。

语法

sp_addsrvrolemember [ @loginame = ] 'login'
[@rolename =] 'role'

参数

[@loginame =] 'login'

是添加到固定服务器角色的登录名称。login 的数据类型为 sysname，没有默认值。login 可以是 Microsoft® SQL Server™ 登录或 Microsoft Windows NT® 用户帐户。如果还没有对该 Windows NT 登录授予 SQL Server 访问权限，那么将自动对其授予访问权限。

[@rolename =] 'role'

要将登录添加到的固定服务器角色的名称。role 的数据类型为 sysname，默认值为 NULL，它必须是下列值之一：

  • sysadmin

  • securityadmin

  • serveradmin

  • setupadmin

  • processadmin

  • diskadmin

  • dbcreator

  • bulkadmin
返回代码值

0（成功）或 1（失败）

注释

在将登录添加到固定服务器角色时，该登录就会得到与此固定服务器角色相关的权限。

不能更改 sa 登录的角色成员资格。

请使用 sp_addrolemember 将成员添加到固定数据库角色或用户定义的角色。

不能在用户定义的事务内执行 sp_addsrvrolemember 存储过程。

权限

sysadmin 固定服务器的成员可以将成员添加到任何固定服务器角色。固定服务器角色的成员可以执行 sp_addsrvrolemember 将成员只添加到同一个固定服务器角色。

示例

下面的示例将 Windows NT 用户 Corporate\HelenS 添加到 sysadmin 固定服务器角色中。

EXEC sp_addsrvrolemember 'Corporate\HelenS', 'sysadmin'

请参见

sp_addrolemember

sp_dropsrvrolemember

系统存储过程


sp_addtask

创建已调度任务。

提供 sp_addtask 只是为了向后兼容。有关 Microsoft® SQL Server™ 7.0 版替换过程的更多信息，请参见 SQL Server 向后兼容性详细信息。

重要 有关 SQL Server 早期版本中使用的语法的更多信息，请参见用于 6.x 版的《Microsoft SQL Server Transact-SQL 参考》。

注释

使用 sp_addtask 创建的任务只能用 sp_droptask 删除。若要进行任务管理，请使用 SQL Server 企业管理器。

权限

执行权限默认授予 public 角色。

请参见

sp_droptask

sp_helphistory

sp_helptask

sp_purgehistory

sp_updatetask

系统存储过程


sp_addtype

创建用户定义的数据类型。

语法

sp_addtype [ @typename = ] type,
[ @phystype = ] system_data_type
[ , [ @nulltype = ] 'null_type' ]
[ , [ @owner = ] 'owner_name' ]

参数

[@typename =] type

用户定义的数据类型的名称。数据类型名称必须遵照标识符的规则，而且在每个数据库中必须是唯一的。type 的数据类型为 sysname，没有默认值。

[@phystype =] system_data_type

是用户定义的数据类型所基于的物理数据类型或 Microsoft® SQL Server™ 提供的数据类型（decimal、int 等等）。system_data_type 的数据类型是 sysname，没有默认值，可能是这些值之一：

'binary( n )' | image | smalldatetime
Bit | int | smallint
'char( n )' | 'nchar( n )' | text
Datetime | ntext | tinyint
Decimal | numeric | uniqueidentifier
'decimal[ ( p [, s ] ) ]' | 'numeric[ ( p [ , s ] ) ]' | 'varbinary( n )'
Float | 'nvarchar( n )' | 'varchar( n )'
'float( n )' | real |

如果参数中嵌入有空格或标点符号，则必须用引号将该参数引起来。有关可用的数据类型的更多信息，请参见数据类型。

n
非负整数，指明所选数据类型的长度。
p
非负整数，指明可保留的最大十进制位数，包括小数点左边和右边的数字。有关更多信息，请参见 decimal 和 numeric。
s
非负整数，指明小数点右边的小数数字可保留的最大十进制位数，它必须小于或等于精度值。有关更多信息，请参见本卷中的"decimal 和 numeric"。

[@nulltype =] 'null_type'

指明用户定义的数据类型处理空值的方式。null_type 的数据类型为 varchar(8)，默认值为 NULL，并且必须用单引号引起来（'NULL'、'NOT NULL' 或 'NONULL'）。如果没有用 sp_addtype 显式定义 null_type，则将其设置为当前默认的为空性。使用 GETANSINULL 系统函数可确定当前默认的为空性，可以使用 SET 语句或 sp_dboption 对该为空性进行调整。应显式定义为空性。

说明 null_type 参数只为该数据类型定义默认的为空性。如果在创建表的过程中使用用户定义的数据类型时显式地定义了为空性，那么该为空性优先于已定义好的为空性。有关更多信息，请参见 ALTER TABLE 和 CREATE TABLE。

[@owner =] 'owner_name'

指定新数据类型的创建者或所有者。owner_name 的数据类型为 sysname。当没有指定时，owner_name 为当前用户。

返回代码值

0（成功）或 1（失败）

结果集

无

注释

用户定义的数据类型名称在数据库中必须是唯一的，但是名称不同的用户定义的数据类型可以有相同的定义。

除非将 master 作为当前数据库来执行 sp_addtype，否则，执行 sp_addtype 会创建用户定义的数据类型，并且将其添加到某个特定数据库的 systypes 系统表中。如果想在所有新的用户定义的数据库中都可以使用这一用户定义的数据类型，请将其添加到 model。在创建了用户数据类型之后，可以在 CREATE TABLE 或 ALTER TABLE 中使用它，也可以将默认值和规则绑定到用户定义的数据类型。

不能使用 SQL Server timestamp 数据类型来定义用户定义的数据类型。

权限

执行权限默认授予 public 角色。

示例
A. 创建不允许空值的用户定义数据类型

下面的示例创建一个名为 ssn（社会保险号）的用户定义数据类型，它基于 SQL Server 提供的 varchar 数据类型。ssn 数据类型用于那些保存 11 位数字的社会保险号 (999-99-9999) 的列。该列不能为 NULL。

请注意，varchar(11) 由单引号引了起来，这是因为它包含了标点符号（圆括号）。

USE master
EXEC sp_addtype ssn, 'VARCHAR(11)', 'NOT NULL'
B. 创建允许空值的用户定义数据类型

下面的示例创建了一个名为 birthday 的用户定义数据类型（基于 datetime），该数据类型允许空值。

USE master
EXEC sp_addtype birthday, datetime, 'NULL'
C. 创建另外的用户定义的数据类型

下面的示例为国内及国际电话和传真号码另外创建两个用户定义的数据类型 telephone 和 fax。

USE master
EXEC sp_addtype telephone, 'varchar(24)', 'NOT NULL'
EXEC sp_addtype fax, 'varchar(24)', 'NULL'

请参见

CREATE DEFAULT

CREATE RULE

sp_bindefault

sp_bindrule

sp_droptype

sp_rename

sp_unbindefault

sp_unbindrule

系统存储过程


sp_addumpdevice

将备份设备添加到 Microsoft® SQL Server™。

语法

sp_addumpdevice [ @devtype = ] 'device_type' ,
[ @logicalname = ] 'logical_name' ,
[ @physicalname = ] 'physical_name'
[ , { [ @cntrltype = ] controller_type
| [ @devstatus = ] 'device_status'
}
    ]

参数

[@devtype =] 'device_type',

备份设备的类型，device_type 的数据类型为 varchar(20)，没有默认设置，可以是下列值之一。

值 | 描述
disk | 硬盘文件作为备份设备。
pipe | 命名管道。
tape | 由 Microsoft Windows NT® 支持的任何磁带设备。如果 device 是 tape，则其默认值为 noskip。

[@logicalname =] 'logical_name'

备份设备的逻辑名称，该逻辑名称用于 BACKUP 和 RESTORE 语句中，logical_name 的数据类型为 sysname，没有默认值，并且不能为 NULL。

[@physicalname =] 'physical_name'

备份设备的物理名称。物理名称必须遵照操作系统文件名称的规则或者网络设备的通用命名规则，并且必须包括完整的路径。physical_name 的数据类型为 nvarchar(260)，没有默认值，并且不能为 NULL。

当创建远程网络位置上的备份设备时，请确保在其下启动 SQL Server 的名称对远程的计算机有适当的写入能力。

如果要添加磁带设备，那么该参数必须是 Windows NT® 指派给本地磁带设备的物理名称，例如 \\.\TAPE0（对于计算机中的第一个磁带设备）。磁带设备必须连接到服务器计算机上，不能远程使用。如果名称包含非字母数字的字符，请用引号将其引起来。

[@cntrltype =] controller_type

当创建备份设备时，该参数并不是必需的。为脚本提供该参数比较合适，然而 SQL Server 会将其忽略。controller_type 的数据类型为 smallint，默认值为 NULL，可以是下列值之一。

值 | 描述
2 | 当 device_type 为 disk 时使用。
5 | 当 device_type 为 tape 时使用。
6 | 当 device_type 为 pipe 时使用。

[@devstatus =] 'device_status'

指明是读取 (noskip) ANSI 磁带标签，还是忽略 (skip) 它。device_status 的数据类型为 varchar(40)，默认值为 noskip。

说明 可以指定 controller_type 或 device_status，但二者不要同时指定。

返回代码值

0（成功）或 1（失败）

结果集

无

注释

sp_addumpdevice 将备份设备添加到 master.dbo.sysdevices 表。可以在 BACKUP 和 RESTORE 语句中对其进行逻辑引用。

所有关系和权限问题可能干扰磁盘或文件备份设备的使用。请确保对在其下启动 SQL Server 的帐户给予适当的文件权限。

SQL Server 支持将磁带备份到 Windows NT 支持的磁带设备上。有关 Windows NT 支持的磁带设备的更多信息，请参见 Windows NT 的硬件兼容性列表。若要查看计算机上可用的磁带设备，请使用 SQL Server 企业管理器。

对于特定的磁带驱动器，只应使用推荐的磁带（按驱动器厂商的建议）。若要使用 DAT 驱动器，请使用计算机级的 DAT 磁带 (Digital Data Storage-DDS)。

不能在事务内执行 sp_addumpdevice。

权限

只有 sysadmin 和 diskadmin 固定服务器角色的成员才能执行该过程。

示例
A. 添加磁盘转储设备

下面的示例添加一个名为 MYDISKDUMP 的磁盘备份设备，其物理名称为 C:\Dump\Dump1.bak。

USE master
EXEC sp_addumpdevice 'disk', 'mydiskdump', 'c:\dump\dump1.bak'
B. 添加网络磁盘备份设备

下面的示例显示一个远程磁盘备份设备。在其下启动 SQL Server 的名称必须对该远程文件拥有权限。

USE master
EXEC sp_addumpdevice 'disk', 'networkdevice',
   '\\servername\sharename\path\filename.ext'
C. 添加磁带备份设备

下面的示例添加 TAPEDUMP1 设备，其物理名称为 \\.\Tape0。

USE master
EXEC sp_addumpdevice 'tape', 'tapedump1',
   '\\.\tape0'

请参见

BACKUP

RESTORE

sp_dropdevice

sp_helpdevice

系统存储过程


sp_adduser

为当前数据库中的新用户添加安全帐户。包括此过程是为了向后兼容。请使用 sp_grantdbaccess。

语法

sp_adduser [ @loginame = ] 'login'
[ , [ @name_in_db = ] 'user' ]
[ , [ @grpname = ] 'group' ]

参数

[@loginame =] 'login'

用户的登录名称。login 的数据类型是 sysname，没有默认值。login 必须是现有 Microsoft® SQL Server™ 登录或 Microsoft Windows NT® 用户。

[@name_in_db =] 'user'

新用户的名称。user 的数据类型为 sysname，其默认值为 NULL。如果没有指定 user，则用户的名称默认为 login 名称。指定 user 即为新用户在数据库中给予一个不同于 SQL Server 上的登录 ID 的名称。

[@grpname =] 'group'

组或角色，新用户自动地成为其成员。group 的数据类型为 sysname，默认值为 NULL。group 必须是当前数据库中有效的组或角色。Microsoft SQL Server 7.0 使用角色而不是组。

返回代码值

0（成功）或 1（失败）

注释

SQL Server 用户名可以包含 1 到 128 个字符，包括字母、符号和数字。但是，用户名不能：

  • 含有反斜线符号 (\)。

  • 为 NULL，或为空字符串 ('')。

在添加完用户之后，可以使用 GRANT、DENY 和 REVOKE 语句来定义权限，这些权限控制着用户进行的活动。

使用 sp_helplogin 可显示有效登录名的列表。

使用 sp_helprole 可显示有效角色名的列表。当指定一个角色时，用户会自动地获得为该角色定义的那些权限。如果没有指定角色，则用户获得的权限将是授予默认 public 角色的权限。若要将用户添加到角色，必须提供 username 的值（username 可与 login_id 相同）。

为了访问数据库，必须使用 sp_adduser 或 sp_grantdbaccess 对登录授予访问权，或者数据库中必须存在 guest 安全帐户。

不能在用户定义的事务内执行 sp_adduser。

权限

只有 sysadmin 固定服务器角色的 dbo 和成员才能执行 sp_adduser。

示例
A. 添加用户

下面的示例使用现有的登录 Victoria，将用户 Victoria 添加到当前数据库中现有的 fort_mudge 角色中。

EXEC sp_adduser 'Victoria', 'Victoria', 'fort_mudge'
B. 添加用户名（使用相同的登录 ID）

下面的示例为登录 Margaret 将默认用户名 Margaret 添加到当前数据库，该用户名属于默认的 public 角色。

EXEC sp_adduser 'Margaret'
C. 添加用户（使用不同的用户名）

下面的示例将 Haroldq 登录添加到当前的数据库中并使用 Harold 用户名，该用户名属于 fort_mudge 角色。

EXEC sp_adduser 'Haroldq', 'Harold', 'fort_mudge'

请参见

sp_addrole

sp_dropuser

sp_grantdbaccess

sp_grantlogin

sp_helpuser

系统存储过程


sp_altermessage

更改 sysmessages 错误的状态。

语法

sp_altermessage [ @message_id = ] message_number
    , [ @parameter = ] 'write_to_log'
, [ @parameter_value = ] 'value'

参数

[@message_id =] message_number

要更改的 sysmessages 错误或消息编号，message_number 的数据类型为 int，没有默认值。

[@parameter =] 'write_to_log'

表示将此消息写入 Microsoft® Windows NT® 的应用程序日志，write_to_log 的数据类型是 sysname，没有默认值。如果 write_to_log 的值为 WITH_LOG，则当消息出现时，将其写入 Microsoft Windows NT 日志。

说明 如果消息写入了 Windows NT 应用程序日志，它也将被写入 Microsoft SQL Server™ 错误日志文件。

[ @parameter_value =] 'value'

错误是否写入 Windows NT 应用程序日志。value 的数据类型为 varchar(5)，没有默认值。如果为 true，则错误总是写入 Windows NT 应用程序日志。如果为 false，则错误并不是始终都写入应用程序日志，但可以写入应用程序日志，具体取决于错误是如何产生的。

返回代码值

0（成功）或 1（失败）

结果集

无

注释

带有 WITH_LOG 选项的 sp_altermessage 的作用和 RAISERROR WITH LOG 参数的作用相似，只是 sp_altermessage 更改现有消息的记录行为。如果消息已更改为 WITH_LOG，则它总是被写入 Windows NT 应用程序日志，而不管用户如何引起该错误。即使不带 WITH LOG 选项执行 RAISERROR，错误也会被写入 Windows NT 应用程序日志。

可以使用 sp_altermessage 修改由 sp_addmessage 添加的系统消息（例如 605）和用户消息。

权限

只有 sysadmin 和 serveradmin 固定服务器角色成员才能执行该存储过程。

示例

下面的示例导致现有消息 55001 被记录到 Windows NT 应用程序日志中。

sp_altermessage 55001, 'WITH_LOG', 'true'

请参见

sp_addmessage

sp_dropmessage

系统存储过程


sp_apply_job_to_targets

将作业应用到一个或多个目标服务器或属于一个或多个目标服务器组的目标服务器。

语法

sp_apply_job_to_targets [ @job_id = ] job_id | [ @job_name = ] 'job_name'
[ , [ @target_server_groups = ] 'target_server_groups' ]
    [ , [ @target_servers = ] 'target_servers' ]
[ , [ @operation = ] 'operation' ]

参数

[@job_id =] job_id

要应用于指定目标服务器或目标服务器组的作业的作业标识编号。job_id 的数据类型为 uniqueidentifier，默认值为 NULL。

[@job_name =] 'job_name'

要应用于指定的相关目标服务器或目标服务器组的作业的名称。job_name 的数据类型为 sysname，默认值为 NULL。

说明 必须指定 job_id 或 job_name，但不能两个都指定。

[@target_server_groups =] 'target_server_groups'

以逗号分隔的目标服务器组的列表，指定的作业将应用于这些服务器组。target_server_groups 的数据类型为 nvarchar(1024)，默认值为 NULL。

[@target_servers =] 'target_servers'

以逗号分隔的目标服务器的列表，指定的作业将应用于这些服务器。target_servers 的数据类型为 nvarchar(1024)，默认值为 NULL。

[@operation =] 'operation'

指出是将指定的作业应用于指定的目标服务器或目标服务器组，还是将其从指定的目标服务器或目标服务器组删除。operation 的数据类型为 varchar(7)，默认值为 APPLY。有效的操作为 APPLY 和 REMOVE。

返回代码值

0（成功）或 1（失败）

注释

sp_apply_job_to_targets 提供向多个目标服务器应用作业或将其从多个目标服务器删除的简单方法，而不用对每个要求的目标服务器调用一次 sp_add_jobserver（或 sp_delete_jobserver）。

权限

只有 sysadmin 固定服务器角色的成员才能执行 sp_apply_job_to_targets。

示例

下面的示例将以前创建的 Backup Customer Information 作业应用于 Servers Maintaining Customer Information 组中的所有目标服务器。

USE msdb
EXEC sp_apply_job_to_targets @job_name = 'Backup Customer Information',    @target_server_groups = 'Servers Maintaining Customer Information',
   @operation = 'APPLY'

请参见

sp_add_jobserver

sp_delete_jobserver

sp_remove_job_from_targets

系统存储过程


sp_approlepassword

更改当前数据库中应用程序角色的密码。

语法

sp_approlepassword [ @rolename = ] 'role'
, [ @newpwd = ] 'password'

参数

[@rolename =] 'role'

应用程序角色的名称。role 的数据类型为 sysname，没有默认值。role 必须存在于当前数据库中。

[@newpwd =] 'password'

应用程序角色的新密码。password 的数据类型为 sysname，没有默认值。当存储在 Microsoft® SQL Server™ 系统表中时，新密码被加密，password 不能为 NULL。

返回代码值

0（成功）或 1（失败）

注释

sp_approlepassword 不能在用户定义的事务中执行。

权限

只有 sysadmin 固定服务器角色、db_securityadmin 和 db_owner 固定数据库角色的成员才能执行 sp_approlepassword。

示例

下面的示例将 PayrollAppRole 应用程序角色的密码设置为 Valentine。

EXEC sp_approlepassword 'PayrollAppRole', 'Valentine'

请参见

应用程序安全性和应用程序角色

sp_addapprole

sp_setapprole

系统存储过程


sp_attach_db

将数据库附加到服务器。

语法

sp_attach_db [ @dbname = ] 'dbname'
, [ @filename1 = ] 'filename_n' [ ,...16 ]

参数

[@dbname =] 'dbname'

要附加到服务器的数据库的名称。该名称必须是唯一的。dbname 的数据类型为 sysname，默认值为 NULL。

[@filename1 =] 'filename_n'

数据库文件的物理名称，包括路径。filename_n 的数据类型为 nvarchar(260)，默认值为 NULL。最多可以指定 16 个文件名。参数名称以 @filename1 开始，递增到 @filename16。文件名列表至少必须包括主文件，主文件包含指向数据库中其它文件的系统表。该列表还必须包括数据库分离后所有被移动的文件。

返回代码值

0（成功）或 1（失败）

结果集

无

注释

只应对以前使用显式 sp_detach_db 操作从数据库服务器分离的数据库执行 sp_attach_db。如果必须指定多于 16 个文件，请使用带有 FOR ATTACH 子句的 CREATE DATABASE。

如果将数据库附加到的服务器不是该数据库从中分离的服务器，并且启用了分离的数据库以进行复制，则应该运行 sp_removedbreplication 从数据库删除复制。

权限

只有 sysadmin 和 dbcreator 固定服务器角色的成员才能执行本过程。

示例

下面的示例将 pubs 中的两个文件附加到当前服务器。

EXEC sp_attach_db @dbname = N'pubs',
   @filename1 = N'c:\Program Files\Microsoft SQL Server\MSSQL\Data\pubs.mdf',
   @filename2 = N'c:\Program Files\Microsoft SQL Server\MSSQL\Data\pubs_log.ldf'

请参见

CREATE DATABASE

sp_attach_single_file_db

sp_detach_db

sp_helpfile

sp_removedbreplication

系统存储过程


sp_attach_single_file_db

将只有一个数据文件的数据库附加到当前服务器。

语法

sp_attach_single_file_db [ @dbname = ] 'dbname'
, [ @physname = ] 'physical_name'

参数

[@dbname =] 'dbname'

要附加到服务器的数据库的名称。dbname 的数据类型为 sysname，默认值为 NULL。

[@physname =] 'phsyical_name'

据库文件的物理名称，包括数路径。physical_name 的数据类型为 nvarchar(260)，默认值为 NULL。

返回代码值

0（成功）或 1（失败）

结果集

无

注释

当使用 sp_attach_single_file_db 将数据库附加到服务器时，它创建一个新的日志文件并执行额外的清除工作，从新附加的数据库中删除复制。

仅对以前使用显式 sp_detach_db 操作从服务器分离的数据库执行 sp_attach_single_file_db。

权限

只有 sysadmin 和 dbcreator 固定服务器角色的成员才能执行本过程。

示例

下面的示例分离 pubs，然后将 pubs 中的一个文件附加到当前服务器。

EXEC sp_detach_db @dbname = 'pubs'
EXEC sp_attach_single_file_db @dbname = 'pubs',
   @physname = 'c:\Program Files\Microsoft SQL Server\MSSQL\Data\pubs.mdf'

请参见

sp_attach_db

sp_detach_db

sp_helpfile

系统存储过程


sp_autostats

显示或更改索引或统计的自动 UPDATE STATISTICS 设置，该索引或统计是当前数据库中特定的索引或统计，或者是当前数据库中给定表或已索引视图的所有索引或统计。

说明 在此存储过程的上下文中，术语"索引"指的是表或视图上的统计。

语法

sp_autostats [ @tblname = ] 'table_name'
[ , [ @flagc = ] 'stats_flag' ]
[ , [ @indname = ] 'index_name' ]

参数

[@tblname =] 'table_name'

要显示其自动 UPDATE STATISTICS 设置的表或视图的名称。table_name 的数据类型为 nvarchar(776)，没有默认值。如果提供了 index_name，Microsoft SQL Server 会启用该索引的自动 UPDATE STATISTICS 设置。

[@flagc =] 'stats_flag'

指定表、视图或索引的自动 UPDATE STATISTICS 设置是启用 (ON) 还是禁用 (OFF)。stats_flag 的数据类型为 varchar(10)，默认值为 NULL。

[@indname =] 'index_name'

启用或禁用其自动 UPDATE STATISTICS 设置的索引的名称。index_name 的数据类型为 sysname，默认值为 NULL。

返回代码值

0（成功）或 1（失败）

结果集

如果指定了 stats_flag，该过程报告已实施但没有返回结果集的操作。

如果未指定 stats_flag，sp_autostats 返回以下结果集。

列名 | 数据类型 | 描述
Index Name | varchar(60) | 索引的名称。
AUTOSTATS | varchar(3) | 当前的自动 UPDATE STATISTICS 设置：OFF 或 ON。
Last Updated | datetime | 上次更新统计的日期。

权限

只有 sysadmin 固定服务器角色、db_owner 和 db_ddladmin 固定数据库角色的成员及表所有者，才能执行 sp_autostats。

示例
A. 显示表的所有索引的当前状态

下面的示例显示 authors 表上所有索引的当前统计状态。

USE pubs
EXEC sp_autostats authors
B. 启用表的所有索引的自动统计

下面的示例启用 authors 表的所有索引的自动统计设置。

USE pubs
EXEC sp_autostats authors, 'ON'
C. 禁用特定索引的自动统计

下面的示例禁用 authors 表的 au_id 索引的自动统计设置。

USE pubs
EXEC sp_autostats authors, 'OFF', au_id

请参见

CREATE INDEX

CREATE STATISTICS

DBCC SHOW_STATISTICS

DROP STATISTICS

sp_createstats

sp_dboption

系统存储过程

UPDATE STATISTICS


sp_bindefault

将默认值绑定到列或用户定义的数据类型。

语法

sp_bindefault [ @defname = ] 'default' ,
[ @objname = ] 'object_name'
[ , [ @futureonly = ] 'futureonly_flag' ]

参数

[@defname =] 'default'

由 CREATE DEFAULT 语句创建的默认名称。default 的数据类型为 nvarchar(776)，无默认值。

[@objname =] 'object_name'

要绑定默认值的表和列名称或用户定义的数据类型。object_name 的数据类型为 nvarchar(517)，无默认值。如果 object_name 没有采取 table.column 格式，则认为它属于用户定义数据类型。默认情况下，用户定义数据类型的现有列继承 default，除非默认值直接绑定到列中。默认值无法绑定到 timestamp 数据类型的列、带 IDENTITY 属性的列或者已经有 DEFAULT 约束的列。

说明 object_name 中可以含有 [ and ] 字符作为分隔标识符。有关更多信息，请参见分隔标识符。

[@futureonly =] 'futureonly_flag'

仅在将默认值绑定到用户定义的数据类型时才使用。futureonly_flag 的数据类型为 varchar(15)，默认值为 NULL。将此参数设置为 futureonly 时，它会防止现有的属于此数据类型的列继承新的默认值。当将默认值绑定到列时不会使用此参数。如果 futureonly_flag 为 NULL，那么新默认值将绑定到用户定义数据类型的任一列，条件是此数据类型当前无默认值或者使用用户定义数据类型的现有默认值。

返回代码值

0（成功）或 1（失败）

注释

可以使用 sp_bindefault 在不取消绑定现有默认值的情况下，将新默认值绑定到列（尽管最好使用 DEFAULT 约束）或者绑定到用户定义的数据类型。原有默认值将被替代。不能将默认值绑定到 Microsoft® SQL Server™ 数据类型。如果默认值和要绑定的列不兼容，那么在试图插入默认值时（不是在绑定时），SQL Server 将返回错误信息。

除非直接绑定了默认值或者将 futureonly_flag 指定为 futureonly，否则用户定义数据类型的现有列将继承新默认值。用户定义数据类型的新列始终继承默认值。

将默认值绑定到列时，相关信息将添加到 syscolumns 表中。将默认值绑定到用户定义的数据类型时，相关信息将添加到 systypes 表中。

权限

只有 sysadmin 固定服务器角色、db_owner 和 db_ddladmin 固定数据库角色成员及表所有者才能执行 sp_bindefault。

示例
A. 将默认值绑定到列

假定已经用 CREATE DEFAULT 语句在当前数据库中定义了名为 today 的默认值，此示例将默认值绑定到 employees 表的 hire date 列。当将行添加到 employees 表而且没有提供 hire date 列的数据时，列取得默认值 today 的值。

USE master
EXEC sp_bindefault 'today', 'employees.[hire date]'
B. 将默认值绑定到用户定义的数据类型

假定存在命名为 def_ssn 的默认值和命名为 ssn 的用户定义数据类型，此示例将默认值 def_ssn 绑定到用户定义的数据类型 ssn 中。在创建表时，所有指派了用户定义数据类型 ssn 的列都将继承默认值。类型 ssn 的现有列也继承默认值 def_ssn，除非为 futureonly_flag 值指定了 futureonly，或者在列上直接绑定了默认值。绑定到列的默认值始终优先于绑定到数据类型的默认值。

USE master
EXEC sp_bindefault 'def_ssn', 'ssn'
C. 使用 futureonly_flag

此示例将默认值 def_ssn 绑定到用户定义的数据类型 ssn。因为已指定 futureonly，所以不影响类型 ssn 的现有列。

USE master
EXEC sp_bindefault 'def_ssn', 'ssn', 'futureonly'
D. 使用分隔标识符

此示例显示了在 object_name 中分隔标识符的使用。

USE master
CREATE TABLE [t.1] (c1 int)
-- Notice the period as part of the table name.
EXEC sp_bindefault 'default1', '[t.1].c1'
-- The object contains two periods;
-- the first is part of the table name,
-- and the second distinguishes the table name from the column name.

请参见

CREATE DEFAULT

DROP DEFAULT

sp_unbindefault

系统存储过程


sp_bindrule

将规则绑定到列或用户定义的数据类型。

语法

sp_bindrule [ @rulename = ] 'rule' ,
[ @objname = ] 'object_name'
[ , [ @futureonly = ] 'futureonly_flag' ]

参数

[@rulename =] 'rule'

由 CREATE RULE 语句创建的规则名称。rule 的数据类型为 nvarchar(776)，无默认值。

[@objname =] 'object_name'

绑定了规则的表和列或用户定义的数据类型。object_name 的数据类型为 nvarchar(517)，无默认值。如果 object_name 没有采取 table.column 格式，则认为它属于用户定义数据类型。默认情况下，用户定义的数据类型的现有列继承 rule，除非直接在列上绑定了规则。

说明 object_name 中可以含有 [ and ] 字符作为分隔标识符。有关更多信息，请参见分隔标识符。

[@futureonly =] 'futureonly_flag'

仅当将规则绑定到用户定义的数据类型时才使用。future_only_flag 的数据类型为 varchar(15)，默认值为 NULL。将此参数在设置为 futureonly 时，它会防止用户定义数据类型的现有列继承新规则。如果 futureonly_flag 为 NULL，那么新规则将绑定到用户定义数据类型的每一列，条件是此数据类型当前无规则或者使用用户定义数据类型的现有规则。

返回代码值

0（成功）或 1（失败）

注释

可以使用 sp_bindrule 在不取消绑定现有规则的情况下，将新规则绑定到列（尽管最好使用 CHECK 约束）或者用户定义的数据类型。替代原有规则。如果使用现有 CHECK 约束将规则绑定到列，那么将评估所有限制。不能将规则绑定到 Microsoft® SQL Server™ 数据类型。

当试图执行 INSERT 语句时（不是在绑定时），将强行执行规则。尽管此处 INSERT 非法，仍然可以将字符规则绑定到 numeric 数据类型的列。

除非将 futureonly_flag 指定为 futureonly，否则用户定义数据类型的现有列将继承新规则。使用用户定义数据类型定义的新列始终继承规则。但是，如果 ALTER TABLE 语句的 ALTER COLUMN 子句将列的数据类型更改为绑定规则的用户定义数据类型，那么列不会继承与数据类型绑定的规则。必须使用 sp_bindrule 专门将规则绑定到列。

将规则绑定到列时，相关信息将添加到 syscolumns 表中。将规则绑定到用户定义的数据类型时，相关信息将添加到 systypes 表中。

权限

只有 sysadmin 固定服务器角色、db_owner 和 db_ddladmin 固定数据库角色成员及表所有者才能执行 sp_bindrule。

示例
A. 将规则绑定到列

假设已经用 CREATE RULE 语句在当前数据库中创建名为 today 的规则，此示例将规则绑定到 employees 表的 hire date 列。将行添加到 employees 时，按照 today 规则检查 hire date 列的数据。

USE master
EXEC sp_bindrule 'today', 'employees.[hire date]'
B. 将规则绑定到用户定义的数据类型

假设存在名为 rule_ssn 的规则和名为 ssn 的用户定义数据类型，此示例将 rule_ssn 绑定到 ssn。在 CREATE TABLE 语句中，类型 ssn 的列继承 rule_ssn 规则。类型 ssn 的现有列也继承 rule_ssn 规则，除非为 futureonly_flag 指定了 futureonly 或者在 ssn 上直接绑定了规则。绑定到列的规则始终优先于绑定到数据类型的规则。

USE master
EXEC sp_bindrule 'rule_ssn', 'ssn'
C. 使用 futureonly_flag

此示例将 rule_ssn 规则绑定到用户定义数据类型 ssn。因为已指定 futureonly，所以不影响类型 ssn 的现有列。

USE master
EXEC sp_bindrule 'rule_ssn', 'ssn', 'futureonly'
D. 使用分隔标识符

此示例显示了在 object_name 中分隔标识符的使用。

USE master
CREATE TABLE [t.2] (c1 int)
-- Notice the period as part of the table name.
EXEC sp_binderule rule1, '[t.2].c1'
-- The object contains two periods;
-- the first is part of the table name
-- and the second distinguishes the table name from the column name.

请参见

CREATE RULE

DROP RULE

sp_unbindrule

系统存储过程


sp_bindsession

绑定或解除绑定与同一 Microsoft SQL Server 2000 实例中的其它事务的连接。绑定连接允许两个或更多的连接参与同一事务并共享该事务，直到发出 ROLLBACK TRANSACTION 或 COMMIT TRANSACTION 命令。

有关绑定连接的更多信息，请参见使用绑定连接。

语法

sp_bindsession { 'bind_token' | NULL }

参数

'bind_token'

是标识事务的令牌，该令牌最初通过使用 sp_getbindtoken 或开放式数据服务 srv_getbindtoken 函数获得。bind_token 的数据类型为 varchar(8000)。

返回代码值

0（成功）或 1（失败）

注释

sp_bindsession 使用绑定令牌绑定两个或多个现有客户端连接。这些客户端连接必须位于获得绑定令牌的同一 SQL Server 2000 实例中。连接是执行命令的客户端。绑定数据库连接共享事务和锁空间。

从一个 SQL Server 2000 实例中获得的绑定令牌不能用于另一实例上的客户端连接，甚至对 DTC 事务也是如此。绑定令牌仅在每个 SQL Server 的内部有效，不能在多个 SQL Server 实例间共享。对于位于另一 SQL Server 实例上的客户端连接，必须通过执行 sp_getbindtoken 获取另一个绑定令牌。

如果使用非活动令牌，则 sp_bindsession 将失败并出现错误。

通过省略 bind_token 或向 bind_token 中传递 NULL 可以从会话中取消绑定。

可以通过 ODBC、DB-LIBRARY 函数或者 isql 实用工具执行 sp_bindsession。

重要 在执行 sp_bindsession 之前，必须通过运行 sp_getbindtoken 或者开放式数据服务 srv_getbindtoken 函数获得绑定令牌。

若要获得和传递绑定令牌，请在执行 sp_bindsession 前运行 sp_getbindtoken，以共享同一事务。如果获得绑定令牌，则 sp_bindsession 可正确运行。

权限

执行许可权限默认授予 public 角色。

示例

此示例将指定的绑定令牌绑定到当前会话。

说明 通过先执行 sp_getbindtoken 后执行 sp_bindsession，可以获得以下显示的绑定令牌。

USE master
EXEC sp_bindsession 'BP9---5---->KB?-V'<>1E:H-7U-]ANZ'

请参见

sp_getbindtoken

srv_getbindtoken

系统存储过程


sp_can_tlog_be_applied

验证事务日志是否可应用到数据库。

语法

sp_can_tlog_be_applied [ @backup_file_name = ] 'backup_file_name'
, [ @database_name = ] 'database_name'
, [ @result = ] result OUTPUT

参数

[@backup_file_name =] 'backup_file_name'

备份文件的名称。backup_file_name 的数据类型为 nvarchar(128)。

[@database_name =] 'database_name'

数据库的名称。database_name 的数据类型为 sysname。

[@result =] result OUTPUT

表明事务日志是否可以应用于数据库。值为一 (1) 表示可以应用日志；值为零 (0) 表示不能应用日志。result 的数据类型为 bit。

返回代码值

0（成功）或 1（失败）

权限

只有 sysadmin 固定服务器角色的成员才能执行 sp_can_tlog_be_applied。


sp_catalogs

返回指定的链接服务器中的目录列表，此目录列表相当于 Microsoft® SQL Server™ 中的数据库。

语法

sp_catalogs [ @server_name = ] 'linked_svr'

参数

[@server_name =] 'linked_svr'

链接服务器的名称。linked_svr 的数据类型为 sysname，没有默认值。

结果集
列名 | 数据类型 | 描述
catalog_name | nvarchar(128) | 目录的名称
Description | nvarchar(4000) | 目录的描述

权限

执行权限默认授予 public 角色。

示例

下面的示例返回名为 OLE DB ODBC Linked Server #3 的链接服务器的目录信息。

说明 若要让 sp_catalogs 提供有用的信息，OLE DB ODBC Linked Server #3 必须已经存在。

USE master
EXEC sp_catalogs 'OLE DB ODBC Linked Server #3'

请参见

sp_addlinkedserver

sp_columns_ex

sp_column_privileges

sp_foreignkeys

sp_indexes

sp_linkedservers

sp_primarykeys

sp_tables_ex

sp_table_privileges

系统存储过程


sp_certify_removable

验证数据库是否已为在可移动介质上分发而正确配置，并向用户报告所有问题。

语法

sp_certify_removable [ @dbname = ] 'dbname'
[ , [ @autofix = ] 'auto' ]

参数

[@dbname =] 'dbname'

指定要验证的数据库。dbname 的数据类型为 sysname。

[@autofix =] 'auto'

对系统管理员授予数据库及所有数据库对象的所有权，并除去任何用户创建的数据库用户及非默认的权限。auto 的数据类型为 nvarchar(4)，默认值为 NULL。auto 的值为 auto。

返回代码值

0（成功）或 1（失败）

注释

如果数据库配置正确，sp_certify_removable 会将数据库设置为脱机，以便复制文件。此过程将更新所有表的统计信息，并报告任何所有权问题或用户问题。此外，还将数据文件组标记为只读，以便将这些文件复制到只读介质。

系统管理员必须是数据库和所有数据库对象的所有者。系统管理员是存在于所有正在运行 Microsoft® SQL Server™ 的服务器上的已知用户，在稍后分发和安装数据库时可望仍然存在。

如果运行没有 auto 值的 sp_certify_removable，并且返回信息表明系统管理员不是数据库的所有者、存在用户创建的用户、系统管理员未拥有数据库的所有对象、或授予非默认的权限，则可以通过以下两种方法纠正这些问题：

  1. 使用 SQL Server 工具和过程，然后运行 sp_certify_removable。

  2. 只需运行具有 auto 值的 sp_certify_removable。

注意，此存储过程只检查用户和用户权限。允许向数据库添加组并对这些组授予权限。有关更多信息，请参见 GRANT。

此过程将验证信息写入文本文件，文件名的格式如下：

CertifyR_[dbname].txt

说明 xp_cmdshell 上的权限必须允许该文件写入。

权限

EXECUTE 权限只授予 sysadmin 固定服务器角色的成员。

示例

下面的示例验证 inventory 数据库已作好删除准备。

sp_certify_removable inventory, AUTO

请参见

sp_attach_db

sp_create_removable

sp_dboption

sp_dbremove

系统存储过程


sp_change_monitor_role

在日志传送监视器上执行角色更改，并将当前辅助数据库设置为主数据库。

语法

sp_change_monitor_role [ @primary_server = ] 'primary_server'
, [ @secondary_server = ] 'secondary_server'
 , [ @database = ] 'secondary_database'
 , [ @new_source = ] 'new_tlog_source_directory'

参数

[@primary_server =] 'primary_server'

是正被替换的主服务器名称。primary_server 的数据类型为 sysname，没有默认值。

[@secondary_server =] 'secondary_server'

是正在转换为主服务器的辅助服务器的名称。secondary_server 的数据类型为 sysname，没有默认值。

[@database =] 'secondary_database'

是正在转换为主数据库的辅助数据库的名称。secondary_database 的数据类型为 sysname，没有默认值。

[@new_source =] 'new_tlog_source_directory'

是新的主服务器要在其中转储其事务日志的目录路径。new_tlog_source_directory 的数据类型为 nvarchar(128)，没有默认值。

返回代码值

无

结果集

无

注释

sp_change_monitor_role 必须运行于标记为日志传送监视器的 SQL Server 实例上。

为完成日志传送角色更改，除运行此过程外，还必须执行某些步骤。有关更多信息，请参见如何设置和执行日志传送角色转变 (Transact-SQL) (Transact-SQL)。

权限

只有 sysadmin 固定服务器角色成员才能执行 sp_change_monitor_role。

示例

下例显示如何更改监视器以反映新的主数据库。数据库'db2'成为新的主数据库，会将其事务日志转储到目录'\\newprisrv1\tlogs\'中。

EXEC sp_change_monitor_role @primary_server = 'srv1',
   @secondary_server = 'srv2'
   @database = 'db2',
   @new_source = '\\newprisrv1\tlogs\'

请参见

sp_change_primary_role

sp_change_secondary_role

sp_resolve_logins


sp_change_primary_role

从日志传送计划中删除主数据库。

语法

sp_change_primary_role [ @db_name = ] 'db_name'
, [ @backup_log = ] backup_log
 , [ @terminate = ] terminate
 , [ @final_state = ] final_state
 , [ @access_level = ] access_level

参数

[@db_name =] 'db_name'

指定要删除的主数据库名称。db_name 的数据类型为 sysname，没有默认值。

[@backup_log =] backup_log

备份主数据库事务日志的尾部。backup_log 的数据类型为 bit，默认值为 1。

[@terminate =] terminate

指定立即回滚所有挂起的事务，并在该存储过程运行期间将主数据库置于单用户模式下。terminate 的数据类型为 bit，默认值为 1。

[@final_state =] final_state

指定在完成该存储过程后数据库的恢复状态。final_state 的数据类型为 smallint，默认值为 1，可以是下列值之一。

值 | 描述
1 | RECOVERY
2 | NO RECOVERY
3 | STANDBY

有关这些选项含义的更多信息，请参见 RESTORE。

[@access_level =] access_level

指定完成该存储过程后数据库的访问级别。access_level 的数据类型为 smallint，默认值是 1，可以是下列值之一。

值 | 描述
1 | MULTI_USER
2 | RESTRICTED_USER
3 | SINGLE_USER

有关这些选项含义的更多信息，请参见 ALTER DATABASE。

返回代码值

1（失败）或无（成功）

结果集

无

注释

必须在标记为当前主服务器的 SQL Server 实例上运行 sp_change_primary_role。

为完成日志传送角色更改，除运行此过程外，还必须执行某些步骤。有关更多信息，请参见如何设置和执行日志传送角色转变 (Transact-SQL)。

在从日志传送计划中删除数据库事务日志之前备份它。

权限

只有 sysadmin 固定服务器角色成员才能执行 sp_change_primary_role。

示例

下例显示如何从日志传送计划中删除主数据库。

EXEC sp_change_primary_role @db_name = 'db1',
   @job_id = '6F9619FF-8B86-D011-B42D-00C04FC964FF',

请参见

sp_change_monitor_role

sp_change_secondary_role

sp_resolve_logins


sp_change_secondary_role

将日志传送计划的辅助数据库转换为主数据库。

语法

sp_change_secondary_role [ @db_name = ] 'db_name'
, [ @do_load = ] do_load
 , [ @force_load = ] force_load
 , [ @final_state = ] final_state
 , [ @access_level = ] access_level
 , [ @terminate = ] terminate
 , [ @keep_replication = ] keep_replication
 , [ @stopat = ] stop_at_time

参数

[@db_name =] db_name

指定辅助数据库名称。db_name 的数据类型为 sysname，没有默认设置。

[@do_load =] do_load

指定在将 db_name 转换为主数据库之前应复制和还原任何挂起的事务日志。do_load 的数据类型为 bit，默认值为 1。

[@force_load =] force_load

指定在将任何挂起的事务日志还原到辅助数据库时使用 –ForceLoad 选项。除非将 do_load 设置为1，否则忽略该选项。force_load 的数据类型为 bit，默认值为 1。

[@final_state =] final_state

指定在完成该存储过程后数据库的恢复状态。final_state 的数据类型为 smallint，默认值为 1，可以是下列值之一。

值 | 描述
1 | RECOVERY
2 | NO RECOVERY
3 | STANDBY

有关这些选项含义的更多信息，请参见 RESTORE。

[@access_level =] access_level

指定在完成该存储过程后数据库的访问级别。access_level 的数据类型为 smallint，默认值为 1，可以是下列值之一。

值 | 描述
1 | MULTI_USER
2 | RESTRICTED_USER
3 | SINGLE_USER

有关这些选项含义的更多信息，请参见 ALTER DATABASE。

[@terminate =] terminate

指定应立即回滚所有挂起事务，并在该存储过程运行期间将辅助数据库置于单用户模式下。terminate 的数据类型为 bit，默认值为 1。

[@keep_replication =] keep_replication

指定在辅助数据库上还原任何挂起的事务日志时保留复制设置。除非将 do_load 设置为 1，否则忽略该选项。keep_replication 的数据类型为 bit，默认值为 0。

[@stopat =] stop_at_time

指定在应用任何挂起的事务日志时，应将辅助数据库还原到指定日期和时间下的状态。除非将 do_load 设置为 1，否则忽略该选项。stop_at_time 的数据类型为 datetime，默认值为 NULL。

返回代码值

0（成功）或 1（失败）

结果集

无

注释

必须在标记为当前主服务器的 SQL Server 实例上运行 sp_change_secondary_role。

为完成日志传送角色更改，除运行此过程外，还必须执行某些步骤。有关更多信息，请参见如何设置和执行日志传送角色转变 (Transact-SQL)。

权限

只有 sysadmin 固定服务器角色成员才能执行 sp_change_secondary_role。

示例

下例显示如何将辅助数据库转换为主数据库。在转换辅助数据库之前，在该数据库上应用以前传送的事务日志。

EXEC sp_change_secondary_role @db_name = 'db2',
   @do_load = 1,
   @final_state = 1,
   @access_level = 3

请参见

sp_change_monitor_role

sp_change_primary_role

sp_resolve_logins


sp_change_users_login

更改当前数据库中 SQL Server 用户与 Microsoft® SQL Server™ 登录之间的关系。

语法

sp_change_users_login [ @Action = ] 'action'
[ , [ @UserNamePattern = ] 'user' ]
[ , [ @login Name = ] 'login' ]

参数

[ @Action = ] 'action'

描述此过程要执行的操作。action 的数据类型为 varchar(10)，可以是下面的某个值。

值 | 描述
Auto_Fix | 将当前数据库的 sysusers 表中的用户条目链接到 syslogins 中同名的登录上。建议检查 Auto_Fix 语句的结果，确认建立的链接是预期的结果。在对安全性较为敏感的情况下，避免使用 Auto_Fix。Auto_Fix 对链接作出最好的估计，授予用户的访问权限可能比预期的要多。 user 必须是当前数据库中的有效用户，login 必须为 NULL、长度为零的字符串 ('') 或不指定。
Report | 列出当前数据库中未链接到任何登录的用户及其对应的安全标识号 (SID)。 user 和 login 必须为 NULL、长度为零的字符串 ('') 或不指定。
Update_One | 将当前数据库中指定的 user 链接到 login。login 必须已经存在。必须指定 user 和 login。

[@UserNamePattern =] 'user'

是当前数据库中的 SQL Server 用户的名称。user 的数据类型为 sysname，默认值为 NULL。sp_change_users_login 只能用于 SQL Server 登录和用户的安全帐户；而不能用于 Microsoft Windows NT® 用户。

[@LoginName =] 'login'

SQL Server 登录的名称。login 的数据类型为 sysname，默认值为 NULL。

返回代码值

0（成功）或 1（失败）

结果集
列名 | 数据类型 | 描述
UserName | sysname | 登录名。
UserSID | varbinary(85) | 登录安全标识符。

注释

使用此过程将当前数据库中用户的安全帐户链接到不同的登录。如果用户登录已更改，则使用 sp_change_users_login 将用户链接到新的登录，而不会丢失用户的权限。

login 不能为 sa，而 user 不能为 dbo、guest 或 INFORMATION_SCHEMA 用户。

不能在用户定义的事务中执行 sp_change_users_login。

权限

任何 public 角色的成员均可执行带有 Report 选项的 sp_change_users_login。只有 sysadmin 固定服务器角色的成员才能指定 Auto_Fix 选项。只有 sysadmin 或 db_owner 角色的成员才能指定 Update_One 选项。

示例
A. 显示登录映射的当前用户的报告

下面的示例生成当前数据库中的用户及其安全标识符的报告。

EXEC sp_change_users_login 'Report'
B. 更改用户的登录

下面的示例更改 pubs 数据库中的用户 Mary 与现有登录之间的链接，链接到新的登录 NewMary 上（使用 sp_addlogin 添加）。

--Add the new login.
USE master
go
EXEC sp_addlogin 'NewMary'
go

--Change the user account to link with the 'NewMary' login.
USE pubs
go
EXEC sp_change_users_login 'Update_One', 'Mary', 'NewMary'

请参见

sp_addlogin

sp_adduser

sp_helplogins

系统存储过程


sp_changedbowner

更改当前数据库的所有者。

语法

sp_changedbowner [ @loginame = ] 'login'
[ , [ @map = ] remap_alias_flag ]

参数

[@loginame =] 'login'

当前数据库新所有者的登录 ID。login 的数据类型为 sysname，没有默认值。login 必须是已存在的 Microsoft® SQL Server™ 登录或 Microsoft Windows NT® 用户。如果 login 通过当前数据库内的现有别名或用户安全帐户已拥有访问该数据库的权限，则不能成为该数据库的所有者。为了避免这种情况，应先除去当前数据库中的别名或用户。

[@map =] remap_alias_flag

值为 true 或 false，表示旧数据库所有者 (dbo) 的现有别名是映射到当前数据库的新所有者还是要除去。remap_alias_flag 的数据类型为 varchar(5)，默认值为 NULL，表示旧 dbo 的任何现有别名均映射到当前数据库的新所有者。false 表示除去旧数据库所有者的现有别名。

返回代码值

0（成功）或 1（失败）

注释

执行 sp_changedbowner 之后，新所有者称为数据库中的 dbo 用户。dbo 拥有执行数据库中所有活动的暗示性权限。

不能更改 master、model 或 tempdb 系统数据库的所有者。

若要显示有效 login 值的列表，请执行 sp_helplogins 存储过程。

执行只有 login 参数的 sp_changedbowner 会将数据库所有权改为 login，并将先前别名为 dbo 的用户别名映射到新数据库所有者。

权限

只有 sysadmin 固定服务器角色成员的成员或当前数据库的所有者才能执行 sp_changedbowner。

示例

下面的示例使用户 Albert 成为当前数据库的所有者，并将旧数据库所有者的现有别名映射到 Albert。

EXEC sp_changedbowner 'Albert'

请参见

CREATE DATABASE

sp_dropalias

sp_dropuser

sp_helpdb

sp_helplogins

系统存储过程


sp_changegroup

更改当前数据库中用户安全帐户的角色成员资格。提供该过程是为了向后兼容。Microsoft® SQL Server™ 7.0 版使用角色而不是组。使用 sp_addrolemember 代替。

语法

sp_changegroup [ @grpname = ] 'role'
, [ @username = ] 'user'

参数

[@grpname =] 'role'

是添加用户的角色。role 的数据类型为 sysname，没有默认值。role 必须存在于当前数据库中。

[@username =] 'user'

向角色添加的用户。user 的数据类型为 sysname，没有默认值。用户在当前数据库中必须已存在。指定 Windows NT 用户时，请指定 Windows NT 用户在数据库中已知的名称（用 sp_grantdbaccess 添加）。

返回代码值

0（成功）或 1（失败）

注释

角色提供一种管理应用于角色成员权限的机制。将用户添加到角色时，用户获得为该角色定义的权限。

执行 sp_changegroup 时，user 的安全帐户作为 role 的成员添加，并从所有其它角色中删除。sp_addrolemember 和 sp_droprolemember 可用来更改单个角色中的角色成员资格，而不影响在其它角色中的成员资格。

使用 sp_adduser 授予新数据库用户访问数据库权限的同时，将新数据库用户可添加到角色。

如果没有通过 sp_addrolemember 明确地将用户添加到其它角色，则每个用户均为默认角色 public 的成员。

sp_changegroup 不能在用户定义的事务中执行。

权限

sysadmin 固定服务器角色、db_owner 和 db_securityadmin 固定数据库角色成员能够为该数据库中的任何角色执行 sp_changegroup。

角色所有者可以执行 sp_changegroup。角色所有者必须既拥有该用户的新角色，又拥有其当前角色。

示例

下面的示例让用户 Albert 成为 developers 角色的成员。

EXEC sp_changegroup 'developers', 'Albert'

请参见

sp_addrole

sp_addrolemember

sp_adduser

sp_dropgroup

sp_helpgroup

系统存储过程


sp_changeobjectowner

更改当前数据库中对象的所有者。

语法

sp_changeobjectowner [ @objname = ] 'object' , [ @newowner = ] 'owner'

参数

[@objname =] 'object'

当前数据库中现有的表、视图或存储过程的名称。object 的数据类型为 nvarchar(517)，没有默认值。object 可用现有对象所有者限定，格式为 existing_owner.object。

[@newowner =] 'owner'

即将成为对象的新所有者的安全帐户的名称。owner 的数据类型为 sysname，没有默认值。owner 必须是当前数据库中有效的 Microsoft® SQL Server™ 用户或角色或 Microsoft Windows NT® 用户或组。指定 Windows NT 用户或组时，请指定 Windows NT 用户或组在数据库中已知的名称（用 sp_grantdbaccess 添加）。

返回代码值

0（成功）或 1（失败）

注释

对象所有者（或拥有对象的组或角色的成员）对对象有特殊的权限。对象所有者可以执行任何与对象有关的 Transact-SQL 语句（例如 INSERT、UPDATE、DELETE、SELECT 或 EXECUTE），也可以管理对象的权限。

如果拥有对象的安全帐户必须要除去，但同时要保留该对象，请使用 sp_changeobjectowner 更改对象所有者。该过程从对象中删除所有现有权限。在运行 sp_changeobjectowner 之后，需要重新应用要保留的任何权限。

由于这个原因，建议在运行 sp_changeobjectowner 之前，编写现有权限的脚本。一旦更改了对象的所有权，可能要使用该脚本重新应用权限。在运行该脚本之前需要在权限脚本中修改对象所有者。有关编写数据库脚本的更多信息，请参见编写数据库文档和脚本。

可以使用 sp_changedbowner 更改数据库的所有者。

权限

只有 sysadmin 固定服务器角色和 db_owner 固定数据库角色成员，或既是 db_ddladmin 固定数据库角色又是 db_securityadmin 固定数据库角色的成员，才能执行 sp_changeobjectowner。

示例

下面的示例将 authors 表的所有者改为 Corporate\GeorgeW。

EXEC sp_changeobjectowner 'authors', 'Corporate\GeorgeW'

请参见

CREATE TABLE

sp_changedbowner

系统存储过程


sp_column_privileges

返回当前环境中单个表的列特权信息。

语法

sp_column_privileges [ @table_name = ] 'table_name'
[ , [ @table_owner = ] 'table_owner' ]
[ , [ @table_qualifier = ] 'table_qualifier' ]
[ , [ @column_name = ] 'column' ]

参数

[@table_name =] 'table_name'

用来返回目录信息的表。table_name 的数据类型为 sysname，没有默认值。不支持通配符模式匹配。

[@table_owner =] 'table_owner'

是用于返回目录信息的表所有者。table_owner 的数据类型为 sysname，默认值为 NULL。不支持通配符模式匹配。如果没有指定 table_owner，则应用基础数据库管理系统 (DBMS) 默认的表的可视性规则。

在 Microsoft® SQL Server™ 中，如果当前用户拥有的表具有指定名称，则返回该表的列。如果没有指定 table_owner，并且当前用户不拥有指定 table_name 的表，则 sp_column_privileges 搜索数据库所有者拥有的指定 table_name 的表。如果有，则返回该表的列。

[@table_qualifier =] 'table_qualifier'

是表限定符的名称。table_qualifier 的数据类型为 sysname，默认值为 NULL。多种 DBMS 产品支持表的三部分命名方式 (qualifier.owner.name)。在 SQL Server 中，该列表示数据库名。在某些产品中，该列表示表所在数据库环境的服务器名。

[@column_name =] 'column'

是只获得一列目录信息时所使用的单个列。column 的数据类型为 nvarchar(384)，默认值为 NULL。如果没有指定 column，将返回所有列。在 SQL Server 中，column 表示在 syscolumns 表中列出的列名。使用基础 DBMS 的通配符匹配模式，column 可以包含通配符。若要获得最佳的互操作性，网关客户端应假定只有 SQL-92 标准模式匹配（% 和 _ 通配符）。

结果集

sp_column_privileges 与 ODBC 中的 SQLColumnPrivileges 等价。返回的结果按 TABLE_QUALIFIER、TABLE_OWNER、TABLE_NAME、COLUMN_NAME 和 PRIVILEGE排序。

列名 | 数据类型 | 描述
TABLE_QUALIFIER | sysname | 表限定符名称。该字段可以为 NULL。
TABLE_OWNER | sysname | 表所有者名称。该字段始终返回值。
TABLE_NAME | sysname | 表名。该字段始终返回值。
COLUMN_NAME | sysname | 所返回的 TABLE_NAME 每列的列名。该字段始终返回值。
GRANTOR | sysname | 将 COLUMN_NAME 上的权限授予所列 GRANTEE 的数据库用户名。在 SQL Server 中，该列总是和 TABLE_OWNER 相同。该字段始终返回值。 GRANTOR 列可以是数据库所有者 (TABLE_OWNER) 或数据库所有者通过 GRANT 语句中的 WITH GRANT OPTION 子句对其授予权限的用户。
GRANTEE | sysname | 由所列 GRANTOR 授予 COLUMN_NAME 上的权限的数据库用户名。在 SQL Server 中，该列总是包括来自 sysusers 表的数据库用户。该字段始终返回值。
PRIVILEGE | varchar(32) | 可用列权限中的一个。列权限可以是下列值中的一个（或定义执行时数据源支持的其它值）： SELECT = GRANTEE 可以检索列的数据。 INSERT = GRANTEE 向表插入新行时可以为该列提供数据。 UPDATE = GRANTEE 可以修改列中的现有数据。 REFERENCES = GRANTEE 可以引用主键/外键关系中外表中的列。主键/外键关系使用表约束定义。
IS_GRANTABLE | varchar(3) | 指出是否允许 GRANTEE 为其他用户授予权限，经常称为"授予再授予 (grant with grant)"。可以是 YES、NO 或 NULL。未知的（或 NULL）值引用不能使用"授予再授予 (grant with grant)"的数据源。

注释

对于 SQL Server，可以用 GRANT 语句授予权限，用 REVOKE 语句除去权限。

权限

执行许可权限默认授予 public 角色。

示例

下面的示例返回表的列特权信息。

EXEC sp_column_privileges Employees

请参见

分布式查询

GRANT

REVOKE

系统存储过程


sp_column_privileges_ex

返回指定链接服务器上的指定表的列特权。

语法

sp_column_privileges_ex [ @table_server = ] 'table_server'
[ , [ @table_name = ] 'table_name' ]
[ , [ @table_schema = ] 'table_schema' ]
[ , [ @table_catalog = ] 'table_catalog' ]
[ , [ @column_name = ] 'column_name' ]

参数

[@table_server =] 'table_server'

要返回其信息的链接服务器的名称。table_server 的数据类型为 sysname，没有默认值。

[@table_name =] 'table_name'

包含指定列的表的名称，table_name 的数据类型为 sysname，默认值为 NULL。

[@table_schema =] 'table_schema'

表架构。table_schema 的数据类型为 sysname，默认值为 NULL。

[@table_catalog =] 'table_catalog'

指定 table_name 所在数据库的名称。table_catalog 的数据类型为 sysname，默认值为 NULL。

[@column_name =] 'column_name'

为其提供特权信息的列的名称。column_name 的数据类型为 sysname，默认值为 NULL（所有常见值）。

结果集

下表显示结果集列。返回的结果按 TABLE_QUALIFIER、TABLE_OWNER、TABLE_NAME、COLUMN_NAME 和 PRIVILEGE排序。

列名 | 数据类型 | 描述
TABLE_CAT | sysname | 表限定符名称。多种 DBMS 产品支持表的三部分命名方式 (qualifier.owner.name)。在 Microsoft® SQL Server™ 中，该列表示数据库名。在某些产品中，该列表示表所在数据库环境的服务器名。该字段可以为 NULL。
TABLE_SCHEM | sysname | 表所有者名称。在 SQL Server 中，该列表示创建表的数据库用户的姓名。该字段始终返回值。
TABLE_NAME | sysname | 表名。该字段始终返回值。
COLUMN_NAME | sysname | 所返回的 TABLE_NAME 每列的列名。该字段始终返回值。
GRANTOR | sysname | 将 COLUMN_NAME 上的权限授予所列 GRANTEE 的数据库用户名。在 SQL Server 中，该列总是和 TABLE_OWNER 相同。该字段始终返回值。 GRANTOR 列可以是数据库所有者 (TABLE_OWNER) 或数据库所有者通过 GRANT 语句中的 WITH GRANT OPTION 子句对其授予权限的用户。
GRANTEE | sysname | 由所列 GRANTOR 授予 COLUMN_NAME 上的权限的数据库用户名。该字段始终返回值。
PRIVILEGE | varchar(32) | 可用列权限中的一个。列权限可以是下列值中的一个（或定义执行时数据源支持的其它值）： SELECT = GRANTEE 可以检索列的数据。 INSERT = GRANTEE 向表插入新行时可以为该列提供数据。 UPDATE = GRANTEE 可以修改列中的现有数据。 REFERENCES = GRANTEE 可以引用主键/外键关系中外表中的列。主键/外键关系使用表约束定义。
IS_GRANTABLE | varchar(3) | 指出是否允许 GRANTEE 为其他用户授予权限，经常称为"授予再授予 (grant with grant)"。可以是 YES、NO 或 NULL。未知的（或 NULL）值引用不能使用"授予再授予 (grant with grant)"的数据源。

权限

执行权限默认赋予 public 角色。

示例

下面的示例返回指定链接服务器上的表的列特权信息。

EXEC sp_column_privileges_ex @table_server = 'Linked_Server',
   @table_name = 'Customers', @table_catalog = 'Northwind'

请参见

sp_table_privileges_ex

系统存储过程


sp_columns

返回当前环境中可查询的指定表或视图的列信息。

语法

sp_columns [ @table_name = ] object
[ , [ @table_owner = ] owner ]
[ , [ @table_qualifier = ] qualifier ]
[ , [ @column_name = ] column ]
[ , [ @ODBCVer = ] ODBCVer ]

参数

[@table_name =] object

用来返回目录信息的表或视图的名称。object_name 的数据类型为 nvarchar(384)，没有默认值。不支持通配符模式匹配。

[@table_owner =] owner

用来返回目录信息的表或视图的对象所有者。owner 的数据类型为 nvarchar(384)，默认值为 NULL。不支持通配符模式匹配。如果没有指定 owner，则应用基础 DBMS 默认的表或视图的可视性规则。

在 Microsoft® SQL Server™ 中，如果当前用户拥有指定名称的表或视图，则返回该表的列。如果没有指定 owner，并且当前用户不拥有指定 object 的表或视图，则 sp_columns 将搜索数据库所有者拥有的指定 object 的表或视图。如果有，则返回该表的列。

[@table_qualifier =] qualifier

表或视图限定符的名称。qualifier 的数据类型为 sysname，默认值为 NULL。多种 DBMS 产品支持表的三部分命名方式 (qualifier.owner.name)。在 SQL Server 中，该列表示数据库名。在某些产品中，该列表示表所在数据库环境的服务器名。

[@column_name =] column

只需要一列目录信息时所使用的单列。column 的数据类型为 nvarchar(384)，默认值为 NULL。如果没有指定 column，将返回所有列。在 SQL Server 中，column 表示在 syscolumns 表中列出的列名。使用基础 DBMS 的通配符匹配模式，column 可以包含通配符。若要获得最佳的互操作性，网关客户端应假定只有 SQL-92 标准模式匹配（% 和 _ 通配符）。

[@ODBCVer =] ODBCVer

是当前所使用的 ODBC 版本。ODBCVer 的数据类型为 int，默认值为 2，表示 ODBC 版本 2。有效值为 2 或 3。有关版本 2 和版本 3 的行为差别，请参见 ODBC SQLColumns 规范。

返回代码值

无

结果集

sp_columns 目录存储过程与 ODBC 中的 SQLColumns 等价。返回的结果按 TABLE_QUALIFIER、TABLE_OWNER 和 TABLE_NAME 排序。

列名 | 数据类型 | 描述
TABLE_QUALIFIER | sysname | 表或视图限定符的名称。该字段可以为 NULL。
TABLE_OWNER | sysname | 表或视图所有者的名称。该字段始终返回值。
TABLE_NAME | sysname | 表或视图的名称。该字段始终返回值。
COLUMN_NAME | sysname | 所返回的 TABLE_NAME 每列的列名。该字段始终返回值。
DATA_TYPE | smallint | ODBC 数据类型的整型代码。如果数据类型无法映射到 ODBC 类型，则为 NULL。本机数据类型名称在 TYPE_NAME 列中返回。
TYPE_NAME | varchar(13) | 表示数据类型的字符串。基础 DBMS 提供此数据类型的名称。
PRECISION | int | 有效数字个数。PRECISION 列的返回值以 10 为基数。
LENGTH | int | 数据的传输大小。1
SCALE | smallint | 小数点右边的数字个数。
RADIX | smallint | 数字数据类型的基数。
NULLABLE | smallint | 指定是否可以为空。 1 = 可以为 NULL。 0 = NOT NULL。
REMARKS | varchar(254) | 该字段总是返回 NULL。
COLUMN_DEF | nvarchar(4000) | 列的默认值。
SQL_DATA_TYPE | smallint | SQL 数据类型出现在描述符的 TYPE 字段时的值。该列与 DATA_TYPE 列相同，datetime 和 SQL-92 interval 数据类型除外。该列始终返回值。
SQL_DATETIME_SUB | smallint | datetime 及 SQL-92 interval 数据类型的子类型代码。对于其它数据类型，该列返回 NULL。
CHAR_OCTET_LENGTH | int | 字符或整型数据类型的列的最大字节长度。对于所有其它数据类型，该列返回 NULL。
ORDINAL_POSITION | int | 列在表中的顺序位置。表中的第一列为 1。该列始终返回值。
IS_NULLABLE | varchar(254) | 表中的列是否可以为空。根据 ISO 规则决定是否可以为空。遵从 ISO SQL 标准的 DBMS 无法返回空字符串。 YES = 列可以包含 NULL。 NO = 列不能包含 NULL。 如果不知道是否可以为空，该列则返回零长度字符串。 该列返回的值与 NULLABLE 列返回的值不同。
SS_DATA_TYPE | tinyint | SQL Server 数据类型，由开放式数据服务扩展存储过程使用。有关更多信息，请参见数据类型。

  1. 有关更多信息，请参见 Microsoft ODBC 文档。
权限

执行权限默认赋予 public 角色。

示例

下面的示例返回指定表的列信息。

EXEC sp_columns @table_name = 'customers'

请参见

sp_tables

系统存储过程


sp_columns_ex

返回给定链接服务器表的列信息，每列一行。如果指定 column，sp_columns_ex 只返回给定列的信息。

语法

sp_columns_ex [ @table_server = ] 'table_server'
[ , [ @table_name = ] 'table_name' ]
[ , [ @table_schema = ] 'table_schema' ]
[ , [ @table_catalog = ] 'table_catalog' ]
[ , [ @column_name = ] 'column' ]
[ , [ @ODBCVer = ] 'ODBCVer' ]

参数

[@table_server =] 'table_server'

要返回其列信息的链接服务器的名称。table_server 的数据类型为 sysname，没有默认值。

[@table_name =] 'table_name'

要返回其列信息的表的名称。table_name 的数据类型为 sysname，默认值为 NULL。

[@table_schema =] 'table_schema'

要返回其列信息的表的架构名。table_schema 的数据类型为 sysname，默认值为 NULL。

[@table_catalog =] 'table_catalog'

要返回其列信息的表的目录名。table_catalog 的数据类型为 sysname，默认值为 NULL。

[@column_name =] 'column'

为其提供信息的数据库列的名称。column 的数据类型为 sysname，默认值为 NULL。

[@ODBCVer =] 'ODBCVer'

是当前所使用的 ODBC 版本。ODBCVer 的数据类型为 int，默认值为 2，表示 ODBC 版本 2。有效值为 2 或 3。有关版本 2 和版本 3 的行为差别，请参见 ODBC SQLColumns 规范。

返回代码值

无

结果集
列名 | 数据类型 | 描述
TABLE_CAT | sysname | 表或视图限定符的名称。多种 DBMS 产品支持表的三部分命名方式 (qualifier.owner.name)。在 Microsoft® SQL Server™ 中，该列表示数据库名。在某些产品中，该列表示表所在数据库环境的服务器名。该字段可以为 NULL。
TABLE_SCHEM | sysname | 表或视图所有者的名称。在 SQL Server 中，该列表示创建表的数据库用户的名称。该字段始终返回值。
TABLE_NAME | sysname | 表或视图的名称。该字段始终返回值。
COLUMN_NAME | sysname | 所返回的 TABLE_NAME 每列的列名。该字段始终返回值。
DATA_TYPE | smallint | 与 ODBC 类型指示符对应的整型值。如果数据类型无法映射到 ODBC 类型，则为 NULL。本机数据类型名称在 TYPE_NAME 列中返回。
TYPE_NAME | varchar(13) | 表示数据类型的字符串。基础 DBMS 提供此数据类型的名称。
COLUMN_SIZE | int | 有效数字个数。PRECISION 列的返回值以 10 为基数。
BUFFER_LENGTH | int | 数据的传输大小。1
DECIMAL_DIGITS | smallint | 小数点右边的数字个数。
NUM_PREC_RADIX | smallint | 数字数据类型的基数。
NULLABLE | smallint | 指定是否可以为空。 1 = 可以为 NULL。 0 = NOT NULL。
REMARKS | varchar(254) | 该字段总是返回 NULL。
COLUMN_DEF | varchar(254) | 列的默认值。
SQL_DATA_TYPE | smallint | SQL 数据类型出现在描述符的 TYPE 字段时的值。该列与 DATA_TYPE 列相同，datetime 和 SQL-92 interval 数据类型除外。该列始终返回值。
SQL_DATETIME_SUB | smallint | datetime 及 SQL-92 interval 数据类型的子类型代码。对于其它数据类型，该列返回 NULL。
CHAR_OCTET_LENGTH | int | 字符或整型数据类型的列的最大字节长度。对于所有其它数据类型，该列返回 NULL。
ORDINAL_POSITION | int | 列在表中的顺序位置。表中的第一列为 1。该列始终返回值。
IS_NULLABLE | varchar(254) | 表中的列是否可以为空。根据 ISO 规则决定是否可以为空。遵从 ISO SQL 标准的 DBMS 无法返回空字符串。 YES = 列可以包含 NULL。 NO = 列不能包含 NULL。 如果不知道是否可以为空，该列则返回零长度字符串。 该列返回的值与 NULLABLE 列返回的值不同。
SS_DATA_TYPE | tinyint | SQL Server 数据类型，由开放式数据服务扩展存储过程使用。有关更多信息，请参见数据类型。

  1. 有关更多信息，请参见 Microsoft ODBC 文档。
注释

通过查询对应于 table_server 的 OLE DB 提供程序的IDBSchemaRowset 接口的 COLUMNS 行集执行 sp_columns_ex。table_name、table_schema、table_catalog 和 column 参数传递到此接口，用以限制返回的行。

如果指定链接服务器的 OLE DB 提供程序不支持 IDBSchemaRowset 接口的 COLUMNS 行集，sp_columns_ex 将返回空结果集。

权限

执行权限默认赋予 public 角色。

示例

下面的示例返回 titles 表的 title_id 列的数据类型。

USE master
EXEC sp_columns_ex 'LONDON1', 'titles', 'dbo', 'pubs',
   'title_id'

请参见

sp_catalogs

sp_foreignkeys

sp_indexes

sp_linkedservers

sp_primarykeys

sp_tables_ex

sp_table_privileges

系统存储过程


sp_configure

显示或更改当前服务器的全局配置设置。

语法

sp_configure [ [ @configname = ] 'name' ]
[ , [ @configvalue = ] 'value' ]

参数

[@configname =] 'name'

配置选项的名称。name 的数据类型为 varchar(35)，默认值为 NULL。Microsoft® SQL Server™ 理解作为配置名称一部分的任何独特的字符串。如果没有指定，则返回整个选项列表。

[@configvalue =] value

新的配置设置。value 的数据类型为 int，默认值为 NULL。

返回代码值

0（成功）或 1（失败）

结果集

如果不带参数执行，sp_configure 返回的结果集有五列，按字母升序排列选项。config_value 和 run_value 不需要相等。例如，系统管理员可能已经使用 sp_configure 更改某个选项，但尚未执行 RECONFIGURE 语句（对于动态选项）或重新启动 SQL Server（对于非动态选项）。

列名 | 数据类型 | 描述
name | nvarchar(70) | 配置选项的名称。
minimum | int | 配置选项的最小值。
maximum | int | 配置选项的最大值。
config_value | int | 通过 sp_configure 设置的配置选项值（sysconfigures.value 中的值）。
run_value | int | 配置选项的值（syscurconfigs.value 中的值）。

注释

sp_configure 支持的某些选项指派为"高级"。默认情况下，无法查看和更改这些选项；将 Show Advanced Options 配置选项设为 1，则这些选项可用。有关可用配置选项及其设置的更多信息，请参见设置配置选项。

使用 sp_configure 更改设置时，请使用 RECONFIGURE WITH OVERRIDE 语句使更改立即生效。否则，更改将在 SQL Server 重新启动后生效。

说明 SQL Server 中最小和最大的内存配置是动态的。不必重新启动服务器即可更改。

使用 sp_configure 显示或更改服务器级的设置。使用 sp_dboption 更改服务器级的设置，使用 SET 语句更改只影响当前用户会话的设置。

说明 如果对选项指定的 config_value 值过高，run_value 设置将反映这样的事实：SQL Server 使用默认的动态内存而不使用无效设置。

权限

在 sp_configure 上没有参数（或只有第一个参数）的执行许可权限默认授予所有用户。有两个参数的 sp_configure（用于更改配置选项）的执行许可权限默认授予 sysadmin 和 serveradmin 固定服务器角色。RECONFIGURE 权限默认授予 sysadmin 固定服务器角色和 serveradmin 固定服务器角色，并且不能传输。

示例
A. 列出高级配置选项

下面的示例显示如何设置并列出所有的配置选项。若要显示高级配置选项，请先将 show advanced option 设为 1。更改后，执行不带参数的 sp_configure 可以显示所有的配置选项。

USE master
EXEC sp_configure 'show advanced option', '1'

--Here is the message:
Configuration option 'show advanced options' changed from 0 to 1.
Run the RECONFIGURE command to install.

RECONFIGURE
EXEC sp_configure
B. 更改配置选项

下面的示例将系统恢复间歇设为 3 分钟。

USE master0
EXEC sp_configure 'recovery interval', '3'
RECONFIGURE WITH OVERRIDE

请参见

RECONFIGURE

SET

sp_dboption

系统存储过程


sp_create_log_shipping_monitor_account

在监视服务器上创建 log_shipping_monitor_probe 登录，并对 msdb.dbo.log_shipping_primaries 和 msdb.dbo.log_shipping_secondaries 表指派更新权限。

语法

sp_create_log_shipping_monitor_account [ @password = ] 'password'

参数

[@password =] 'password''

log_shipping_monitor_probe 帐户的密码。password 的数据类型为 sysname，默认值为 NULL。

返回代码值

0（成功）或 1（失败）

注释

备份、复制或恢复事务日志后，主服务器和辅助服务器使用 log_shipping_monitor_probe 帐户更新 msdb.dbo.log_shipping_primaries 和 msdb.dbo.log_shipping_secondaries 表。

权限

只有 sysadmin 固定服务器角色的成员才能执行 sp_create_log_shipping_monitor_account。

示例

下面的示例创建密码为"Pwrdx!5"的日志传送监视器帐户。

EXEC   sp_create_log_shipping_monitor_account @password = N'Pwrdx!5'


sp_create_removable

创建可移动介质数据库。创建三个或更多文件（一个用于系统目录表，一个用于事务日志，一个或多个用于数据表）并将数据库放在这些文件上。

语法

sp_create_removable [ @dbname = ] 'dbname'
, [ @syslogical = ] 'syslogical'
, [ @sysphysical = ] 'sysphysical'
, [ @syssize = ] syssize
, [ @loglogical = ] 'loglogical'
, [ @logphysical = ] 'logphysical'
, [ @logsize = ] logsize
, [ @datalogical1 = ] 'datalogical1'
, [ @dataphysical1 = ] 'dataphysical1'
, [ @datasize1 = ] datasize1
, [ @datalogical16 = ] 'datalogical16'
, [ @dataphysical16 = ] 'dataphysical16'
, [ @datasize16 = ] datasize16 ]

参数

[@dbname =] 'dbname'

在可移动介质上使用而创建的数据库的名称。dbname 的数据类型为 sysname。

[@syslogical =] 'syslogical'

包含系统目录表的文件的逻辑名。syslogical 的数据类型为 sysname。

[@sysphysical =] 'sysphysical'

包含系统目录表的文件的物理名（包括完全合法的路径）。sysphysical 的数据类型为 nvarchar(260)。

[@syssize =] syssize

包含系统目录表的文件的大小（以 MB 计）。syssize 的数据类型为 int。syssize 的最小值为 1。

[@loglogical =] 'loglogical'

包含事务日志的文件的逻辑名。loglogical 的数据类型为 sysname。

[@logphysical =] 'logphysical'

包含事务日志的文件的物理名（包括完全合法的路径）。logphysical 的数据类型为 nvarchar(260)。

[@logsize =] logsize

包含事务日志的文件的大小（以 MB 计）。logsize 的数据类型为 int。logsize 的最小值为 1。

[@datalogical1 =] 'datalogical'

包含数据表的文件的逻辑名。datalogical 的数据类型为 sysname。

必须有 1 到 16 个数据文件。通常，如果预计数据库很大，必须分布在多个磁盘上，则创建多个数据文件。

[@dataphysical1 =] 'dataphysical'

包含数据表的文件的物理名（包括完全合法的路径）。dataphysical 的数据类型为 nvarchar(260)。

[@datasize1 =] 'datasize'

包含数据表的文件的大小（以 MB 计）。datasize 的数据类型为 int。datasize 的最小值为 1。

返回代码值

0（成功）或 1（失败）

结果集

无

注释

如果要在可移动媒体（如光盘）上制作数据库的复本，并将该数据库分发给其他用户，则使用此存储过程。

权限

只有 sysadmin 固定服务器角色的成员才能执行 sp_create_removable。

示例

下面的示例创建数据库 inventory 作为可移动数据库。

sp_create_removable 'inventory',
   'invsys',
   'c:\Program Files\Microsoft SQLServer\MSSQL\Data\invsys.mdf', 2,
   'invlog',
   'c:\Program Files\Microsoft SQLServer\MSSQL\Data\invlog.ldf', 4,
   'invdata',
   'c:\Program Files\Microsoft SQLServer\MSSQL\Data\invdata.ndf', 10

请参见

sp_attach_db

sp_attach_single_file_db

sp_certify_removable

sp_dboption

sp_dbremove

sp_detach_db

sp_helpfile

sp_helpfilegroup

系统存储过程


sp_createstats

为当前数据库中全部用户表的所有合格列创建单列统计。新的统计与创建统计所在的列同名。不能将计算列和 ntext、text 或 image 数据类型的列指定为统计列。不能涉及已经有统计的列（例如，索引的第一列或显式创建统计的列。）。对每个符合上述限制的列执行 CREATE STATISTICS 语句。如果指定 fullscan，则执行 FULLSCAN。

语法

sp_createstats [ [ @indexonly = ] 'indexonly' ]
[ , [ @fullscan = ] 'fullscan' ]
[ , [ @norecompute = ] 'norecompute' ]

参数

[@indexonly =] 'indexonly'

指定只有参与索引的列才考虑创建统计。indexonly 的数据类型为 char(9)，默认值为 NO。

[@fullscan =] 'fullscan'

指定 FULLSCAN 选项与 CREATE STATISTICS 语句一同使用。如果省去 fullscan，则 Microsoft® SQL Server™ 执行一个默认的实例扫描。fullscan 的数据类型为 char(9)，默认值为 NO。

[@norecompute =] 'norecompute'

指定对新创建的统计禁用自动重新计算统计。norecompute 的数据类型为 char(12)，默认值为 NO。

返回代码值

0（成功）或 1（失败）

结果集

无

权限

权限默认授予 sysadmin 固定服务器角色和 db_owner 固定服务器角色的成员以及对象的所有者。

示例

下面的示例为当前数据库中全部用户表的所有合格列创建统计。

EXEC sp_createstats

下面的示例只为参与索引的列创建统计。

EXEC sp_createstats 'indexonly'

请参见

CREATE STATISTICS

DBCC SHOW_STATISTICS

DROP STATISTICS

系统存储过程

UPDATE STATISTICS


sp_cursor_list

报告当前为连接打开的服务器游标的特性。

语法

sp_cursor_list [ @cursor_return = ] cursor_variable_name OUTPUT
, [ @cursor_scope = ] cursor_scope

参数

[@cursor_return =] cursor_variable_name OUTPUT

声明的游标变量的名称。cursor_variable_name 的数据类型为 cursor，没有默认值。游标是可滚动的、动态的只读游标。

[@cursor_scope =] cursor_scope

指定要报告的游标级别。cursor_scope 的数据类型为 int，没有默认值，可以是下列值中的一个。

值 | 描述
1 | 报告所有本地游标。
2 | 报告所有全局游标。
3 | 报告本地游标和全局游标。

返回代码值

无

返回的游标

sp_cursor_list 返回的报告是 Transact-SQL 游标输出参数，而不是结果集。这样，Transact-SQL 批处理、存储过程和触发器就得以按一次一行的方式处理输出。这还意味着无法直接从数据库 API 函数调用该过程。游标输出参数必须绑定到程序变量，但是数据库 API 不支持绑定游标参数或变量。

以下是 sp_cursor_list 返回的游标格式。游标格式与 sp_describe_cursor 返回的格式相同。

列名 | 数据类型 | 描述
reference_name | sysname | 用来引用游标的名称。如果通过 DECLARE CURSOR 语句中给定的名称引用游标，则引用名称与游标名称相同。如果通过变量引用游标，则引用名称即为游标变量的名称。
cursor_name | sysname | 来自 DECLARE CURSOR 语句的游标名称。如果游标是通过将游标变量设置为游标而创建的，则游标名称为系统生成的名称。
cursor_scope | smallint | 1 = LOCAL 2 = GLOBAL
status | smallint | 与 CURSOR_STATUS 系统函数报告的值相同： 1 = 游标名称或变量引用的游标打开。如果游标为不感知游标、静态游标或键集游标，则至少包含一行。如果游标是动态游标，则结果集包含零行或更多的行。 0 = 游标名称或变量引用的游标打开但是没有行。动态游标不会返回此值。 -1 = 游标名称或变量引用的游标关闭。 -2 = 只适用于游标变量。没有给变量指派游标。很可能 OUTPUT 参数给变量指派了游标，但存储过程在返回前关闭了此游标。 -3 = 指定名称的游标或游标变量不存在，或尚未给游标变量分配游标。
model | smallint | 1 = 不感知（或静态） 2 = 键集 3 = 动态 4 = 快进
concurrency | smallint | 1 = 只读 2 = 滚动锁 3 = 乐观
scrollable | smallint | 0 = 只进 1 = 可滚动
open_status | smallint | 0 = 关闭 1 = 打开
cursor_rows | int | 结果集中合格的行数。有关更多信息，请参见 @@CURSOR_ROWS。
fetch_status | smallint | 此游标上次提取的状态。有关更多信息，请参见 @@FETCH_STATUS。 0 = 提取成功。 -1 = 提取失败或超过游标的界限。 -2 = 请求的行丢失。 -9 = 游标上没有提取。
column_count | smallint | 游标结果集中的列数。
row_count | smallint | 上次对游标的操作所影响的行数。有关更多信息，请参见 @@ROWCOUNT。
last_operation | smallint | 上次对游标执行的操作： 0 = 没有对游标执行操作。 1 = OPEN 2 = FETCH 3 = INSERT 4 = UPDATE 5 = DELETE 6 = CLOSE 7 = DEALLOCATE
cursor_handle | int | 在服务器范围内标识游标的唯一值。

注释

sp_cursor_list 生成连接打开的当前服务器游标列表，并描述每个游标的全局特性，例如游标的可滚动性和可更新性。sp_cursor_list 列出的游标包括：

  • Transact-SQL 服务器游标。

  • API 服务器游标，由 ODBC 应用程序打开，然后调用 SQLSetCursorName 给游标命名。

使用 sp_describe_cursor_columns 描述由游标返回的结果集的特性。使用 sp_describe_cursor_tables 报告游标引用的基表。sp_describe_cursor 与 sp_cursor_list 报告的信息相同，但前者只适用于指定的游标。

权限

执行权限默认授予 public 角色。

示例

下面的示例打开一个全局游标，并使用 sp_cursor_list 报告游标的特性。

USE Northwind
GO
-- Declare and open a keyset-driven cursor.
DECLARE abc CURSOR KEYSET FOR
SELECT LastName
FROM Employees
WHERE LastName LIKE 'S%'
OPEN abc

-- Declare a cursor variable to hold the cursor output variable
-- from sp_cursor_list.
DECLARE @Report CURSOR

-- Execute sp_cursor_list into the cursor variable.
EXEC master.dbo.sp_cursor_list @cursor_return = @Report OUTPUT,
      @cursor_scope = 2

-- Fetch all the rows from the sp_cursor_list output cursor.
FETCH NEXT from @Report
WHILE (@@FETCH_STATUS <> -1)
BEGIN
   FETCH NEXT from @Report
END

-- Close and deallocate the cursor from sp_cursor_list.
CLOSE @Report
DEALLOCATE @Report
GO

-- Close and deallocate the original cursor.
CLOSE abc
DEALLOCATE abc
GO

请参见

系统存储过程


sp_cycle_errorlog

关闭当前的错误日志文件，并循环错误日志扩展编号（就像重新启动服务器）。新错误日志包含版本和版权信息，以及表明新日志已创建的一行。

语法

sp_cycle_errorlog

返回代码值

0（成功）或 1（失败）

结果集

无

注释

每次启动 SQL Server 时，当前错误日志重新命名为 errorlog.1；errorlog.1 成为 errorlog.2，errorlog.2 成为 errorlog.3，依次类推。sp_cycle_errorlog 使您得以循环错误日志文件，而不必停止而后再启动服务器。

权限

sp_cycle_errorlog 的执行许可权限仅限于 sysadmin 固定服务器角色的成员。

示例
EXEC sp_cycle_errorlog

请参见

系统存储过程

查看 SQL Server 错误日志


sp_databases

列出驻留在 Microsoft® SQL Server™ 实例中的数据库或可以通过数据库网关访问的数据库。

语法

sp_databases

返回代码值

无

结果集
列名 | 数据类型 | 描述
DATABASE_NAME | sysname | 数据库的名称。在 SQL Server 中，此列代表存储在 sysdatabases 系统表中的数据库的名称。
DATABASE_SIZE | int | 数据库的大小（以 KB 计）。
REMARKS | varchar(254) | 对于 SQL Server，该字段的返回值为 NULL。

注释

在 SQL Server 中，sp_databases 返回在 sysdatabases 系统表中列出的数据库。由于数据库网关所访问的一些数据库管理系统 (DBMS) 没有数据库概念，所以如果发送到基于 Microsoft 开放式数据服务的网关，该存储过程可能不返回任何行。

所返回的数据库名称可以作为 USE 语句的参数，用来更改当前数据库上下文。

sp_databases 在开放式数据库连接 (ODBC) 中没有等价的过程。

权限

执行权限默认授予 public 角色。


sp_datatype_info

返回有关当前环境所支持的数据类型的信息。

语法

sp_datatype_info [ [ @data_type = ] data_type ]
[ , [ @ODBCVer = ] odbc_version ]

参数

[@data_type =] data_type

指定数据类型的代码。要获取所有数据类型的列表，请省略该参数。data_type 的数据类型为 int，默认值为 0。

[@ODBCVer =] odbc_version

所用 ODBC 的版本。odbc_version 的数据类型为 tinyint，默认值为 2。

返回代码值

无

结果集
列名 | 数据类型 | 描述
TYPE_NAME | sysname | 与 DBMS 相关的数据类型。
DATA_TYPE | smallint | 此类型的所有列所映射的 ODBC 类型代码。
PRECISION | int | 数据源中数据类型的最大精度。数据类型的精度不适用时返回 NULL。PRECISION 列的返回值以 10 为基数。
LITERAL_PREFIX | varchar(32) | 常量前使用的字符。例如，在 Microsoft® SQL Server™ 中，字符类型使用单引号 (')，二进制使用 Ox。
LITERAL_SUFFIX | varchar(32) | 终止常量时使用的字符。例如，字符类型使用单引号 (')，二进制不使用任何字符。
CREATE_PARAMS | varchar(32) | 此数据类型的创建参数的描述。例如，decimal 是"precision, scale"，float 是 NULL，varchar 是"max_length"。
NULLABLE | smallint | 指定是否可以为空。 1 = 允许空值。 0 = 不允许空值。
CASE_SENSITIVE | smallint | 指定是否区分大小写。 1 = 此类型的所有列都区分大小写（用于排序规则）。 0 = 此类型的所有列都不区分大小写。
SEARCHABLE | smallint | 列的类型。 1 = 此类型的列可以用于 WHERE 子句中。 0 = 此类型的列不能用于 WHERE 子句中。
UNSIGNED_ATTRIBUTE | smallint | 指定数据类型的符号。 1 = 数据类型没有符号。 0 = 数据类型有符号。
MONEY | smallint | 指定 money 数据类型。 1 = money 数据类型。 0 = 非 money 数据类型。
AUTO_INCREMENT | smallint | 指定自动增量。 1 = 自动增量。 0 = 不自动增量。 NULL = 属性不适用。 应用程序可以将值插入具有此属性的列中，但不能更新列中的值。AUTO_INCREMENT 仅对分类数据类型有效。
LOCAL_TYPE_NAME | sysname | 与数据源相关的数据类型名称的本地化版本。例如，DECIMAL 的法语版本是 DECIMALE。如果是数据源不支持的本地化名称，则返回 NULL。
MINIMUM_SCALE | smallint | 数据源中数据类型的最小小数位数。如果数据源的小数位数固定，则 MINIMUM_SCALE 和 MAXIMUM_SCALE 列将同时包含此值。当小数位数不适用时，将返回 NULL。
MAXIMUM_SCALE | smallint | 数据源中数据类型的最大小数位数。如果在数据源中没有单独定义最大小数位数，而是将其定义为与最大精度相同，则此列的值与 PRECISION 列的值相同。
SQL_DATA_TYPE | smallint | SQL 数据类型出现在描述符的 TYPE 字段中时的值。此列与 DATA_TYPE 列相同（除 datetime 和 ANSI interval 数据类型以外）。该字段始终返回值。
SQL_DATETIME_SUB | smallint | 如果 SQL_DATA_TYPE 的值为 SQL_DATETIME 或 SQL_INTERVAL，则此字段为 datetime 或 ANSI interval 子代码。对于非 datetime 和非 ANSI interval 的数据类型，此字段为 NULL。
NUM_PREC_RADIX | int | 计算一个列所能容纳的最大数时所采用的位数或数字个数。如果是近似数字数据类型，则此列包含的值为 2，表明位数。对于精确数字数据类型，此列包含的值为 10，表明十进制数字的个数。否则此列为 NULL。通过将精度和基数相结合，应用程序可以计算出列所能容纳的最大数。
INTERVAL_PRECISION | smallint | 如果 data_type 为 interval，则为间隔起始精度的值；否则，为 NULL。
USERTYPE | smallint | 来自 systypes 表的 usertype 值。

注释

sp_datatype_info 等价于 ODBC 中的 SQLGetTypeInfo。返回结果按 DATA_TYPE 排序，再按数据类型映射为相应 ODBC SQL 数据类型的紧密程度进行排序。

权限

执行权限默认授予 public 角色。

示例

下面的示例通过将 DATA_TYPE 的值指定为 –9，检索 sysname 和 nvarchar 数据类型的信息。

USE master
EXEC sp_datatype_info -9

请参见

数据类型

系统存储过程


sp_dbcmptlevel

将某些数据库行为设置为与指定的 Microsoft® SQL Server™ 的早期版本兼容。

语法

sp_dbcmptlevel [ [ @dbname = ] name ]
[ , [ @new_cmptlevel = ] version ]

参数

[@name =] name

数据库的名称，将对此数据库的兼容级别进行更改。数据库的名称必须遵循标识符的规则。name 的数据类型为 sysname，默认值为 NULL。

[@new_cmptlevel =] version

数据库要兼容的 SQL Server 版本。version 的数据类型为 tinyint，默认值为 NULL。该值必须为 80、70、65 或 60。

说明 70 和 80 两个级别间的唯一区别是，级别 70 不支持 SQL Server 2000 中引入的一些保留关键字。

返回代码值

0（成功）或 1（失败）

结果集

如果没有指定参数或没有指定 name 参数，sp_dbcmptlevel 将返回下面的消息：

Valid values of database compatibility level are 60, 65, 70, or 80.

如果指定了 version 而没有指定 name，SQL Server 将显示一条有关该数据库的兼容性设置的消息。

注释

在 SQL Server 2000 中，master 数据库的兼容级别为 80，此级别不能改变。

对于安装 SQL Server 2000 的所有实例，所有数据库的默认级别为 80。对于从 SQL Server 7.0 升级到 SQL Server 2000，所有数据库的默认级别为 80。对于从 SQL Server 6.5 和 SQL Server 6.0 升级到 SQL Server 2000，保持现有默认兼容级别。

用 sp_dbcmptlevel 提供临时迁移帮助。由 sp_dbcmptlevel 的兼容级别设置控制的 SQL Server 7.0 版或 SQL Server 2000 行为中的不同如果影响了现有 SQL Server 6.x 版应用程序，请使用此过程设置早期版本行为，直到能够用 SQL Server 2000 兼容级别将该应用程序转变为正常运行为止。sp_dbcmptlevel 不能还复完全向后兼容。

sp_dbcmptlevel 将影响指定数据库的行为，但不会影响整个服务器。当在 USE 语句中将数据库作为当前数据库，或者当数据库作为登录的默认数据库时，数据库的兼容性设置将生效。当执行存储过程时，将使用在其中定义过程的数据库的当前兼容性级别。当此数据库中的兼容性设置更改时，所有存储过程将重新编译。

将兼容性级别设置为 65 或 60 将影响这些行为。有关向后兼容行为的更多信息，请参见 SQL Server 向后兼容性详细信息。

兼容性级别设置为
60 或 65 		兼容级别设置为 70 或 80（默认值）
带 GROUP BY 子句但不带 ORDER BY 子句的 SELECT 语句的结果集，将由 GROUP BY 列排序。 | GROUP BY 子句本身没有排序功能。必须显式指定 ORDER BY 子句，SQL Server 才能对结果集进行排序。有关更多信息，请参见 SELECT。
UPDATE 语句的 SET 子句接受以表的别名作为前缀的列。 | 在 UPDATE 语句的 SET 子句中，不接受表的别名。在 SET 子句中指定的表或视图必须与指定的紧跟在 UPDATE 关键字后的表或视图相匹配。有关更多信息，请参见UPDATE。
在创建 bit 列时，如果在 CREATE TABLE 或 ALTER TABLE 中没有显式地指定 NULL 或 NOT NULL 选项，则 bit 列将按 NOT NULL 创建。 | 如果没有显式地指定，则 bit 列的为空性由 SET ANSI_NULL_DFLT_ON 或 SET ANSI_NULL_DFLT_OFF 的会话设置决定，或者由数据库设置 SET ANSI NULL DEFAULT 决定。有关更多信息，请参见SET。
ALTER COLUMN 子句无法在 ALTER TABLE 上使用。 | ALTER COLUMN 子句可在 ALTER TABLE 上使用。有关更多信息，请参见 ALTER TABLE。
为表创建的触发器将替换同一类型的任何现有触发器 (INSERT、UPDATE、DELETE)。可以使用 CREATE TRIGGER 的 WITH APPEND 选项创建同一类型的多个触发器。 | 可以附加相同类型的触发器。触发器的名称必须唯一。假定已经使用了 WITH APPEND 选项。有关更多信息，请参见 CREATE TRIGGER。
如果批处理或过程包含无效的对象名，则当分析或编译批处理时，将返回警告消息，并且在执行批处理时，将返回错误信息。 | 当分析或编译批处理时，不会返回警告消息。当执行批处理时，将返回错误信息。有关延迟的名称解析的更多信息，请参见CREATE PROCEDURE（级别 4）。
通过忽略表 Y 并将 SELECT 语句结果插入表 X，下面形式的查询可以正确执行。
INSERT X
SELECT select_list INTO Y
 当执行此查询时，SQL Server 将返回语法错误。
空字符串文字 (' ') 将作为一个空格解释。 | 空字符串文字 (' ') 将作为空字符串解释。
DATALENGTH('') 返回 1（将 '' 解释为一个空格）。
DATALENGTH(N'') 返回 2（将 N'' 解释为一个 Unicode 空格）。
当 m = 0 时，LEFT('123', m) 返回 NULL。

当 m = 0 时，LEFT(N'123', m) 返回 NULL。
LTRIM(' ') 返回NULL。
LTRIM(N' ') 返回 NULL。
当 m = 0 时，REPLICATE('123', m) 返回 NULL。
当 m = 0 时，REPLICATE(N'123', m) 返回 NULL。
当 m = 0 时，RIGHT(N'123', m) 返回 NULL。
当 m = 0 时，RIGHT('123', m) 返回 NULL。
当 m 为负数时，RIGHT('123', m) 返回 NULL。
当 m 为负数时，RIGHT(N'123', m) 返回 NULL。
RTRIM(' ') 返回 NULL。
RTRIM(N' ') 返回 NULL。
SPACE(0) 返回 NULL。
当 m 小于字符串长度或者当 n = 0 时，SUBSTRING('123', m, n) 返回 NULL。
当 m 大于字符串的长度或者当 n = 0 时，SUBSTRING(N'123', m, n) 返回 NULL。
UPDATETEXT table.textcolumn textpointer > 0 NULL NULL 导致 NULL 值。 		DATALENGTH('') 返回 0。

DATALENGTH(N'') 返回 0。

当 m = 0 时，LEFT('123', m) 返回空字符串。
当 m = 0 时，LEFT(N'123', m) 返回空字符串。
LTRIM(' ') 返回空字符串。
LTRIM(N' ') 返回空字符串。
当 m = 0 时，REPLICATE('123', m) 返回空字符串。
当 m = 0 时，REPLICATE(N'123', m) 返回空字符串。
当 m = 0 时，RIGHT('123', m) 返回空字符串。
当 m = 0 时，RIGHT(N'123', m) 返回空字符串。

当 m 是负数时，RIGHT('123', m) 返回空字符串。

当 m 为负数时，RIGHT(N'123', m) 返回错误信息。
RTRIM(' ') 返回空字符串。
RTRIM(N' ') 返回空字符串。
SPACE(0) 返回空字符串。
当 m 小于字符串的长度或者当 n = 0 时，SUBSTRING('123', m, n) 返回空字符串。
当 m 大于字符串的长度或者当 n = 0 时，SUBSTRING(N'123', m, n) 返回空字符串。
UPDATETEXT table.textcolumn textpointer > 0 NULL NULL 导致空文本。
仅当模式和表达式同时为空时，CHARINDEX 和 PATINDEX 函数才返回空。 | 当任何输入参数为 NULL 时，CHARINDEX 和 PATINDEX 函数将返回 NULL。
引用 inserted 和 deleted 表中的 text 或 image 列时，将显示为 NULL。 | 不允许引用 inserted 和 deleted 表中的 text 或 image 列。
允许 UPDATETEXT 将 text 列初始化为 NULL。 | UPDATETEXT 将 text 列初始化为空字符串。WRITETEXT 将 text 列初始化为 NULL。
如果 sp_dboption 的设置选项 concatenation of null yields null 处于关闭状态（禁用），则当串联操作中的任何操作数为空时返回空字符串。 | 如果 sp_dboption 的设置选项 concatenation of null yields null 处于打开状态（启用），则当串联操作中的任何操作数为空时返回 NULL。
在 INSERT 语句中，允许在 VALUES 子句中使用可以返回标量值的 SELECT。 | INSERT 语句不能在 VALUES 子句中将 SELECT 语句用作插入值之一。
由 INSERT table EXEC procedure 语句引用的存储过程中的 ROLLBACK 语句将导致 INSERT 回滚，但批处理继续执行 | 由 INSERT...EXEC 子句引用的存储过程中的 ROLLBACK 语句将导致整个事务回滚，并使批处理终止执行。
在触发器中检索 inserted 或 deleted 表的 text 或 image 列，将返回 text 或 image 列的 NULL值。 | 不允许在触发器中检索 inserted 或 deleted 表的 text 或 image 列，否则将出错。

兼容性级别对保留关键字也有影响。下表显示在指定级别上为保留关键字而用在较低级别的对象名中仍有效的单词。在较低兼容性级别上，与较高级别保留关键字对应的语言功能将失效。

兼容性级别 | 保留关键字
80 | COLLATE、FUNCTION、OPENXML
70 | BACKUP、CONTAINS、CONTAINSTABLE、DENY、FREETEXT、FREETEXTTABLE、PERCENT、RESTORE、ROWGUIDCOL、TOP
65 | AUTHORIZATION、CASCADE、CROSS、DISTRIBUTED、ESCAPE、FULL、INNER、JOIN、LEFT、OUTER、PRIVILEGES、RESTRICT、RIGHT、SCHEMA、WORK

无法在 master 数据库中更改兼容性级别设置，但是可以在 model 数据库中对此进行更改，以使其在所有新建的数据库中生效。无法在存储过程内部或 EXEC('string') 语法执行的 Transact-SQL 字符串中更改兼容性级别。无法在 Transact-SQL 语句的批处理中更改兼容性级别。

权限

只有 DBO、sysadmin 固定服务器角色成员、db_owner 固定数据库角色成员（如果即将改变兼容级别的数据库是当前数据库）才能执行此过程。

示例

此示例通过将 pubs 数据库的兼容级别设置为 60 来创建名为 distributed 的过程，distributed 是 SQL Server 保留关键字。

CREATE PROCEDURE distributed
AS
PRINT 'This won't happen'

EXEC sp_dbcmptlevel 'pubs', 60

CREATE PROCEDURE distributed
AS
PRINT 'You are in a procedure that could not be defined'
PRINT 'in a version of SQL Server 6.5 or later'
PRINT 'without the compatibility setting.'

EXEC distributed

下面是结果集：

Msg 156, Level 15, State 1
Incorrect syntax near the keyword 'distributed'.
DBCC execution completed. If DBCC printed error messages, see your System Administrator.
You are in a procedure that could not be defined
in a version of SQL Server 6.5 or greater
without the compatibility setting.

请参见

EXECUTE

保留关键字

设置数据库选项

sp_dboption

SQL Server 向后兼容性详细信息

系统存储过程

使用标识符


sp_dbfixedrolepermission

显示每个固定数据库角色的权限。

语法

sp_dbfixedrolepermission [ [ @rolename = ] 'role' ]

参数

[@rolename =] 'role'

是有效的 Microsoft® SQL Server™ 固定数据库角色的名称。role 的数据类型为 sysname，默认设置为 NULL。如果没有指定 role，将显示所有固定数据库角色的权限。

返回代码值

0（成功）或 1（失败）

结果集
列名 | 数据类型 | 描述
DbFixedRole | sysname | 固定数据库角色的名称
Permission | nvarchar(70) | 与 DbFixedRole 相关的权限

注释

要显示固定数据库角色列表，请执行 sp_helpdbfixedrole。下面是固定数据库角色。

固定数据库角色 | 描述
db_owner | 数据库所有者
db_accessadmin | 数据库访问管理员
db_securityadmin | 数据库安全管理员
db_ddladmin | 数据库 DDL 管理员
db_backupoperator | 数据库备份操作员
db_datareader | 数据库数据读取者
db_datawriter | 数据库数据写入者
db_denydatareader | 数据库拒绝数据读取者
db_denydatawriter | 数据库拒绝数据写入者

db_owner 固定数据库角色的权限可以涵盖所有其它固定数据库角色。若要显示固定服务器角色的权限，请执行 sp_srvrolepermission。

结果集中列出的权限包含可执行的 Transact-SQL 语句，以及可以由数据库角色执行的其它特殊活动。

权限

所有用户都具有执行 sp_dbfixedrolepermission 的权限。

示例

下面的示例显示所有固定数据库角色的权限。

EXEC sp_dbfixedrolepermission

请参见

sp_addrolemember

sp_droprolemember

sp_helpdbfixedrole

sp_srvrolepermission

系统存储过程


sp_dboption

显示或更改数据库选项。不能在 master 或 tempdb 数据库上使用 sp_dboption。向后兼容性支持 sp_dboption。使用 ALTER DATABASE 设置数据库选项。

语法

sp_dboption [ [ @dbname = ] 'database' ]
[ , [ @optname = ] 'option_name' ]
[ , [ @optvalue = ] 'value' ]

参数

[@dbname =] 'database'

在其中设置指定选项的数据库的名称。database 的数据类型为 sysname，默认值为 NULL。

[@optname =] 'option_name'

要设置的选项的名称。没有必要输入完整的选项名称。Microsoft® SQL Server™ 可识别名称中任何独有的部分。如果选项名称包含空格或者关键字，请将选项名称用引号引起来。如果省略此参数，sp_dboption 将列出处于打开状态的选项。option_name 的数据类型为 varchar(35)，默认值为 NULL。

[@value =] 'value'

option_name 的新设置。如果省略此参数，sp_dboption 将返回当前设置。value 可以是 true、false、on 或 off。value 的数据类型为 varchar(10)，默认值为 NULL。

返回代码值

0（成功）或 1（失败）

结果集

如果没有提供参数，则结果集如下。

列名 | 数据类型 | 描述
Settable database options | nvarchar(35) | 所有可设置的数据库选项。

如果 database 是唯一的参数，则结果集如下。

列名 | 数据类型 | 描述
The following options are set: | nvarchar(35) | 为数据库设置的选项。

如果提供 option_name，则结果集如下。

列名 | 数据类型 | 描述
OptionName | nvarchar(35) | 选项的名称。
CurrentSetting | char(3) | 选项是处于打开状态还是处于关闭状态。

如果提供 value，sp_dboption 将不返回结果集。

注释

下面是由 sp_dboption 设置的选项。有关每个选项的更多信息，请参见设置数据库选项。

选项 | 描述
auto create statistics | 当为 true 时，优化查询所需的任何缺少的统计将在优化过程中自动生成。有关更多信息，请参见 CREATE STATISTICS。
auto update statistics | 当为 true 时，优化查询所需的任何过期的统计将在优化过程中自动生成。有关更多信息，请参见 UPDATE STATISTICS。
autoclose | 当为 true 时，数据库完全关闭，其资源在最后一个用户注销后释放。
autoshrink | 当为 true 时，数据库文件将成为自动周期性收缩的候选文件。
ANSI null default | 当为 true 时，CREATE TABLE 遵循 SQL-92 规则以决定列是否允许为空值。
ANSI nulls | 当为 true 时，所有对空值的比较都取值 UNKNOWN。当为 false 时，如果都为 NULL，则对空值的非 UNICODE 值比较取值 TRUE。
ANSI warnings | 当为 true 时，如果出现诸如"被零除"情况，则发出错误或警告消息。
arithabort | 当为 true 时，溢出或被零除错误将导致查询或批处理终止。如果错误发生在事务内，则回滚事务。当为 false 时，将显示警告消息，但是继续执行查询、批处理或事务，就像没有出错一样。
concat null yields null | 当为 true 时，如果串联操作中任何一个操作数为 NULL，则结果为 NULL。
cursor close on commit | 当为 true 时，将关闭提交或回滚事务时所打开的任何游标。当为 false 时，提交事务时这些游标仍处于打开状态。当为 false 时，回滚事务时将关闭所有游标（除定义为 INSENSITIVE 或 STATIC 的游标）。
dbo use only | 当为 true 时，只有数据库所有者可以使用数据库。
default to local cursor | 当为 true 时，游标声明默认为 LOCAL。
merge publish | 当为 true 时，可以为合并复制发布数据库。
numeric roundabort | 当为 true 时，如果表达式中出现精度损失则生成错误。当为 false 时，精度损失不生成错误信息，并且将结果四舍五入为存储结果的列或变量的精度。
offline | 当为 true 时，数据库将处于脱机状态。
published | 当为 true 时，可以发布数据库用于复制目的。
quoted identifier | 当为 true 时，可以将分隔标识符包含在双引号中。
read only | 当为 true 时，用户仅能读取数据库中的数据而无法对其进行修改。若要为 read only 选项指定新的 value，则数据库不能处于使用状态。但 master 数据库例外，并且当正在设置 read only 选项时，只有系统管理员可以使用 master。
recursive triggers | 当为 true 时，启用触发器递归调用。当为 false 时，只防止直接递归。若要禁用间接递归，请使用 sp_configure 将 nested triggers 服务器选项设置为 0。
select into/bulkcopy | 当为 true 时，允许使用 SELECT INTO 语句和快速大容量复制。
single user | 当为 true 时，每次只能有一个用户访问数据库。
subscribed | 当为 true 时，可以为发布目的而订阅。
torn page detection | 当为 true 时，可以检测残缺页。
trunc. log on chkpt. | 当为 true 时，如果数据库处于日志截断模式，则检查点将截断日志中非活动的部分。只能为 master 数据库设置此选项。

通过在 model 数据库上执行 sp_dboption，数据库所有者或系统管理员可以设置或关闭所有新建数据库的特定数据库选项。

执行 sp_dboption 后，将在为之更改选项的数据库中执行检查点。这将使更改立即生效。

sp_dboption 更改数据库设置。使用 sp_configure 更改服务器级别设置，使用 SET 语句更改仅影响当前会话的设置。

权限

显示可能的数据库选项列表、数据库中当前设置的选项列表以及选项在数据库中的当前值（使用 sp_dboption 和 0、1 或 2 个参数）的执行权限默认授予所有用户。

更改选项（使用 sp_dboption 及全部参数）的执行权限默认授予 sysadmin、dbcreator 固定服务器角色成员以及 db_owner 固定数据库角色成员。这些权限是不可传递的。

示例
A. 将数据库设置为只读

下面的示例将 pubs 数据库设置为只读。

USE master
EXEC sp_dboption 'pubs', 'read only', 'TRUE'

下面是结果集：

CHECKPOINTing database that was changed.
B. 关闭选项

下面的示例将 pubs 数据库重新设置为可写。

USE master
EXEC sp_dboption 'pubs', 'read only', 'FALSE'

下面是结果集：

CHECKPOINTing database that was changed.
C. 使数据库脱机

下面的示例使数据库 sales 在没有用户访问时进入脱机状态。

USE master
EXEC sp_dboption 'sales', 'offline', 'TRUE'

下面是结果集：

CHECKPOINTing database that was changed.

请参见

ALTER DATABASE

SET

sp_configure

系统存储过程


sp_dbremove

删除数据库及其相关的所有文件。

重要 提供此过程只是为了向后兼容。对于可移动介质数据库，使用 sp_detach_db 删除服务器中的数据库。

语法

sp_dbremove [ @dbname = ] 'database'
[ , [ @dropdev = ] 'dropdev' ]

参数

[@dbname =] 'database'

要删除的数据库的名称。database 的数据类型为 sysname，默认值为 NULL。

[@dropdev =] 'dropdev'

提供该标志只是为了向后兼容，当前忽略此标志。dropdev 的值为 dropdev。

返回代码值

0（成功）或 1（失败）

结果集

无

权限

执行权限默认授予要删除的数据库的 sysadmin 固定服务器角色的成员。

示例

下面的示例删除数据库 sales 及其相关的所有文件。

sp_dbremove sales

请参见

ALTER DATABASE

CREATE DATABASE

DBCC

sp_detach_db


sp_defaultdb

更改登录的默认数据库。

语法

sp_defaultdb [ @loginame = ] 'login' ,
[ @defdb = ] 'database'

参数

[@loginame =] 'login'

是登录名。login 的数据类型为 sysname，没有默认值。login 可以是现有 Microsoft® SQL Server™ 登录或者是 Microsoft Windows NT® 用户或组。如果 SQL Server 上没有 Windows NT 用户或组，系统会自动添加。

[@defdb =] 'database'

新的默认数据库的名称。database 的数据类型为sysname，没有默认值。database 必须已经存在。

返回代码值

0（成功）或 1（失败）

注释

当客户端连接 SQL Server 时，如果没有显式使用 USE 语句，则为其登录定义的默认数据库将成为当前数据库。可以在 sp_addlogin 添加登录时定义默认数据库。当执行 sp_addlogin 时，如果没有指定数据库，则 master 数据库将成为默认数据库。

执行 sp_defaultdb 后，当用户下次登录时登录将连接到新数据库。但 sp_defaultdb 不能自动将数据库访问权授予登录。数据库所有者 (dbo) 必须通过 sp_grantdbaccess 将数据库访问权授予登录，或者该登录必须是一个在数据库中指定的 guest 用户。

推荐使用 sp_defaultdb 更改所有登录（而不是 sysadmin 固定数据库角色成员）的默认数据库。这将防止用户不经意间使用或创建 master 数据库中的对象。

在用户定义的事务中不能执行 sp_defaultdb。

权限

执行权限默认授予 public 角色，以便用户更改他们自己登录的默认数据库。只有 syadmin 或 securityadmin 固定服务器角色的成员可以为其它登录执行 sp_defaultdb。

示例

下面的示例将 pubs 设置为用户 Victoria 的默认数据库。

EXEC sp_defaultdb 'Victoria', 'pubs'

请参见

sp_addlogin

sp_droplogin

sp_grantdbaccess

系统存储过程

USE


sp_defaultlanguage

更改登录的默认语言。

语法

sp_defaultlanguage [ @loginame = ] 'login'
[ , [ @language = ] 'language' ]

参数

[@loginame =] 'login''

是登录名。login 的数据类型为 sysname，没有默认值。login 可以是现有 Microsoft® SQL Server™ 登录或者是 Microsoft Windows NT® 用户或组。如果 SQL Server 上没有 Windows NT 用户或组，系统会自动添加。

[@language =] 'language'

登录的默认语言。language 的数据类型为 sysname，没有默认值。language 必须是服务器上的有效语言。如果没有指定 language，就会将 language 设置为服务器默认语言；默认语言是由 sp_configure 配置变量 default language 定义的。更改服务器默认语言并不会更改现有登录的默认语言。执行 sp_defaultlanguage 时 language 仍保持为所用默认语言。

返回代码值

0（成功）或 1（失败）

注释

当登录初次添加到 SQL Server 时，可以使用 sp_defaultlanguage 或 sp_addlogin 设置默认语言。使用 sp_helplanguage 可显示有效的 language 选项的列表。

任何用户都可以使用 SET LANGUAGE 语句更改当前会话期间的语言设置。使用 @@LANGUAGE 函数显示当前语言设置。

如果从服务器上删除当前登录的默认语言，则服务器的默认语言将使用初始语言设置，并显示消息。

在用户定义的事务中不能执行 sp_defaultlanguage。

权限

执行权限默认授予 public 角色，以便用户更改其登录的默认语言。只有 syadmin 或 securityadmin 固定服务器角色的成员可以为其它登录执行 sp_defaultlanguage。

示例

下面的示例将登录 Claire 的默认语言设置为法语。

EXEC sp_defaultlanguage 'Claire', 'french'

请参见

@@LANGUAGE

SET

sp_addlogin

sp_helplanguage

系统存储过程


sp_define_log_shipping_monitor

在监视服务器上设置日志传送监视器帐户。

语法

sp_define_log_shipping_monitor [ @monitor_name = ] 'monitor_name' ,
[ @logon_type = ] logon_type
[ , [ @password = ] 'password' ]
[ , [ @delete_existing = ] delete_existing ]

参数

[@monitor_name =] 'monitor_name'

监视服务器的名称。monitor 的数据类型为 sysname，没有默认值。

[@logon_type =] logon_type

登录的类型，sqlmaint 将使用此登录连接监视服务器。logon_type 的数据类型为 int。有效值为 1 (Windows NT) 或 2 (SQL Server)。

[@password =] 'password'

log_shipping_monitor_probe 帐户的密码。password 的数据类型为 nvarchar(63)。如果登录类型为 1，则可以省略 password。

[@delete_existing =] delete_existing

指定是否从 log_shipping_monitor 表中删除现有行。值 1 表示删除现有行；值 0 表示不删除现有行。delete_existing 的数据类型为 bit，默认值为 0。

返回代码值

0（成功）或 1（失败）

注释

只能为每个主服务器或辅助服务器定义一个监视服务器。

权限

只有 sysadmin 固定服务器角色的成员才能执行 sp_define_log_shipping_monitor。


sp_delete_alert

删除警报。

语法

sp_delete_alert [ @name = ] 'name'

参数

[@name =] 'name'

警报的名称。name 的数据类型为 sysname，没有默认值。

返回代码值

0（成功）或 1（失败）

结果集

无

注释

删除警报将同时删除任何与警报相关的提示。

sp_delete_alert 必须在 msdb 数据库中执行。

权限

只有 sysadmin 固定服务器角色成员才能执行 sp_delete_alert。

示例

下面的示例删除警报 Test Alert。

sp_delete 'Test Alert'

请参见

sp_add_alert

sp_help_alert

系统存储过程


sp_delete_backuphistory

删除备份和还原历史记录表中所有早于 oldest_date 的备份集的项目。由于执行备份或还原操作时会在备份和还原历史记录表中添加行，sp_delete_backuphistory 可以用来减小 msdb 数据库中历史记录表的大小。

语法

sp_delete_backuphistory [ @oldest_date = ] 'oldest_date'

参数

[@oldest_date =] 'oldest_date'

保留在备份和还原历史记录表中的最早日期。oldest_date 的数据类型为 datetime，没有默认值。

返回代码值

0（成功）或 1（失败）

结果集

无

注释

必须在 msdb 数据库中运行 sp_delete_backuphistory。

权限

执行权限默认授予 sysadmin 固定服务器角色成员，但可以授权给其他用户。

示例

下面的示例删除备份和还原历史记录表中所有早于 1998 年 8 月 20 日上午 12:00 的项。

USE msdb
EXEC sp_delete_backuphistory '08/20/98'

请参见

BACKUP

backupfile

backupmediafamily

backupmediaset

backupset

DUMP

LOAD

RESTORE

restorefile

restorehistory

SQL Server:Buffer Manager 对象

SQL Server:Cache Manager 对象


sp_delete_category

从当前服务器中删除作业、警报或操作员的指定分类。

语法

sp_delete_category [ @class = ] 'class' ,
[ @name = ] 'name'

参数

[@class =] 'class'

分类的类。class 的数据类型为 varchar(8)，没有默认值，但必须具有下面的值之一。

值 | 描述
JOB | 删除作业分类。
ALERT | 删除警报分类。
OPERATOR | 删除操作员分类。

[@name =] 'name

要删除的分类的名称。name 的数据类型为 sysname，没有默认值。

返回代码值

0（成功）或 1（失败）

结果集

无

注释

必须在 msdb 数据库中执行 sp_delete_category。

删除分类会将此分类中的所有作业、警报或操作员重新分类为类的默认分类。

权限

只有 sysadmin 固定服务器角色或 db_owner 固定数据库角色的成员才能在当前数据库中执行或授权执行 sp_delete_category。

示例

下面的示例删除名为 AdminJobs 的作业分类。

USE msdb
EXEC sp_delete_category 'JOB', 'AdminJobs'

请参见

sp_add_category

sp_help_category

sp_update_category

系统存储过程


sp_delete_database_backuphistory

从备份历史记录表中删除有关指定数据库的信息。

语法

sp_delete_database_backuphistory [ @db_nm = ] 'database_name'

参数

[@db_nm =] database_name

指定备份和还原操作中涉及的数据库名称。database_name 的数据类型为 sysname，没有默认值。

返回代码值

0（成功）或 1（失败）

结果集

无

注释

sp_delete_database_backuphistory 从备份历史记录表中删除有关指定数据库的信息。

例如，在删除日志传送对后，可能需要删除过期或不相干的该对的成员数据库的备份和还原信息。为此，请在前主服务器和前辅助服务器上运行 sp_delete_database_backuphistory。

权限

只有 sysadmin 固定服务器角色成员才能执行 sp_change_secondary_role。

请参见

如何从日志传送监视器中删除日志传送对 (Transact-SQL)


sp_delete_job

删除作业。

语法

sp_delete_job [ @job_id = ] job_id | [ @job_name = ] 'job_name'
[ , [ @originating_server = ] 'server' ]

参数

[@job_id =] job_id

要删除的作业的标识号。job_id 的数据类型为 uniqueidentifier，默认值为 NULL。

[@job_name =] 'job_name'

要删除的作业的名称。job_name 的数据类型为 sysname，默认值为 NULL。

说明 必须指定 job_id 或 job_name，但不能两个都指定。

返回代码值

0（成功）或 1（失败）

结果集

无

注释

在 sp_delete_job 中有 @delete_history 和 @originating_server 两个参数，但这两个参数保留为内部使用。

SQL Server 企业管理器提供易于使用的图形方法来管理作业，建议使用该方法创建和管理作业基本结构。

权限

任何人都可以删除自己拥有的作业。只有 sysadmin 固定服务器角色成员才能执行 sp_delete_job 删除任何作业。

示例

下面的示例删除作业 Nightly Backups。

USE msdb
EXEC sp_delete_job @job_name = 'Nightly Backups'

请参见

sp_add_job

sp_help_job

sp_update_job

系统存储过程


sp_delete_jobschedule

从作业中删除调度。

语法

sp_delete_jobschedule [ @job_id = ] job_id , | [ @job_name = ] 'job_name' ,
[ @name = ] 'sched_job_name'

参数

[@job_id =] job_id

作业的标识号，将从此作业中删除调度。job_id 的数据类型为 uniqueidentifier，默认值为 NULL。

[@job_name =] 'job_name'

作业的名称，将从此作业中删除调度。job_name 的数据类型为 sysname，默认值为 NULL。

说明 必须指定 job_id 或 job_name，但不能两个都指定。

[@name =] 'sched_job_name'

要删除的调度的名称。Sched_job_name 的数据类型为 sysname，没有默认值。

返回代码值

0（成功）或 1（失败）

结果集

无

注释

从作业中删除调度将使 Microsoft® SQLServerAgent 不按此调度来执行该作业。sp_update_jobschedule 可用来禁用已调度的作业，而无须将其从调度中删除。

SQL Server 企业管理器提供易于使用的图形方法来管理作业，建议使用该方法创建和管理作业基本结构。

权限

执行权限默认授予 public 角色。

示例

下面的示例从数据库备份作业中删除调度 Nightly Backup。

USE msdb
EXEC sp_delete_jobschedule @job_name = N'Database Backup',
   @name = N'Nightly Backup'

请参见

修改和查看作业

sp_add_jobschedule

sp_help_jobschedule

sp_update_jobschedule

系统存储过程


sp_delete_jobserver

删除指定的目标服务器。

语法

sp_delete_jobserver [ @job_id = ] job_id , | [ @job_name = ] 'job_name' ,
[ @server_name = ] 'server'

参数

[@job_id =] job_id

作业的标识号，指定的目标服务器将从此作业中删除。job_id 的数据类型为 uniqueidentifier，默认值为 NULL。

[@job_name =] 'job_name'

作业的名称，指定目标服务器将从此作业中删除。job_name 的数据类型为 sysname，默认值为 NULL。

说明 必须指定 job_id 或 job_name，但不能两个都指定。

[@server_name =] 'server'

要从指定作业中删除的目标服务器的名称。server 的数据类型为 nvarchar(30)，没有默认值。server 可以是 (LOCAL) 或远程目标服务器的名称。

返回代码值

0（成功）或 1（失败）

结果集

无

权限

执行权限默认授予 public 角色。

示例

下面的示例从处理备份用户信息作业中删除 LONDON1 服务器。

说明 下面的示例假定备份用户信息作业已经创建。

USE msdb
EXEC sp_delete_jobserver
   @job_name = 'Backup Customer Information',
   @server_name = 'LONDON1'

请参见

sp_add_jobserver

sp_help_jobserver

系统存储过程


sp_delete_jobstep

从作业中删除作业步骤。

语法

sp_delete_jobstep [ @job_id = ] job_id , | [ @job_name = ] 'job_name' ,
[ @step_id = ] step_id

参数

[@job_id =] job_id

作业的标识号，步骤将从此作业中删除。job_id 的数据类型为 uniqueidentifier，默认值为 NULL。

[@job_name =] 'job_name'

作业的名称，步骤将从此作业中删除。job_name 的数据类型为 sysname，默认值为 NULL。

说明 必须指定 job_id 或 job_name，但不能两个都指定。

[@step_id =] step_id

要删除的步骤的标识号。step_id 的数据类型为 int，没有默认值。

返回代码值

0（成功）或 1（失败）

结果集

无

注释

删除作业步骤将自动更新与此步骤相关联的其它作业步骤。

有关与某一具体作业相关的步骤的更多信息，请运行 sp_help_jobstep。

Microsoft SQL Server 企业管理器提供易于使用的图形方法来管理作业，建议使用该方法创建和管理作业基本结构。

权限

执行权限默认授予 public 角色。

示例

下面的示例从作业 Nightly Backups 中删除作业步骤 1。

USE msdb
EXEC sp_delete_jobstep @job_name = 'Nightly Backups',
   @step_id = 1

请参见

修改和查看作业

sp_add_jobstep

sp_update_jobstep

sp_help_jobstep

系统存储过程


sp_delete_log_shipping_database

从主服务器的 log_shipping_databases 表中删除数据库。

语法

sp_delete_log_shipping_database [ @db_name = ] 'db_name'

参数

[@db_name =] 'db_name'

不再进行日志传送的数据库的名称。db_name 的数据类型为 sysname。

返回代码值

0（成功）或 1（失败）

注释

执行此存储过程表明数据库不再进行日志传送。此操作发生后，当备份此数据库的事务日志时，sqlmaint 将终止更新监视服务器。

权限

只有 sysadmin 固定服务器角色的成员才能执行 sp_delete_log_shipping_database。

示例

下面的示例假定已经通过执行 sp_add_log_shipping_database 添加了 pubs 数据库。

EXEC   msdb.dbo.sp_delete_log_shipping_database @db_name = N'pubs'


sp_delete_log_shipping_monitor_info

从日志传送监视器中删除日志传送对。

语法

sp_delete_log_shipping_monitor_info
[ @primary_server_name = ] 'primary_server_name' ,
[ @primary_database_name = ] 'primary_database_name' ,
[ @secondary_server_name = ] 'secondary_server_name' ,
[ @secondary_database_name = ] 'secondary_database_name'

参数

[@primary_server_name =] 'primary_server_name'

主服务器的名称。primary_server_name 的数据类型为 sysname。

[@primary_database_name =] 'primary_database_name'

主数据库的名称。primary_database_name 的数据类型为 sysname。

[@secondary_server_name =] 'secondary_server_name'

辅助服务器的名称。primary_server_name 的数据类型为 sysname。

[@secondary_database_name =] 'secondary_database_name'

辅助数据库的名称。primary_database_name 的数据类型为 sysname。

返回代码值

0（成功）或 1（失败）

注释

运行 sp_delete_log_shipping_monitor_info 通知监视服务器从监视器中删除日志传送对。此存储过程必须在作为监视器的 Microsoft® SQL Server™ 2000 实例上执行。

注意实际的日志传送对并未删除。该操作只影响监视器。

权限

只有 sysadmin 固定服务器角色成员才能执行 sp_delete_log_shipping_monitor_info。


sp_delete_log_shipping_plan

删除日志传送计划。

语法

sp_delete_log_shipping_plan [ @plan_id = ] plan_id |
[ @plan_name = ] 'plan_name'
[ , [ @del_plan_db = ] del_plan_db ]

参数

[@plan_id =] plan_id

要删除的计划的标识号。plan_id 的数据类型为 uniqueidentifier，默认值为 NULL。

[@plan_name =] 'plan_name'

要删除的计划的名称。Plan_name 的数据类型为 sysname，默认值为 NULL。

说明 必须指定 plan_id 或者 plan_name，但不能两者都指定。

[@del_plan_db =] del_plan_db

指定将删除属于此计划的 log_shipping_databases 表的所有行。del_plan_db 的数据类型为 bit，默认值为 0。

返回代码值

0（成功）或 1（失败）

注释

如果 log_shipping_databases 表中没有相应行，则 del_plan_db 必须设置为 1。否则存储过程将失败。

权限

只有 sysadmin 固定服务器角色的成员才能执行 sp_delete_log_shipping_plan。

示例

以下示例将删除计划"Pubs 数据库备份"及添加到该计划中的任何数据库。

EXEC   msdb.dbo.sp_delete_log_shipping_plan @plan_name = N'Pubs database backup', @del_plan_db = 1


sp_delete_log_shipping_plan_database

从日志传送计划中删除数据库。

语法

sp_delete_log_shipping_plan_database [ @plan_id = ] plan_id ,
[ @plan_name = ] 'plan_name' ,
[ @destination_database = ] 'destination_database'

参数

[@plan_id =] plan_id

数据库所在计划的标识号，plan_id 的数据类型为 uniqueidentifier，默认值为 NULL。

[@plan_name =] 'plan_name'

数据库所在计划的名称。Plan_name 的数据类型为 sysname，默认值为 NULL。

说明 必须指定 plan_id 或者 plan_name，但不能两者都指定。

[@destination_database =] 'destination_database

是要从计划中删除的数据库名称。destination_database 的数据类型为 sysname，默认值为 NULL。支持通配符模式匹配。

返回代码值

0（成功）或 1（失败）

注释

从 log_shipping_plan_databases 表中删除匹配数据库。

权限

只有 sysadmin 固定服务器角色的成员才能执行 sp_delete_log_shipping_plan。

示例

下面的示例从计划"Pubs database backup"中删除"pubs2"。

EXEC   msdb.dbo.sp_delete_log_shipping_plan_database @plan_name = N'Pubs database backup', @destination_database = N'pubs2'


sp_delete_log_shipping_primary

从 log_shipping_primaries 表中删除主服务器。

语法

sp_delete_log_shipping_primary
[ @primary_server_name = ] 'primary_server_name' ,
[ @primary_database_name = ] 'primary_database_name' ,
{ [ @delete_secondaries = ] delete_secondaries }

参数

[@primary_server_name =] 'primary_server_name'

主服务器的名称，primary_server_name 的数据类型为 sysname。

[@primary_database_name =] 'primary_database_name'

辅助服务器的名称，primary_database_name 的数据类型为 sysname。

[@delete_secondaries =] delete_secondaries

指定删除操作还可以应用到 log_shipping_secondaries 表。delete_secondaries 的数据类型为 bit，默认值为零 (0)。

返回代码值

0（成功）或 1（失败）

注释

此存储过程只从监视器删除主服务器和辅助服务器。同时，日志传送也从主服务器和辅助服务器上删除。

sp_delete_log_shipping_primary 删除日志传送主表。如果 log_shipping_databases 表中没有相应的行，delete_secondaries 必须设置为 1。否则存储过程将失败。

权限

只有 sysadmin 固定服务器角色的成员才能执行 sp_delete_log_shipping_primaries。

示例

下面的示例从服务器"source"中删除源数据库"pubs"。在 log_shipping_secondaries 表中没有相应行。

EXEC   sp_delete_log_shipping_primary @primary_server_name = N'source', @primary_database_name = N'pubs'


sp_delete_log_shipping_secondary

从 log_shipping_secondaries 表中删除辅助服务器。

语法

sp_delete_log_shipping_secondary
[ @secondary_server_name = ] 'secondary_server_name' ,
[ @secondary_database_name = ] 'secondary_database_name'

参数

[@secondary_server_name =] 'secondary_server_name'

辅助服务器的名称。secondary_server_name 的数据类型为 sysname。

[@secondary_database_name =] 'secondary_database_name'

辅助数据库的名称。secondary_database_name 的数据类型为 sysname。

返回代码值

0（成功）或 1（失败）

注释

此存储过程从 log_shipping_secondaries 表中删除匹配数据库。

权限

只有 sysadmin 固定服务器角色成员才能执行 sp_delete_log_shipping_secondary。


sp_delete_maintenance_plan

删除指定的维护计划。

语法

sp_delete_maintenance_plan [ @plan_id = ] 'plan_id'

参数

[@plan_id =] 'plan_id'

指定要删除的维护计划的 ID。lan_id 的数据类型为 uniqueidentifier 并且必须是有效的 ID。

返回代码值

0（成功）或 1（失败）

注释

sp_delete_maintenance_plan 必须在 msdb 数据库中运行。

权限

只有 sysadmin 固定服务器角色成员才能执行 sp_delete_maintenance_plan。

示例

删除 sp_add_maintenance_plan 创建的维护计划。

EXECUTE sp_delete_maintenance_plan 'FAD6F2AB-3571-11D3-9D4A-00C04FB925FC'


sp_delete_maintenance_plan_db

取消指定数据库和指定维护计划的关联。

语法

sp_delete_maintenance_plan_db [ @plan_id = ] 'plan_id' ,
[ @db_name = ] 'database_name'

参数

[@plan_id =] 'plan_id'

指定维护计划的 ID。plan_id 的数据类型为 uniqueidentifier。

[@db_name =] 'database_name'

指定要从维护计划中删除的数据库的名称。database_name 的数据类型为 sysname。

返回代码值

0（成功）或 1（失败）

注释

sp_delete_maintenance_plan_db 必须在 msdb 数据库中运行。

sp_delete_maintenance_plan_db 存储过程将删除维护计划和指定数据库之间的关联；此过程不会删除或破坏数据库。

当 sp_delete_maintenance_plan_db 从维护计划中删除最后一个数据库时，此存储过程将删除此维护计划。

权限

只有 sysadmin 固定服务器角色成员才能执行 sp_delete_maintenance_plan_db。

示例

删除以前由 sp_add_maintenance_plan_db 添加的 Northwind 数据库。

EXECUTE   sp_delete_maintenance_plan_db N'FAD6F2AB-3571-11D3-9D4A-00C04FB925FC', N'Northwind'


sp_delete_maintenance_plan_job

取消指定作业与指定维护计划的关联。

语法

sp_delete_maintenance_plan_job [ @plan_id = ] 'plan_id' ,
[ @job_id = ] 'job_id'

参数

[@plan_id =] 'plan_id'

指定维护计划的 ID。plan_id 的数据类型为 uniqueidentifier 并且必须是有效 ID。

[@job_id =] 'job_id'

指定作业的 ID，维护计划与此作业相关联。job_id 的数据类型为 uniqueidentifier 并且必须是有效 ID。

返回代码值

0（成功）或 1（失败）

注释

sp_delete_maintenance_plan_job 必须在 msdb 数据库中运行。

当从维护计划中删除所有作业时，推荐用户执行 sp_delete_maintenance_plan_db 删除计划中的剩余数据库。

权限

只有 sysadmin 固定服务器角色的成员才能执行 sp_delete_maintenance_plan_job。

示例

下面的示例从维护计划中删除作业"B8FCECB1-E22C-11D2-AA64-00C04F688EAE"。

EXECUTE   sp_delete_maintenance_plan_job N'FAD6F2AB-3571-11D3-9D4A-00C04FB925FC', N'B8FCECB1-E22C-11D2-AA64-00C04F688EAE'


sp_delete_notification

删除所有发送给负责处理警报的特定操作员的提示。

语法

sp_delete_notification [ @alert_name = ] 'alert' ,
[ @operator_name = ] 'operator'

参数

[@alert_name =] 'alert'

警报的名称。alert 的数据类型为 sysname，没有默认值。

[@operator_name =] 'operator'

操作员的名称。opertor 的数据类型为 sysname，没有默认值。

返回代码值

0（成功）或 1（失败）

结果集

无

注释

删除提示将仅删除提示；警报和操作员不受影响。

权限

只有 sysadmin 固定服务器角色成员才能执行 sp_delete_notification。

示例

下面的示例显示当发生警报"Error 1101"时，删除所有发送给操作员 stevenb 的所有提示。

USE msdb
EXEC sp_delete_notification 'Error 11001', 'stevenb'

请参见

sp_add_alert

sp_add_notification

sp_add_operator

sp_delete_alert

sp_help_alert

sp_help_notification

sp_help_operator

sp_update_notification

系统存储过程


sp_delete_operator

删除操作员。

语法

sp_delete_operator [ @name = ] 'name'
[ , [ @reassign_to_operator = ] 'reassign_operator' ]

参数

[@name =] 'name'

要删除的操作员的名称。name 的数据类型为 sysname，没有默认值。

[@reassign_to_operator =] 'reassign_operator'

操作员的名称，指定操作员的警报将重新分配给此操作员。reassign_operator 的数据类型为 sysname，默认值为 NULL。

返回代码值

0（成功）或 1（失败）

结果集

无

注释

删除操作员时，将同时删除与此操作员相关联的所有提示。

权限

只有 sysadmin 固定服务器角色成员才能执行 sp_delete_operator。

示例

下面的示例删除操作员 janetl。

USE msdb
EXEC sp_delete_operator 'janetl'

请参见

sp_add_operator

sp_help_operator

sp_update_operator

系统存储过程


sp_delete_targetserver

从可用目标服务器列表中删除指定服务器。

语法

sp_delete_targetserver [ @server_name = ] 'server'

参数

[@server_name =] 'server'

要删除的服务器（作为可用目标服务器）的名称。server 的数据类型为 nvarchar(30)，没有默认值。

返回代码值

0（成功）或 1（失败）

结果集

无

注释

还可以在 sp_delete_targetserver 中使用 @clear_downloadlist 和 @post_defection 参数，但仅限于内部使用。

删除目标服务器的常规方式是在目标服务器上调用 sp_msx_defect。只有在必须进行手工脱离时才可使用 sp_delete_targetserver。

权限

只有 sysadmin 固定服务器角色或 db_owner 固定数据库角色的成员才能执行 sp_delete_targetserver。

示例

下面的示例从可用作业服务器中删除服务器 LONDON1。

USE msdb
EXEC sp_delete_targetserver 'LONDON1'

请参见

sp_help_targetserver

sp_msx_defect

系统存储过程


sp_delete_targetservergroup

删除指定的目标服务器组。

语法

sp_delete_targetservergroup [ @name = ] 'name'

参数

[@name =] 'name'

要删除的目标服务器组的名称。name 的数据类型为 sysname，没有默认值。

返回代码值

0（成功）或 1（失败）

结果集

无

权限

只有 sysadmin 固定服务器角色或 db_owner 固定数据库角色的成员才能执行 sp_delete_targetservergroup。

示例

下面的示例删除目标服务器组 Servers Maintaining Customer Information。

USE msdb
EXEC sp_delete_targetservergroup
   @name = N'Servers Maintaining Customer Information'

请参见

sp_add_targetservergroup

sp_help_targetservergroup

sp_update_targetservergroup

系统存储过程


sp_delete_targetsvrgrp_member

从目标服务器组中删除目标服务器。

语法

sp_delete_targetsvrgrp_member [ @group_name = ] 'group_name' ,
[ server_name = ] 'server_name'

参数

[@group_name =] 'group_name'

组的名称。group_name 的数据类型为 sysname，没有默认值。

[@server_name =] 'server_name'

要从指定组删除的服务器名。server_name 的数据类型为 nvarchar(30)，没有默认值。

返回代码值

0（成功）或 1（失败）

结果集

无

权限

只有 sysadmin 固定服务器角色或 db_owner 固定数据库角色的成员才能执行 sp_delete_targetsvrgrp_member。

示例

下面的示例从 Servers Maintaining Customer Information 组删除服务器 LONDON1。

USE msdb
EXEC sp_delete_targetsvrgrp_member
   @group_name = N'Servers Maintaining Customer Information',
   @server_name = N'LONDON1'

请参见

sp_add_targetsvrgrp_member

系统存储过程


sp_denylogin

阻止 Microsoft® Windows NT® 用户或组连接到 Microsoft SQL Server™。

语法

sp_denylogin [ @loginame = ] 'login'

参数

[@loginame =] 'login'

Windows NT 用户或组的名称。login 的数据类型为 sysname，没有默认值。如果 SQL Server 上没有 Windows NT 用户或组，系统会自动添加。

返回代码值

0（成功）或 1（失败）

注释

sp_denylogin 只能和 Windows NT 帐户一起使用，格式为域\用户，如 London\Joeb。sp_denylogin 无法用于通过 sp_addlogin 添加的 SQL Server 登录。

使用 sp_grantlogin 反转 sp_denylogin 的效果，允许用户进行连接。

无法在用户定义的事务中执行 sp_denylogin。

权限

只有 securityadmin 或 sysadmin 固定服务器角色的成员才能执行 sp_denylogin。

示例

下面的示例阻止用户 Corporate\GeorgeW 登录到 SQL Server。

EXEC sp_denylogin 'Corporate\GeorgeW'

或

EXEC sp_denylogin [Corporate\GeorgeW]

请参见

拒绝 Windows NT 帐户的登录访问

sp_grantlogin

sp_revokelogin

系统存储过程


sp_depends

显示有关数据库对象相关性的信息（例如，依赖表或视图的视图和过程，以及视图或过程所依赖的表和视图）。不报告对当前数据库以外对象的引用。

语法

sp_depends [ @objname = ] 'object'

参数

[@objname =] 'object'

被检查相关性的数据库对象。对象可以是表、视图、存储过程或触发器。Object 的数据类型为 varchar(776)，没有默认值。

返回代码值

0（成功）或 1（失败）

结果集

sp_depends 显示两个结果集。

下面的结果集显示 object 所依赖的对象。

列名 | 数据类型 | 描述
name | nvarchar(40) | 存在相关性的项目名称。
type | nvarchar(16) | 项目类型。
updated | nvarchar(7) | 是否更新项目。
selected | nvarchar(8) | 项目是否用于 SELECT 语句。
column | sysname | 存在相关性的列或参数。

下面的结果集显示依赖 object 的对象。

列名 | 数据类型 | 描述
name | nvarchar(40) | 存在相关性的项目名称。
type | nvarchar(16) | 项目类型。

注释

若一个对象引用另一个对象，则认为前者依赖后者。sp_depends 通过查看 sysdepends 表确定相关性。

权限

执行权限默认授予 public 角色。

示例

下面的示例列出依赖 Customers 表的数据库对象。

USE Northwind
EXEC sp_depends 'Customers'

请参见

CREATE PROCEDURE

CREATE TABLE

CREATE VIEW

EXECUTE

sp_help

系统存储过程


sp_describe_cursor

报告服务器游标的特性。

语法

sp_describe_cursor [ @cursor_return = ] output_cursor_variable OUTPUT
{ [ , [ @cursor_source = ] N'local'
, [ @cursor_identity = ] N'local_cursor_name' ]
| [ , [ @cursor_source = ] N'global'
, [ @cursor_identity = ] N'global_cursor_name' ]
| [ , [ @cursor_source = ] N'variable'
, [ @cursor_identity = ] N'input_cursor_variable' ]
}

参数

[@cursor_return =] output_cursor_variable OUTPUT

声明游标变量的名称，该变量接收游标输出。output_cursor_variable 的数据类型为 cursor，没有默认值。调用 sp_describe_cursor 时，不能与任何游标相关联。返回的游标是可滚动的动态只读游标。

[@cursor_source =] { N'local' | N'global' | N'variable' }

指定是使用本地游标的名称、全局游标的名称、还是游标变量的名称来指定当前正在对其进行报告的游标。参数是 nvarchar(30)。

[@cursor_identity =] N'local_cursor_name']

由具有 LOCAL 关键字或默认设置为 LOCAL 的 DECLARE CURSOR 语句创建的游标的名称。local_cursor_name 的数据类型为 nvarchar(128)。

[@cursor_identity =] N'global_cursor_name']

由具有 GLOBAL 关键字或默认设置为 GLOBAL 的 DECLARE CURSOR 语句创建的游标的名称。也可以是由 ODBC 应用程序打开然后通过调用 SQLSetCursorName 对游标命名的 API 服务器游标的名称。global_cursor_name 的数据类型为 nvarchar(128)。

[@cursor_identity =] N'input_cursor_variable']

与开放游标相关联的游标变量的名称。input_cursor_variable 的数据类型为 nvarchar(128)。

返回代码值

无

返回的游标

sp_describe_cursor 将结果集封装在 Transact-SQL cursor 输出参数中。这样，Transact-SQL 批处理、存储过程和触发器就得以按一次一行的方式处理输出。它还意味着无法直接从数据库 API 函数直接调用该过程。cursor 输出参数必须绑定到程序变量，但是数据库 API 不支持绑定 cursor 参数或变量。

下面是 sp_describe_cursor 返回的游标格式。游标格式与 sp_cursor_list 返回的格式相同。

列名 | 数据类型 | 描述
reference_name | sysname | 用来引用游标的名称。如果通过 DECLARE CURSOR 语句中给定的名称引用游标，则引用名称与游标名称相同。如果通过变量引用游标，则引用名称即为游标变量的名称。
cursor_name | sysname | 来自 DECLARE CURSOR 语句的游标名称。如果游标是通过将游标变量设置为游标而创建的，则游标名称为系统生成的名称。
cursor_scope | tinyint | 1 = LOCAL 2 = GLOBAL
status | int | 与 CURSOR_STATUS 系统函数报告的值相同： 1 = 游标名称或变量引用的游标打开。如果游标为不感知游标、静态游标或键集游标，则至少包含一行。如果游标是动态游标，则结果集包含零行或更多的行。 0 = 游标名称或变量引用的游标打开但是没有行。动态游标不会返回此值。 -1 = 游标名称或变量引用的游标关闭。 -2 = 只适用于游标变量。没有给变量指派游标。很可能 OUTPUT 参数给变量指派了游标，但存储过程在返回前关闭了此游标。 -3 = 指定名称的游标或游标变量不存在，或尚未给游标变量分配游标。
model | tinyint | 1 = 不感知（或静态） 2 = 键集 3 = 动态 4 = 快进
concurrency | tinyint | 1 = 只读 2 = 滚动锁 3 = 乐观
scrollable | tinyint | 0 = 只进 1 = 可滚动
open_status | tinyint | 0 = 关闭 1 = 打开
cursor_rows | decimal(10,0) | 结果集中合格的行数。有关更多信息，请参见 @@CURSOR_ROWS。
fetch_status | smallint | 此游标上次提取的状态。有关更多信息，请参见 @@FETCH_STATUS。 0 = 提取成功。 -1 = 提取失败或超过游标的界限。 -2 = 请求的行丢失。 -9 = 游标上没有提取。
column_count | smallint | 游标结果集中的列数。
row_count | decimal(10,0) | 上次对游标的操作所影响的行数。有关更多信息，请参见 @@ROWCOUNT。
last_operation | tinyint | 上次对游标执行的操作： 0 = 没有对游标执行操作。 1 = OPEN 2 = FETCH 3 = INSERT 4 = UPDATE 5 = DELETE 6 = CLOSE 7 = DEALLOCATE
cursor_handle | int | 在服务器范围内游标的唯一值。

注释

sp_describe_cursor 描述服务器游标的全局特性，比如滚动和更新的能力。使用 sp_describe_cursor_columns 描述由游标返回的结果集的特性。使用 sp_describe_cursor_tables 报告游标所引用的基表。使用 sp_cursor_list 可获得连接时可视的 Transact-SQL 服务器游标的报告。

DECLARE CURSOR 语句可能会请求一个 Microsoft® SQL Server™ 使用 DECLARE CURSOR 中包含的 SELECT 语句不能支持的游标类型。SQL Server 隐式地将游标转换成支持 SELECT 语句的类型。如果在 DECLARE CURSOR 语句中指定 TYPE_WARNING，SQL Server 向应用程序发送一条转换完毕的消息。然后就可以调用 sp_describe_cursor 确定已实现的游标类型。

权限

执行权限默认赋予 public 角色。

示例

下面的示例打开一个全局游标，并使用 sp_describe_cursor 报告游标的特性。

USE Northwind

GO
-- Declare and open a global cursor.
DECLARE abc CURSOR STATIC FOR
SELECT LastName
FROM Employees

OPEN abc

-- Declare a cursor variable to hold the cursor output variable
-- from sp_describe_cursor.
DECLARE @Report CURSOR

-- Execute sp_describe_cursor into the cursor variable.
EXEC master.dbo.sp_describe_cursor @cursor_return = @Report OUTPUT,
        @cursor_source = N'global', @cursor_identity = N'abc'

-- Fetch all the rows from the sp_describe_cursor output cursor.
FETCH NEXT from @Report
WHILE (@@FETCH_STATUS <> -1)
BEGIN
    FETCH NEXT from @Report
END

-- Close and deallocate the cursor from sp_describe_cursor.
CLOSE @Report
DEALLOCATE @Report
GO

-- Close and deallocate the original cursor.
CLOSE abc
DEALLOCATE abc
GO

请参见

游标

CURSOR_STATUS

DECLARE CURSOR

sp_cursor_list

sp_describe_cursor_columns

sp_describe_cursor_tables


sp_describe_cursor_columns

报告服务器游标结果集中的列特性。

语法

sp_describe_cursor_columns
[ @cursor_return =] output_cursor_variable OUTPUT
{ [ , [ @cursor_source = ] N'local'
, [ @cursor_identity = ] N'local_cursor_name' ]
| [ , [ @cursor_source = ] N'global'
, [ @cursor_identity = ] N'global_cursor_name' ]
| [ , [ @cursor_source = ] N'variable'
, [ @cursor_identity = ] N'input_cursor_variable' ]
}

参数

[@cursor_return =] output_cursor_variable OUTPUT

声明游标变量的名称，该变量接收游标输出。output_cursor_variable 的数据类型为 cursor，没有默认值。调用 sp_describe_cursor_columns 时，不能与任何游标相关联。返回的游标是可滚动的动态只读游标。

[@cursor_source =] { N'local' | N'global' | N'variable' }

指定是使用本地游标的名称、全局游标的名称、还是游标变量的名称来指定当前正在对其进行报告的游标。参数是 nvarchar(30)。

, [@cursor_identity = ] N'local_cursor_name' ]

由具有 LOCAL 关键字或默认设置为 LOCAL 的 DECLARE CURSOR 语句创建的游标的名称。local_cursor_name 的数据类型为 nvarchar(128)。

[@cursor_identity =] N'global_cursor_name'

由具有 GLOBAL 关键字或默认设置为 GLOBAL 的 DECLARE CURSOR 语句创建的游标的名称。也可以是由 ODBC 应用程序打开然后通过调用 SQLSetCursorName 对游标命名的 API 服务器游标的名称。global_cursor_name 的数据类型为 nvarchar(128)。

[@cursor_identity =] N'input_cursor_variable'

与开放游标相关联的游标变量的名称。input_cursor_variable 的数据类型为 nvarchar(128)。

返回代码值

无

返回的游标

sp_describe_columns 将其报表封装成 Transact-SQL cursor 输出参数。这样，Transact-SQL 批处理、存储过程和触发器就得以按一次一行的方式处理输出。它还意味着无法直接从数据库 API 函数直接调用该过程。cursor 输出参数必须绑定到程序变量，但是数据库 API 不支持绑定 cursor 参数或变量。

下面是 sp_describe_cursor_columns 返回的游标格式。

列名 | 数据类型 | 描述
column_name | sysname nullable | 给结果集列指派的名称。如果指定列时不带 AS 子句，则该列为 NULL。
ordinal_position | int | 从结果集最左边一列算起的相对位置。首列的位置为 1。任何隐藏列的值为 0。
column_characteristics_flags | int | 位掩码表示存储在 OLE DB 的 DBCOLUMNFLAGS 中的信息。可以是下列选项之一： 1 = 书签 2 = 固定长度 4 = 可为空 8 = 行版本控制 16 = 可更新的列（对没有 FOR UPDATE 子句的游标的计划列所做的设置，如果有这样的列，则每个游标只能有一列）。
column_size | int | 此列中的值最大的可能大小。
data_type_sql | smallint | 表示列的 SQL Server 数据类型的数字。
column_precision | tinyint | 列最大精度，为 OLE DB 中的 bPrecision 值。
column_scale | tinyint | numeric 或 decimal 数据类型小数点右边的位数，为 OLE DB 中的 bScale 值。
order_position | int | 如果此列参与结果集排序，则指它在排序键中相对于最左边的列的位置。
order_direction | varchar(1), nullable | A = 该列包含在排序键中，按升序排列。 D = 该列包含在排序键中，按降序排列。 NULL = 该列没有参与排序。
hidden_column | smallint | 如果值为 0，则此列出现在选择列表中。值为 1 则保留以备将来使用。
columnid | int | 基列的列 ID。如果结果集列由表达式生成，则 columnid 为 –1。
objectid | int | 提供列的基表的对象 ID。如果结果集列由表达式生成，则 objectid 为 –1。
dbid | int | 包含提供列的基表的数据库 ID。如果结果集列由表达式生成，则 dbid 为 –1。
dbname | sysname nullable | 包含提供列的基表的数据库名称。如果结果集列由表达式生成，则 dbname 为 NULL。

注释

sp_describe_cursor_columns 描述服务器游标结果集中的列特性，例如每个游标的名称和数据类型。使用 sp_describe_cursor 描述服务器游标的全局特性。使用 sp_describe_cursor_tables 报告游标所引用的基表。使用 sp_cursor_list 可获得连接时可视的 Transact-SQL 服务器游标的报告。

权限

执行权限默认授予 public 角色。

示例

下面的示例打开一个全局游标，并使用 sp_describe_cursor_columns 报告游标所使用的列。

USE Northwind
GO
-- Declare and open a global cursor.
DECLARE abc CURSOR KEYSET FOR
SELECT LastName
FROM Employees
GO
OPEN abc

-- Declare a cursor variable to hold the cursor output variable
-- from sp_describe_cursor_columns.
DECLARE @Report CURSOR

-- Execute sp_describe_cursor_columns into the cursor variable.
EXEC master.dbo.sp_describe_cursor_columns
      @cursor_return = @Report OUTPUT,
      @cursor_source = N'global', @cursor_identity = N'abc'

-- Fetch all the rows from the sp_describe_cursor_columns output cursor.
FETCH NEXT from @Report
WHILE (@@FETCH_STATUS <> -1)
BEGIN
   FETCH NEXT from @Report
END

-- Close and deallocate the cursor from sp_describe_cursor_columns.
CLOSE @Report
DEALLOCATE @Report
GO
-- Close and deallocate the original cursor.
CLOSE abc
DEALLOCATE abc
GO

请参见

游标

CURSOR_STATUS

DECLARE CURSOR

sp_describe_cursor

sp_cursor_list

sp_describe_cursor_tables

系统存储过程


sp_describe_cursor_tables

报告服务器游标所引用的基表。

语法

sp_describe_cursor_tables
[ @cursor_return =] output_cursor_variable OUTPUT
{ [ , [ @cursor_source = ] N'local'
, [ @cursor_identity = ] N'local_cursor_name' ]
| [ , [ @cursor_source = ] N'global'
, [ @cursor_identity = ] N'global_cursor_name' ]
| [ , [ @cursor_source = ] N'variable'
, [ @cursor_identity = ] N'input_cursor_variable' ]
}

参数

[@cursor_return =] output_cursor_variable OUTPUT

声明游标变量的名称，该变量接收游标输出。output_cursor_variable 的数据类型为 cursor，没有默认值。调用 sp_describe_cursor_tables 时，不能与任何游标相关联。返回的游标是可滚动的动态只读游标。

[@cursor_source =] { N'local' | N'global' | N'variable' }

指定是使用本地游标的名称、全局游标的名称、还是游标变量的名称来指定当前正在对其进行报告的游标。参数是 nvarchar(30)。

, [@cursor_identity = ] N'local_cursor_name' ]

由具有 LOCAL 关键字或默认设置为 LOCAL 的 DECLARE CURSOR 语句创建的游标的名称。local_cursor_name 的数据类型为 nvarchar(128)。

[@cursor_identity =] N'global_cursor_name'

由具有 GLOBAL 关键字或默认设置为 GLOBAL 的 DECLARE CURSOR 语句创建的游标的名称。也可以是由 ODBC 应用程序打开然后通过调用 SQLSetCursorName 对游标命名的 API 服务器游标的名称。global_cursor_name 的数据类型为 nvarchar(128)。

[@cursor_identity =] N'input_cursor_variable'

与开放游标相关联的游标变量的名称。input_cursor_variable 的数据类型为 nvarchar(128)。

返回代码值

无

返回的游标

sp_describe_cursor_tables 将其报表封装成 Transact-SQL cursor 输出参数。这样，Transact-SQL 批处理、存储过程和触发器就得以按一次一行的方式处理输出。它还意味着无法直接从数据库 API 函数直接调用该过程。cursor 输出参数必须绑定到程序变量，但是数据库 API 不支持绑定 cursor 参数或变量。

下面是 sp_describe_cursor_tables 返回的游标格式。

列名 | 数据类型 | 描述
tableowner | sysname | 表所有者的用户 ID。
Table_name | sysname | 基表的名称。
Optimizer_hints | smallint | 位图由以下一个或多个选项组成： 1 = 行级锁定 (ROWLOCK) 4 = 页级锁定 (PAGELOCK) 8 = 表锁定 (TABLOCK) 16 = 排它表锁 (TABLOCKX) 32 = 更新锁 (UPDLOCK) 64 = 不锁定 (NOLOCK) 128 = 快速首行选项 (FASTFIRST) 4096 = 使用声明游标时可重复读取语义 (HOLDLOCK) 如果提供多个选项，系统将使用最有限制性的选项。但是 sp_describe_cursor_tables 按查询的指定显示标志。
lock_type | smallint | 为该游标的每个基表显式或隐式地请求的滚动锁类型。值可以为： 0 = 无 1 = 共享 3 = 更新
server_name | sysname, nullable | 表所在链接服务器的名称。如果使用 OPENQUERY 或 OPENROWSET，则为 NULL。
Objectid | int | 表的对象 ID。如果使用 OPENQUERY 或 OPENROWSET，则为 0。
dbid | int | 表所在数据库的 ID。如果使用 OPENQUERY 或 OPENROWSET，则为 0。
dbname | sysname, nullable | 表所在数据库的名称。如果使用 OPENQUERY 或 OPENROWSET，则为 NULL。

注释

sp_describe_cursor_tables 描述服务器游标所引用的基表。使用 sp_describe_cursor_columns 描述由游标返回的结果集的特性。使用 sp_describe_cursor 描述游标的全局特性，例如可滚动性和可更新性。使用 sp_cursor_list 可获得连接时可视的 Transact-SQL 服务器游标的报告。

权限

执行权限默认授予 public 角色。

示例

下面的示例打开一个全局游标，并使用 sp_describe_cursor_tables 报告游标所引用的表。

USE Northwind
GO
-- Declare and open a global cursor.
DECLARE abc CURSOR KEYSET FOR
SELECT LastName
FROM Employees
WHERE LastName LIKE 'S%'

OPEN abc
GO
-- Declare a cursor variable to hold the cursor output variable
-- from sp_describe_cursor_tables.
DECLARE @Report CURSOR

-- Execute sp_describe_cursor_tables into the cursor variable.
EXEC master.dbo.sp_describe_cursor_tables
      @cursor_return = @Report OUTPUT,
      @cursor_source = N'global', @cursor_identity = N'abc'

-- Fetch all the rows from the sp_describe_cursor_tables output cursor.
FETCH NEXT from @Report
WHILE (@@FETCH_STATUS <> -1)
BEGIN
   FETCH NEXT from @Report
END

-- Close and deallocate the cursor from sp_describe_cursor_tables.
CLOSE @Report
DEALLOCATE @Report
GO

-- Close and deallocate the original cursor.
CLOSE abc
DEALLOCATE abc
GO

请参见

游标

CURSOR_STATUS

DECLARE CURSOR

sp_cursor_list

sp_describe_cursor

sp_describe_cursor_columns

系统存储过程


sp_detach_db

从服务器分离数据库，并可以选择在分离前在所有的表上运行 UPDATE STATISTICS。

语法

sp_detach_db [ @dbname = ] 'dbname'
[ , [ @skipchecks = ] 'skipchecks' ]

参数

[@dbname =] 'dbname'

要分离的数据库名称。dbname 的数据类型为 sysname，默认值为 NULL。

[@skipchecks =] 'skipchecks'

skipchecks 的数据类型为 nvarchar(10)，默认值为 NULL。如果为 true，则跳过 UPDATE STATISTICS。如果为 false，则运行 UPDATE STATISTICS。对于要移动到只读媒体上的数据库，此选项很有用。

返回代码值

0（成功）或 1（失败）

结果集

无

注释

使用 sp_attach_db 或 sp_attach_single_file_db 保留并重新附加分离文件。文件也可以移动并附加到其它服务器上。

权限

只有 sysadmin 固定服务器角色的成员才能执行 sp_detach_db。

示例

下面的示例分离 pubs 数据库，并将 skipchecks 设为 true。

EXEC sp_detach_db 'pubs', 'true'

请参见

sp_attach_db

sp_attach_single_file_db


sp_dropalias

从登录删除当前数据库中用户的别名。提供 sp_dropalias 只是为了向后兼容。可以使用角色及 sp_droprolemember 存储过程取代别名。

语法

sp_dropalias [ @loginame = ] 'login'

参数

[@loginame =] 'login'

将要从其中删除别名的 Microsoft® SQL Server™ 登录名或 Microsoft Windows NT® 用户名或组名。login 的数据类型为 sysname，没有默认值。login 必须已经存在。

返回代码值

0（成功）或 1（失败）

注释

别名使登录能够接受数据库中用户的标识，因此当使用该数据库时，可以获得那个用户的权限。

删除别名后，登录就不能再执行一些与某个用户相关的活动，在当前数据库中，这些活动正是通过别名和该用户联系起来。

不能在用户定义的事务内执行 sp_dropalias。

权限

只有 sysadmin 固定服务器角色、db_accessadmin 和 db_owner 固定数据库角色的成员才能执行 sp_dropalias。

示例

下面的示例在当前数据库中删除用户 Victoria 的别名。

EXEC sp_dropalias 'Victoria'

请参见

sp_addalias

sp_addrolemember

sp_droprolemember

系统存储过程


sp_dropapprole

从当前数据库删除应用程序角色。

语法

sp_dropapprole [@rolename =] 'role'

参数

[@rolename =] 'role'

将要删除的应用程序角色。role 的数据类型为 sysname，没有默认值。role 必须已经存在于当前的数据库中。

返回代码值

0（成功）或 1（失败）

注释

sp_dropapprole 只能用来删除应用程序角色。使用 sp_droprole 删除标准 Microsoft® SQL Server™ 角色。如果应用程序角色拥有任何对象，那么就不能删除它。请在删除应用程序角色之前删除对象，或者如果不允许删除任一对象，那么请使用 sp_changeobjectowner 修改这些对象的所有者。

不能在用户定义的事务内执行 sp_dropapprole。

权限

只有 sysadmin 固定服务器角色、db_securityadmin 和 db_owner 固定数据库角色的成员才能执行 sp_dropapprole。

示例

下面的示例从当前数据库删除 SalesApp 应用程序角色。

EXEC sp_dropapprole 'SalesApp'

请参见

sp_addapprole

sp_changeobjectowner

sp_setapprole

系统存储过程


sp_dropdevice

从 Microsoft® SQL Server™ 除去数据库设备或备份设备，从 master.dbo.sysdevices 删除该项。

语法

sp_dropdevice [ @logicalname = ] 'device'
    [ , [ @delfile = ] 'delfile' ]

参数

[@logicalname =] 'device'

数据库设备或备份设备的逻辑名称，该名称在 master.dbo.sysdevices.name 中列出。device 的数据类型为 sysname，没有默认值。

[@delfile =] 'delfile'

指出是否应该删除物理备份设备文件。delfile 的数据类型为 varchar(7)。如果将其指定为 DELFILE，那么就会删除物理备份设备磁盘文件。

返回代码值

0（成功）或 1（失败）

结果集

无

注释

不能在事务内部使用 sp_dropdevice。

权限

执行权限默认授予 sysadmin 和 diskadmin 固定服务器角色的成员。

示例

下面的示例从 SQL Server 除去 TAPEDUMP1 磁带转储设备。

sp_dropdevice 'TAPEDUMP1'

请参见

DROP DATABASE

sp_addumpdevice

sp_helpdb

sp_helpdevice

系统存储过程


sp_dropextendedproc

除去扩展存储过程。

语法

sp_dropextendedproc [ @functname = ] 'procedure'

参数

[@functname =] 'procedure'

将要除去的扩展存储过程的名称。procedure 的数据类型为 nvarchar(517)，没有默认值。

返回代码值

0（成功）或 1（失败）

结果集

无

注释

执行 sp_dropextendedproc 可以将扩展存储过程名从 sysobjects 表除去，并且从 syscomments 表删除相应的条目。

不能在事务内部执行 sp_dropextendedproc。

权限

只有 sysadmin 固定服务器角色的成员才可以执行 sp_dropextendedproc。

示例

下面的示例除去 xp_diskfree 扩展存储过程。

说明 为了下面的示例正常工作而不返回错误信息，这个扩展存储过程必须已经存在。

USE master
EXEC sp_dropextendedproc 'xp_hello'

请参见

sp_addextendedproc

sp_helpextendedproc

系统存储过程


sp_dropextendedproperty

除去现有的扩展属性。

语法

sp_dropextendedproperty
[ @name = ] { 'property_name' }
[ , [ @value = ] { 'value' }
[ , [ @level0type = ] { 'level0_object_type' }
, [ @level0name = ] { 'level0_object_name' }
[ , [ @level1type = ] { 'level1_object_type' }
, [ @level1name = ] { 'level1_object_name' }
[ , [ @level2type = ] { 'level2_object_type' }
, [ @level2name = ] { 'level2_object_name' }
                    ]
            ]
        ]
    ]

参数

[@name =]{'property_name'}

将被除去的属性的名称。property_name 的数据类型为 sysname，并且不能为 NULL。

[@value =]{'value'}

将要与属性相关联的值。value 的数据类型为 sql_variant，带有默认设置 NULL。value 的大小不能超过 7,500 字节；否则 SQL Server 会产生错误。

[@level0type =]{'level0_object_type'}

用户或用户定义类型。level0_object_type 的数据类型为 varchar(128)，其默认值为 NULL。有效的输入是 USER、TYPE 和 NULL。

[@level0name =]{'level0_object_name'}

指定的 1 级对象类型的名称。level0_object_name 的数据类型为 sysname，其默认值为 NULL。

[@level1type =]{'level1_object_type'}

1 级对象的类型。level1_object_type 的数据类型为 varchar(128)，其默认值为 NULL。有效的输入是 TABLE、VIEW、PROCEDURE、FUNCTION、DEFAULT、RULE 和 NULL。

[@level1name =]{'level1_object_name'}

指定的 1 级对象类型的名称。level1_object_name 的数据类型为 sysname，其默认值为 NULL。

[@level2type =]{'level2_object_type'}

2 级对象的类型。level2_object_type 的数据类型为 varchar(128)，其默认值为 NULL。有效的输入是 COLUMN、PARAMETER、INDEX、CONSTRAINT、TRIGGER 和 NULL。

[@level2name =]{'level2_object_name'}

指定的 2 级对象类型的名称。level2_object_name 的数据类型为 sysname,其默认值为 NULL。

返回代码值

0（成功）或 1（失败）

注释

系统对象不允许有扩展属性。

对象是按级别区分的，0 级为最高，2 级为最低。当用户添加、更新或删除扩展属性时，必须指定所有更高级别的对象。例如，如果用户要向 1 级对象添加扩展属性，就必须指定所有 0 级信息。如果用户要向 2 级对象添加扩展属性，就必须提供关于 0 级和 1 级的所有信息。

在每个级别上，对象类型和对象名可唯一地标识对象。如果指定了一个对中的任一方，则必须指定另一方。

给定一个有效的 property_name，如果所有的对象类型及名称是空的，并且存在一个当前数据库属性，那么就删除该数据库属性。如果指定对象类型和名称，则还必须指定父对象和类型。否则，SQL Server 会产生错误。

权限

db_owner 及 db_ddladmin 固定数据库角色的成员可以除去任何对象的扩展属性。用户可以除去其拥有的对象的扩展属性。但是，只有 db_owner 才可以除去用户名的属性。

示例

下面的示例在"T1"表中从"id"列删除"caption"属性，该表由 dbo 所拥有。

CREATE   table T1 (id int , name char (20))
GO
EXEC   sp_addextendedproperty 'caption', 'Employee ID', 'user', dbo, 'table', 'T1', 'column', id
EXEC sp_dropextendedproperty 'caption', 'user', dbo, 'table', 'T1', 'column', id

请参见

fn_listextendedproperty


sp_dropgroup

从当前数据库中删除角色。提供 sp_dropgroup 是为了向后兼容。在 Microsoft® SQL Server™ 7.0 版中，组作为角色来实现。

语法

sp_dropgroup [ @rolename = ] 'role'

参数

[@rolename =] 'role'

将要从当前数据库删除的角色。role 的数据类型为 sysname，没有默认值。

返回代码值

0（成功）或 1（失败）

结果集
列名 | 数据类型 | 描述
Name | sysname | 角色现有成员的名称。

注释

sp_dropgroup 使用 role 值调用 sp_droprole 以删除角色。不能删除 public、固定服务器、固定数据库或应用程序角色。可以使用 sp_dropapprole 删除应用程序角色。

如果角色还拥有任何对象，那么就不能将其删除。请在删除角色之前先删除对象，或者，对于那些不允许删除的对象，请使用 sp_changeobjectowner 更改其所有者。

此外，如果存在任何角色的成员，那么也不能删除该角色。可以使用 sp_droprolemember 从角色删除用户。如果任何用户仍然是角色的成员，那么 sp_dropgroup 将显示这些成员。

不能在用户定义的事务内执行 sp_dropgroup。

权限

只有 sysadmin 固定服务器角色、db_securityadmin 或 db_owner 固定数据库角色成员或角色所有者才能执行 sp_dropgroup。

示例

下面的示例从当前数据库删除角色 my_role。

EXEC sp_dropgroup 'my_role'

请参见

sp_addrole

sp_droprole

sp_dropapprole

系统存储过程


sp_droplinkedsrvlogin

删除运行 Microsoft® SQL Server™ 的本地服务器上的登录和链接服务器上的登录之间的现有映射。

语法

sp_droplinkedsrvlogin [ @rmtsrvname = ] 'rmtsrvname' ,
[ @locallogin =] 'locallogin'

参数

[@rmtsrvname =] 'rmtsrvname'

链接服务器的名称，SQL Server 登录映射适用于该链接服务器。rmtsrvname 的数据类型为 sysname，没有默认值。rmtsrvname 必须已经存在。

[ @locallogin =] 'locallogin'

本地服务器上的 SQL Server 登录，该登录有一个到链接服务器 rmtsrvname 的映射。locallogin 的数据类型为 sysname，没有默认值。从 locallogin 到 rmtsrvname 的映射必须已经存在。如果为 NULL，那么将会删除由 sp_addlinkedserver 创建的默认映射（它将本地服务器上的所有登录都映射到链接服务器上的登录）。

返回代码值

0（成功）或 1（失败）

注释

如果删除了某个登录的现有映射，当本地服务器为这个登录连接到链接服务器上时，本地服务器就会使用由 sp_addlinkedserver 创建的默认映射。若要更改默认映射，请使用 sp_addlinkedsrvlogin。

如果默认映射也被删除，那么只有某些登录（使用 sp_addlinkedsrvlogin 显式地给予这些登录一个到链接服务器的登录映射）才可以访问链接服务器。

不能从用户定义的事务内执行 sp_droplinkedsrvlogin。

权限

只有 sysadmin 和 securityadmin 固定服务器角色的成员才能执行 sp_droplinkedsrvlogin。

示例
A. 为现有的用户删除登录映射

下面的示例为登录 Mary 删除映射，该映射从本地服务器映射到链接服务器 Accounts；这样，登录 Mary 就会使用默认的登录映射。

EXEC sp_droplinkedsrvlogin 'Accounts', 'Mary'
B. 删除默认的登录映射

下面的示例删除默认的登录映射，最初在本地服务器 Accounts 上通过执行 sp_addlinkedserver 而创建了这个默认的登录映射。

EXEC sp_droplinkedsrvlogin 'Accounts', NULL

请参见

链接服务器的安全性

sp_addlinkedserver

sp_addlinkedsrvlogin

系统存储过程


sp_droplogin

删除 Microsoft® SQL Server™ 登录，以阻止使用该登录名访问 SQL Server。

语法

sp_droplogin [ @loginame = ] 'login'

参数

[@loginame =] 'login'

将被删除的登录。login 的数据类型为 sysname，没有默认值。login 必须已经存在于 SQL Server 中。

返回代码值

0（成功）或 1（失败）

注释

不能删除映射到任何数据库中现有用户的登录。必须首先使用 sp_dropuser 删除该用户。此外，不能删除下面这些登录：

  • 系统管理员 (sa) 登录。

  • 拥有现有数据库的登录。

  • 在 msdb 数据库中拥有作业的登录。

  • 当前正在使用并且被连接到 SQL Server 的登录。

可以使用 sp_changedbowner 更改数据库的所有者。

删除某个登录同时也就删除了所有映射到该登录的远程及链接服务器登录。

不能在用户定义的事务内执行 sp_droplogin。

权限

只有 sysadmin 和 securityadmin 固定服务器角色的成员才能执行 sp_droplogin。

sp_droplogin 必须检查服务器上的所有数据库，以便确定在这些数据库中是否有与正被删除的登录相关的用户帐户。因此，服务器上的每个数据库都必须满足下列条件之一：

  • 正在执行 sp_droplogin 的用户必须有访问该数据库的权限。

  • guest 用户帐户必须存在于数据库中。

即使不能访问数据库，登录仍然可以被删除。但是会产生错误信息 15622，并且在那个不能访问的数据库中，所有与被删除的登录相关的用户都会变成孤立的。若要确定孤立用户，请在 sp_droplogin 不能访问的每个数据库中执行 sp_change_users_login REPORT。

示例

下面的示例从 SQL Server 中删除登录 Victoria。

EXEC sp_droplogin 'Victoria'

请参见

sp_addlogin

sp_changedbowner

sp_change_users_login

sp_dropuser

sp_helpuser

系统存储过程


sp_dropmessage

从 sysmessages 系统表除去指定的错误信息。

语法

sp_dropmessage [ @msgnum = ] message_number
[ , [ @lang = ] 'language' ]

参数

[@msgnum =] message_number

将要除去的消息号。message_number 必须是一个用户定义的消息，它带有一个大于 50000 的消息号。message_number 的数据类型为 int，带有默认值 NULL。

[@lang =] 'language'

将要除去的消息的语言。如果指定了 all，那么除去 message_number 的所有语言版本。language 的数据类型为 sysname 类型，带有默认值 NULL。

返回代码值

0（成功）或 1（失败）

结果集

无

权限

只有 sysadmin 和 serveradmin 固定服务器角色成员才能执行该存储过程。

示例

下面的示例从 sysmessages 中除去消息（消息号为 50001）。

USE master
EXEC sp_dropmessage 50001

下面是结果：

Message dropped.

请参见

CREATE TABLE

RAISERROR

sp_addmessage

sp_altermessage

系统存储过程


sp_dropremotelogin

删除映射到本地登录、对运行 Microsoft® SQL Server™ 的本地服务器执行远程存储过程的远程登录。

语法

sp_dropremotelogin [ @remoteserver = ] 'remoteserver'
[ , [ @loginame = ] 'login' ]
[ , [ @remotename = ] 'remote_name' ]

参数

[@remoteserver =] 'remoteserver'

远程服务器的名称，该远程服务器映射到将被删除的远程登录。remoteserver 的数据类型为 sysname，没有默认值。remoteserver 必须已经存在。

[@loginame =] 'login'

与远程服务器相关联的本地服务器上的可选登录名。login 的数据类型为 sysname，带有默认值 NULL。如果指定了 login，那么它必须已经存在。

[@remotename =] 'remote_name'

可选的远程登录的名称，当从远程服务器登录时，这个名称映射到 login。remote_name 的数据类型为 sysname，带有默认值 NULL。

返回代码值

0（成功）或 1（失败）

注释

如果只指定了 remoteserver，那么从本地服务器中删除所有针对该远程服务器的远程登录。另外，如果指定了 login，那么从本地服务器中删除所有从 remoteserver 映射到该特定的本地登录的远程登录。如果还指定了 remote_name，那么只从本地服务器中删除来自 remoteserver 的那个远程用户的远程登录。

若要添加本地服务器用户，请使用 sp_addlogin。若要删除本地服务器用户，请使用 sp_droplogin。

只有在使用早期版本的 SQL Server 时，才需要远程登录。而 SQL Server 7.0 版使用链接服务器登录。使用 sp_addlinkedsrvlogin 及 sp_droplinkedsrvlogin 添加及删除链接服务器登录。

不能在用户定义的事务内执行 sp_dropremotelogin。

权限

只有 sysadmin 或 securityadmin 固定服务器角色的成员才可以执行 sp_dropremotelogin。

示例
A. 除去远程服务器的所有远程登录

下面的示例删除远程服务器 ACCOUNTS 的条目，因此对于本地服务器上的登录和远程服务器上的远程登录，将删除二者之间所有的映射。

EXEC sp_dropremotelogin 'ACCOUNTS'
B. 删除登录映射

下面的示例删除一个映射的条目，该条目将来自远程服务器 ACCOUNTS 的远程登录映射到本地登录 Albert。

EXEC sp_dropremotelogin 'ACCOUNTS', 'Albert'
C. 删除远程用户

下面的示例删除远程服务器 ACCOUNTS 上的远程登录 Chris 的登录，这个远程登录映射到本地登录 salesmgr。

EXEC sp_dropremotelogin 'ACCOUNTS', 'salesmgr', 'Chris'

请参见

sp_addlinkedsrvlogin

sp_addlogin

sp_addremotelogin

sp_addserver

sp_droplinkedsrvlogin

sp_droplogin

sp_helpremotelogin

系统存储过程


sp_droprole

从当前数据库删除 Microsoft® SQL Server™ 角色。

语法

sp_droprole [ @rolename = ] 'role'

参数

[@rolename =] 'role'

将要从当前数据库中删除的角色的名称。role 的数据类型为 sysname，没有默认值。role 必须已经存在于当前的数据库中。

返回代码值

0（成功）或 1（失败）

结果集
列名 | 数据类型 | 描述
Name | sysname | 角色现有成员的名称。

注释

使用 sp_droprole 只能删除标准的用户角色。若要删除应用程序角色，请使用 sp_dropapprole。

不能删除仍然带有成员的角色。在删除角色之前，首先必须从该角色删除其所有的成员。若要从角色删除用户，请使用 sp_droprolemember。如果任何用户仍然为角色的成员，那么 sp_droprole 将显示这些成员。

不能删除固定角色及 public 角色。

如果角色还拥有任何对象，那么就不能将其删除。请在删除角色之前先删除对象，或者，对于那些不允许删除的对象，请使用 sp_changeobjectowner 更改其所有者。

不能在用户定义的事务内执行 sp_droprole。

权限

只有 sysadmin 固定服务器角色、db_owner 和 db_securityadmin 固定数据库角色成员或角色的所有者才能执行 sp_droprole。

示例

下面的示例删除 SQL Server 角色 Sales。

EXEC sp_droprole 'Sales'

请参见

sp_addrole

sp_dropapprole

系统存储过程


sp_droprolemember

从当前数据库中的 Microsoft® SQL Server™ 角色中删除安全帐户。

语法

sp_droprolemember [ @rolename = ] 'role' ,
[ @membername = ] 'security_account'

参数

'role'

某个角色的名称，将要从该角色删除成员。role 的数据类型为 sysname，没有默认值。role 必须已经存在于当前的数据库中。

'security_account'

正在从角色中删除的安全帐户的名称。security_account 的数据类型为 sysname，没有默认值。security_account 可以是 SQL Server 用户或另一个 SQL Server 角色，或 Microsoft Windows NT® 用户或组。当前数据库中必须存在 security_account。当指定 Windows NT 用户或组时，请指定该 Windows NT 用户或组在数据库中可被识别的名称（用 sp_grantdbaccess 添加）。

返回代码值

0（成功）或 1（失败）

注释

通过从 sysmembers 表删除行，sp_droprolemember 删除角色成员。当从角色删除某个成员时，应用于该角色的权限不再适用于角色从前的那个成员。

不能使用 sp_droprolemember 从 Windows NT 组删除 Windows NT 用户；而只能在 Windows NT 安全系统中完成这个任务。若要从固定服务器角色删除用户，请使用 sp_dropsrvrolemember。不能从 public 角色删除用户，并且不能从任何角色删除 dbo。

可以使用 sp_helpuser 查看 SQL Server 角色的成员，并且可以使用 sp_addrolemember 将成员添加到角色。

不能从用户定义的事务内执行 sp_droprolemember。

权限

只有 sysadmin 固定服务器角色、db_owner 和 db_securityadmin 固定数据库角色的成员才能执行 sp_droprolemember。只有 db_owner 固定数据库角色的成员才可以从固定数据库角色中删除用户。

示例

下面的示例从角色 Sales 中删除用户 JonB。

EXEC sp_droprolemember 'Sales', 'Jonb'

请参见

sp_addrolemember

sp_droprole

sp_dropsrvrolemember

sp_helpuser

系统存储过程


sp_dropserver

从本地 Microsoft® SQL Server™ 上的已知远程和链接服务器列表中删除服务器。

语法

sp_dropserver [ @server = ] 'server'
[ , [ @droplogins = ] { 'droplogins' | NULL} ]

参数

[@server =] 'server'

将被删除的服务器。server 的数据类型为 sysname，没有默认值。server 必须已经存在。

[@droplogins =] 'droplogins' | NULL

指明如果指定了 droplogins，那么对于 server，那些相关的远程及链接服务器登录也将被删除。@droplogins 的数据类型为 char(10)，带有默认值 NULL。

返回代码值

0（成功）或 1（失败）

注释

如果某个服务器有相关的远程及链接服务器登录条目，当在该服务器上运行 sp_dropserver 时，会导致一条错误信息，该消息说明：在删除远程或链接服务器之前，必须先删除相关的登录。当删除服务器时，为了删除服务器的所有远程及链接服务器登录，请使用 droplogins 参数。

不能在用户定义的事务内执行 sp_dropserver。

权限

只有 sysadmin 或 setupadmin 固定服务器角色的成员才可以执行 sp_dropserver。

示例

下面的示例从本地 SQL Server 删除远程服务器 ACCOUNTS 以及所有相关的远程登录。

sp_dropserver 'ACCOUNTS', 'droplogins'

sp_addserver

sp_dropremotelogin

sp_helpremotelogin

sp_helpserver

系统存储过程


sp_dropsrvrolemember

从固定服务器角色中删除 Microsoft® SQL Server™ 登录或 Microsoft Windows NT® 用户或组。

语法

sp_dropsrvrolemember [ @loginame = ] 'login' , [ @rolename = ] 'role'

参数

[@loginame =] 'login'

将要从固定服务器角色删除的登录的名称。login 的数据类型为 sysname，没有默认值。login 必须已经存在。

[@rolename =] 'role'

服务器角色的名称。role 的数据类型为 sysname，带有默认值 NULL。role 必须是有效的固定服务器角色，并且必须是下面值中的一个：

  • sysadmin

  • securityadmin

  • serveradmin

  • setupadmin

  • processadmin

  • diskadmin

  • dbcreator

  • bulkadmin
返回代码值

0（成功）或 1（失败）

注释

只可以使用 sp_dropsrvrolemember 从服务器角色中删除登录。使用 sp_droprolemember 从标准的 SQL Server 角色删除成员。

如果某些权限与某个服务器角色相关，那么从该服务器角色中删除一个登录后，该登录就不能再执行基于这些权限的活动。

不能从任何固定服务器角色中删除 sa 登录。

不能从用户定义的事务内执行 sp_dropsrvrolemember。

权限

只有 sysadmin 固定服务器角色的成员才可以执行 sp_dropsrvrolemember，以从固定服务器角色中删除任意登录。一个固定服务器角色的成员可以删除相同固定服务器角色中的其他成员。

示例

下面的示例从 sysadmin 固定服务器角色中删除登录 JackO。

EXEC sp_dropsrvrolemember 'JackO', 'sysadmin'

请参见

sp_addsrvrolemember

sp_droprolemember

系统存储过程


sp_droptask

提供 sp_droptask 只是为了向后兼容。有关 Microsoft SQL® Server™ 7.0 版替换过程的信息，请参见 SQL Server 向后兼容性详细信息。

删除已调度任务。

重要 有关用于 SQL Server 早期版本的语法信息，请参见 6.x 版的《Microsoft SQL Server Transact-SQL 参考》。

注释

如果使用 sp_addtask 创建一个任务，那么只能使用 sp_droptask 删除该任务。若要进行任务管理，请使用 SQL Server 企业管理器。

权限

执行权限默认授予 public 角色。

请参见

sp_addtask

sp_helptask

sp_purgehistory

sp_updatetask

系统存储过程


sp_droptype

从 systypes 删除用户定义的数据类型。

语法

sp_droptype [ @typename = ] 'type'

参数

[@typename =] 'type'

您所拥有的用户定义数据类型的名称。type 的数据类型为 sysname，没有默认值。

返回代码类型

0（成功）或 1（失败）

结果集

无

注释

如果表或其它数据库对象引用 type 用户定义数据类型，那么就不能除去这种数据类型。

说明 如果在表定义内使用某个用户定义的数据类型，或者将某个规则或默认值绑定到这种数据类型，那么就不能除去它。

权限

执行权限默认授予 sysadmin 固定服务器角色、db_ddladmin 和 db_owner 固定数据库角色成员以及数据类型所有者。

示例

下面的示例除去用户定义的数据类型 birthday。

说明 该用户定义的数据类型必须已经存在，否则下面的示例会返回一条错误信息。

USE master
EXEC sp_droptype 'birthday'

请参见

sp_addtype

sp_rename

系统存储过程


sp_dropuser

从当前数据库中删除 Microsoft® SQL Server™ 用户或 Microsoft Windows NT® 用户。提供 sp_dropuser 是为了向后兼容。使用 sp_revokedbaccess 删除用户。

语法

sp_dropuser [ @name_in_db = ] 'user'

参数

[@name_in_db =] 'user'

将要被删除的用户的名称。user 的数据类型为 sysname，没有默认值。user 必须已经存在于当前的数据库中。当指定 Windows NT 用户时，请指定该 Windows NT 用户在数据库中可被识别的名称（用 sp_grantdbaccess 添加）。

返回代码值

0（成功）或 1（失败）

注释

sp_dropuser 执行 sp_revokedbaccess 以从当前数据库中删除用户。

使用 sp_helpuser 可以显示一个用户名的列表，可以将这些用户名从当前数据库中删除。

当删除某个用户的安全帐户时，也就删除了该用户的所有别名。如果某个用户在数据库中拥有任意对象，那么就不能删除该用户。必须使用 sp_changeobjectowner 将对象的所有关系更改到另一用户。删除用户时，也就自动地删除与该用户相关的权限，并且将这些相关的权限从该用户所在的任何角色中删除。

不能使用 sp_dropuser 删除 dbo 或 INFORMATION_SCHEMA 用户，也不能从 master 或 tempdb 数据库中删除 guest 用户。

不能从用户定义的事务内执行 sp_dropuser。

权限

只有 sysadmin 固定服务器角色、db_owner 或 db_accessadmin 固定数据库角色的成员才能执行 sp_dropuser。

示例

下面的示例从当前数据库删除用户 Albert。

EXEC sp_dropuser 'Albert'

请参见

sp_grantdbaccess

sp_revokedbaccess

系统存储过程


sp_dropwebtask

删除先前定义的 Web 任务。

说明 在 SQL Server 企业管理器的"作业分类"对话框中，所有的 Web 任务或作业都被分类成"Web 助手"。有关更多信息，请参见定义作业。

语法

sp_dropwebtask { [ @procname = ] 'procname' | [ , @outputfile = ] 'outputfile' }

参数

[@procname =] 'procname'

为任务定义查询的那个过程的名称。procname 的数据类型为 nvarchar(128)，带有默认值 NULL。

[@outputfile =] 'outputfile'

将被删除的 HTML 输出文件的名称。outputfile 的数据类型为 nvarchar(255)，带有默认值 NULL。

返回代码值

0（成功）或一个非零数字（失败）

重要 返回代码值已不同于 Microsoft® SQL Server™ 的早期版本。

结果集

无

注释

sp_dropwebtask 接受两个参数中的一个或同时接受两个参数。如果指定 outputfile，而不带有 procname，那么可以为 procname 指定一个占位值 NULL，或者也可以使用参数名 @procname。下面两个示例是等价的：

sp_dropwebtask NULL,'filename.htm'
sp_dropwebtask @procname = 'filename.htm'

必须在某个特定的数据库中执行 sp_dropwebtask，这个数据库就是由 sp_makewebtask 的 dbname 参数指定的那个数据库。

在 Microsoft SQL Server 7.0 版本之前的数据库上运行 sp_dropwebtask 会返回一个错误。

权限

只有指定的过程的所有者才可以执行 sp_dropwebtask 以删除 Web 任务。

示例

下面的示例删除一个 Web 任务，该任务带有输出文件 C:\Web\Myfile.html 以及一个名为 MYHTML 的过程。

sp_dropwebtask 'MYHTML', 'C:\WEB\MYFILE.HTML'

请参见

sp_makewebtask

sp_runwebtask

系统存储过程


sp_enumcodepages

返回 sp_makewebtask 支持的代码页和字符集列表。

语法

sp_enumcodepages

返回代码值

0（成功）或 1（失败）

结果集
列名 | 数据类型 | 描述
Code Page | integer | 支持该字符集的代码页。
Character | varchar(50) | Microsoft® Internet Explorer 和其它浏览器识别的字符集别名代码。
Description | varchar(255) | 该字符集的描述。

注释

操作系统必须安装适当的 .nls 文件并使其可用，以便 sp_makewebtask 可以通过适当的代码页创建 .htm 文件。

权限

执行权限默认授予 public 角色。

示例

下面的示例返回 sp_makewebtask 支持的代码页和字符集列表。

EXEC sp_enumcodepages

请参见

sp_makewebtask

系统存储过程


sp_executesql

执行可以多次重用或动态生成的 Transact-SQL 语句或批处理。Transact-SQL 语句或批处理可以包含嵌入参数。

语法

sp_executesql [@stmt =] stmt
[
{, [@params =] N'@parameter_name data_type [,...n]' }
{, [@param1 =] 'value1' [,...n] }
]

参数

[@stmt =] stmt

包含 Transact-SQL 语句或批处理的 Unicode 字符串，stmt 必须是可以隐式转换为 ntext 的 Unicode 常量或变量。不允许使用更复杂的 Unicode 表达式（例如使用 + 运算符串联两个字符串）。不允许使用字符常量。如果指定常量，则必须使用 N 作为前缀。例如，Unicode 常量 N'sp_who' 是有效的，但是字符常量 'sp_who' 则无效。字符串的大小仅受可用数据库服务器内存限制。

stmt 可以包含与变量名形式相同的参数，例如：

N'SELECT * FROM Employees WHERE EmployeeID = @IDParameter'

stmt 中包含的每个参数在 @params 参数定义列表和参数值列表中均必须有对应项。

[@params =] N'@parameter_name data_type [,...n]'

字符串，其中包含已嵌入到 stmt 中的所有参数的定义。该字符串必须是可以隐式转换为 ntext 的 Unicode 常量或变量。每个参数定义均由参数名和数据类型组成。n 是表明附加参数定义的占位符。stmt 中指定的每个参数都必须在 @params 中定义。如果 stmt 中的 Transact-SQL 语句或批处理不包含参数，则不需要 @params。该参数的默认值为 NULL。

[@param1 =] 'value1'

参数字符串中定义的第一个参数的值。该值可以是常量或变量。必须为 stmt 中包含的每个参数提供参数值。如果 stmt 中包含的 Transact-SQL 语句或批处理没有参数，则不需要值。

n

附加参数的值的占位符。这些值只能是常量或变量，而不能是更复杂的表达式，例如函数或使用运算符生成的表达式。

返回代码值

0（成功）或 1（失败）

结果集

从生成 SQL 字符串的所有 SQL 语句返回结果集。

注释

在批处理、名称作用域和数据库上下文方面，sp_executesql 与 EXECUTE 的行为相同。sp_executesql stmt 参数中的 Transact-SQL 语句或批处理在执行 sp_executesql 语句时才编译。然后编译 stmt 中的内容并作为执行计划运行（独立于名为 sp_executesql 的批处理的执行计划）。sp_executesql 批处理不能引用调用 sp_executesql 的批处理中声明的变量。sp_executesql 批处理中的本地游标和变量对调用 sp_executesql 的批处理是不可见的。对数据库上下文所作的更改只在 sp_executesql 语句结束前有效。

如果只更改了语句中的参数值，则 sp_executesql 可用来代替存储过程多次执行 Transact-SQL 语句。因为 Transact-SQL 语句本身保持不变仅参数值变化，所以 Microsoft® SQL Server™ 查询优化器可能重复使用首次执行时所生成的执行计划。

说明 如果语句字符串中的对象名不是全限定名，则该执行计划不会被重用。

sp_executesql 支持与 Transact-SQL 字符串相独立的参数值的设置：

DECLARE @IntVariable INT
DECLARE @SQLString NVARCHAR(500)
DECLARE @ParmDefinition NVARCHAR(500)

/* Build the SQL string once.*/
SET @SQLString =
     N'SELECT * FROM pubs.dbo.employee WHERE job_lvl = @level'
SET @ParmDefinition = N'@level tinyint'
/* Execute the string with the first parameter value. */
SET @IntVariable = 35
EXECUTE sp_executesql @SQLString, @ParmDefinition,
                      @level = @IntVariable
/* Execute the same string with the second parameter value. */
SET @IntVariable = 32
EXECUTE sp_executesql @SQLString, @ParmDefinition,
                      @level = @IntVariable

替换 sp_executesql 中的参数的能力，与使用 EXECUTE 语句执行字符串相比，有下列优点：

  1. 因为在 sp_executesql 中，Transact-SQL 语句的实际文本在两次执行之间未改变，所以查询优化器应该能将第二次执行中的 Transact-SQL 语句与第一次执行时生成的执行计划匹配。这样，SQL Server 不必编译第二条语句。

  2. Transact-SQL 字符串只生成一次。

  3. 整型参数按其本身格式指定。不需要转换为 Unicode。
权限

执行权限默认授予 public 角色。

示例
A. 执行简单的 SELECT 语句

下面的示例创建并执行一个简单的 SELECT 语句，其中包含名为 @level 的嵌入参数。

execute sp_executesql
          N'select * from pubs.dbo.employee where job_lvl = @level',
          N'@level tinyint',
          @level = 35
B. 执行动态生成的字符串

下面的示例显示使用 sp_executesql 执行动态生成的字符串。该示例中的存储过程用来向一组表中插入数据，该表用于划分一年的销售数据。一年中的每个月均有一个表，格式如下：

CREATE TABLE May1998Sales
    (OrderID      INT      PRIMARY KEY,
    CustomerID      INT      NOT NULL,
    OrderDate      DATETIME   NULL
        CHECK (DATEPART(yy, OrderDate) = 1998),
    OrderMonth      INT
        CHECK (OrderMonth = 5),
    DeliveryDate   DATETIME   NULL,
        CHECK (DATEPART(mm, OrderDate) = OrderMonth)
    )

有关从这些分区表中检索数据的更多信息，请参见使用包含分区数据的视图。

每个表的名称由月份名的前三个字母、年度的四位数字和常量 Sales 组成。名称可以从订单日期动态生成：

/* Get the first three characters of the month name. */
SUBSTRING( DATENAME(mm, @PrmOrderDate), 1, 3) +
/* Concatenate the four-digit year; cast as character. */
CAST(DATEPART(yy, @PrmOrderDate) AS CHAR(4) ) +
/* Concatenate the constant 'Sales'. */
'Sales'

下面示例中的存储过程动态生成并执行一个 INSERT 语句，向适当的表中插入新订单。该存储过程使用订单日期生成应包含数据的表的名称，然后将名称并入 INSERT 语句。（这是 sp_executesql 的一个简单示例。不包含错误检查，也不包括业务规则检查，例如确保两个表之间订单号没有重复。）

CREATE PROCEDURE InsertSales @PrmOrderID INT, @PrmCustomerID INT,
                 @PrmOrderDate DATETIME, @PrmDeliveryDate DATETIME
AS
DECLARE @InsertString NVARCHAR(500)
DECLARE @OrderMonth INT

-- Build the INSERT statement.
SET @InsertString = 'INSERT INTO ' +
       /* Build the name of the table. */
       SUBSTRING( DATENAME(mm, @PrmOrderDate), 1, 3) +
       CAST(DATEPART(yy, @PrmOrderDate) AS CHAR(4) ) +
       'Sales' +
       /* Build a VALUES clause. */
       ' VALUES (@InsOrderID, @InsCustID, @InsOrdDate,' +
       ' @InsOrdMonth, @InsDelDate)'

/* Set the value to use for the order month because
   functions are not allowed in the sp_executesql parameter
   list. */
SET @OrderMonth = DATEPART(mm, @PrmOrderDate)

EXEC sp_executesql @InsertString,
     N'@InsOrderID INT, @InsCustID INT, @InsOrdDate DATETIME,
       @InsOrdMonth INT, @InsDelDate DATETIME',
     @PrmOrderID, @PrmCustomerID, @PrmOrderDate,
     @OrderMonth, @PrmDeliveryDate

GO

在该过程中使用 sp_executesql 比使用 EXECUTE 执行字符串更有效。使用 sp_executesql 时，只生成 12 个版本的 INSERT 字符串，每个月的表 1 个。使用 EXECUTE 时，因为参数值不同，每个 INSERT 字符串均是唯一的。尽管两种方法生成的批处理数相同，但因为 sp_executesql 生成的 INSERT 字符串相似，所以查询优化程序更有可能反复使用执行计划。

请参见

批处理

EXECUTE

运行时生成语句

系统存储过程


sp_fkeys

返回当前环境的逻键外键信息。该过程显示各种外键关系，包括禁用的外键。

语法

sp_fkeys [ @pktable_name = ] 'pktable_name'
[ , [ @pktable_owner = ] 'pktable_owner' ]
[ , [ @pktable_qualifier = ] 'pktable_qualifier' ]
{ , [ @fktable_name = ] 'fktable_name' }
[ , [ @fktable_owner = ] 'fktable_owner' ]
[ , [ @fktable_qualifier = ] 'fktable_qualifier' ]

参数

[@pktable_name =] 'pktable_name'

是表的名称（该表带有主键），使用该表返回目录信息。pktable_name 的数据类型为 sysname，默认值为 NULL。不支持通配符模式匹配。必须提供这个参数或 fktable_name 参数，或者同时提供二者。

[@pktable_owner =] 'pktable_owner'

表所有者的名称（该表带有主键），使用该表返回目录信息。pktable_owner 的数据类型为 sysname，默认值为 NULL。不支持通配符模式匹配。如果没有指定 pktable_owner，则采用基础 DBMS 默认的表可视性规则。

在 Microsoft® SQL Server™ 中，如果当前用户拥有的表具有指定名称，则返回该表的列。如果没有指定 pktable_owner，而且当前用户没有带有指定的 pktable_name 的表，那么该过程便查找数据库所有者所拥有的表，看看其中是否有某个表带有指定的 pktable_name。如果有，则返回该表的列。

[@pktable_qualifier =] 'pktable_qualifier'

是表限定符的名称（该表带有主键）。pktable_qualifier 的数据类型为 sysname，默认值为 NULL。多种 DBMS 产品支持表的三部分命名方式 (qualifier.owner.name)。在 SQL Server 中，该限定符表示数据库名称。在某些产品中，该列表示表所在数据库环境的服务器名。

[@fktable_name =] 'fktable_name'

是表的名称（该表带有外键），使用该表返回目录信息。fktable_name 的数据类型为 sysname，默认值为 NULL。不支持通配符模式匹配。必须提供这个参数或 pktable_name 参数，或者同时提供二者。

[@fktable_owner =] 'fktable_owner'

是表所有者的名称（该表带有外键），使用该表返回目录信息。fktable_owner 的数据类型为 sysname，默认值为 NULL。不支持通配符模式匹配。如果没有指定 fktable_owner，则采用基础 DBMS 默认的表可视性规则。

在 SQL Server 中，如果当前用户拥有一个带有指定名称的表，那么就返回该表的列。如果没有指定 fktable_owner，并且当前用户没有带有指定的 fktable_name 的表，那么该过程就查找数据库所有者所拥有的表，看看其中是否有某个表带有指定的 fktable_name。如果有，则返回该表的列。

[@fktable_qualifier =] 'fktable_qualifier'

是表限定符的名称（该表带有外键）。fktable_qualifier 的数据类型为 sysname，默认值为 NULL。在 SQL Server 中，该限定符表示数据库名称。在某些产品中，该列表示表所在数据库环境的服务器名。

返回代码值

无

结果集
列名 | 数据类型 | 描述
PKTABLE_QUALIFIER | sysname | 表限定符的名称（该表带有主键）。该字段可以为 NULL。
PKTABLE_OWNER | sysname | 表所有者的名称（该表带有主键）。该字段始终返回值。
PKTABLE_NAME | sysname | 表的名称（该表带有主键）。该字段始终返回值。
PKCOLUMN_NAME | sysname | 主键列的名称，针对返回的 TABLE_NAME 的每个列。该字段始终返回值。
FKTABLE_QUALIFIER | sysname | 表限定符的名称（该表带有外键）。该字段可以为 NULL。
FKTABLE_OWNER | sysname | 表所有者的名称（该表带有外键）。该字段始终返回值。
FKTABLE_NAME | sysname | 表的名称（该表带有外键）。该字段始终返回值。
FKCOLUMN_NAME | varchar(32) | 外键列的名称，针对返回的 TABLE_NAME 的每个列。该字段始终返回值。
KEY_SEQ | smallint | 多列主键中列的序列号。该字段始终返回值。
UPDATE_RULE | smallint | 当 SQL 操作是更新时，应用于外键的动作。SQL Server 为这些列返回 0 或 1。开放数据服务网关可返回值 0、1 或 2： 0= 对外键的 CASCADE 修改。 1= 如果有外键，那么进行 NO ACTION 修改。 2=SET_NULL；将外键设置为 NULL。
DELETE_RULE | smallint | 当 SQL 操作是删除时，应用于外键的动作。SQL Server 为这些列返回 0 或 1。开放数据服务网关可返回值 0、1 或 2： 0= 对外键的 CASCADE 修改。 1= 如果有外键，那么进行 NO ACTION 修改。 2=SET_NULL；将外键设置为 NULL。
FK_NAME | sysname | 外键标识符。如果对数据源不可用，则其为 NULL。SQL Server 返回 FOREIGN KEY 约束名。
PK_NAME | sysname | 主键标识符。如果对数据源不可用，则其为 NULL。SQL Server 返回 PRIMARY KEY 约束名。

返回的结果集按 FKTABLE_QUALIFIER、FKTABLE_OWNER、FKTABLE_NAME 及 KEY_SEQ 排序。

注释

如果应用程序编码中包含某些表，而这些表带有禁用的外键，那么可以通过如下方法实现应用程序编码：

  1. 当使用这些表时，临时禁用限制检查（ALTER TABLE NOCHECK 或 CREATE TABLE NOT FOR REPLICATION），稍后再重新启用它。

  2. 使用触发器或应用程序代码强制实施关系。

如果提供了主键表名，而外键表名为 NULL，那么 sp_fkeys 将返回所有这样的表：该表包含指向给定的表的外键。如果提供了外键表名，而主键表名为 NULL，那么 sp_fkeys 将返回所有这样的表：该表通过主键/外键关系与外键表中的外键相关联。

sp_fkeys 存储过程等价于 ODBC 中的 SQLForeignKeys。

权限

执行权限默认授予 public 角色。

示例

下面的示例为 Northwind 数据库中的 Customers 表检索一个外键的列表。

USE Northwind
EXEC sp_fkeys @pktable_name = N'Customers'

请参见

sp_pkeys


sp_foreignkeys

返回引用主键的外键，这些主键在链接服务器中的表上。

语法

sp_foreignkeys [ @table_server = ] 'table_server'
[ , [ @pktab_name = ] 'pktab_name' ]
[ , [ @pktab_schema = ] 'pktab_schema' ]
[ , [ @pktab_catalog = ] 'pktab_catalog' ]
[ , [ @fktab_name = ] 'fktab_name' ]
[ , [ @fktab_schema = ] 'fktab_schema' ]
[ , [ @fktab_catalog = ] 'fktab_catalog' ]

参数

[@table_server =] 'table_server'

链接服务器的名称，将为该服务器返回表信息。table_server 的数据类型为 sysname，无默认值。

[@pktab_name =] 'pktab_name'

是带有主键的表的名称。pktab_name 的数据类型为 sysname，默认值为 NULL。

[@pktab_schema =] 'pktab_schema'

是带有主键的架构名称。pktab_schema 的数据类型为 sysname，默认值为 NULL。在 Microsoft® SQL Server™ 中，该项参数包含所有者名称。

[@pktab_catalog =] 'pktab_catalog'

是带有主键的目录名称。pktab_catalog 的数据类型为 sysname，默认值为 NULL。在 SQL Server 中，该项参数包含数据库名称。

[@fktab_name =] 'fktab_name'

是带有外键的表的名称。fktab_name 的数据类型为 sysname，默认值为 NULL。

[@fktab_schema =] 'fktab_schema'

是带有外键的架构名称。fktab_schema 的数据类型为 sysname，默认值为 NULL。

[@fktab_catalog =] 'fktab_catalog'

是带有外键的目录名称。fktab_catalog 的数据类型为 sysname，默认值为 NULL。

返回代码值

无

结果集

多种 DBMS 产品支持表的三段命名方式 (catalog.schema.table)，这在结果集中有所表现。

列名 | 数据类型 | 描述
PKTABLE_CAT | sysname | 表的目录，主键驻留在该表中。
PKTABLE_SCHEM | sysname | 表的架构，主键驻留在该表中。
PKTABLE_NAME | sysname | 表的名称（该表带有主键）。该字段始终返回值。
PKCOLUMN_NAME | sysname | 主键列的名称，针对返回的 TABLE_NAME 的每个列。该字段始终返回值。
FKTABLE_CAT | sysname | 表的目录，外键驻留在该表中。
FKTABLE_SCHEM | sysname | 表的架构，外键驻留在该表中。
FKTABLE_NAME | sysname | 表的名称（该表带有外键）。该字段始终返回值。
FKCOLUMN_NAME | sysname | 外键列的名称，针对返回的 TABLE_NAME 的每个列。该字段始终返回值。
KEY_SEQ | smallint | 多列主键中列的序列号。该字段始终返回值。
UPDATE_RULE | smallint | 当 SQL 操作是更新时，应用于外键的动作。SQL Server 为这些列返回 0 或 1。开放数据服务网关可返回值 0、1 或 2： 0= 对外键的 CASCADE 修改。 1= 如果有外键，那么进行 NO ACTION 修改。 2=SET_NULL；将外键设置为 NULL。
DELETE_RULE | smallint | 当 SQL 操作是删除时，应用于外键的动作。SQL Server 为这些列返回 0 或 1。开放数据服务网关可返回值 0、1 或 2： 0= 对外键的 CASCADE 修改。 1= 如果有外键，那么进行 NO ACTION 修改。 2=SET_NULL；将外键设置为 NULL。
FK_NAME | sysname | 外键标识符。如果对数据源不可用，则其为 NULL。SQL Server 返回 FOREIGN KEY 约束名。
PK_NAME | sysname | 主键标识符。如果对数据源不可用，则其为 NULL。SQL Server 返回 PRIMARY KEY 约束名。
DEFERRABILITY | smallint | 指明限制检查是否为可延迟的。

在结果集中，FK_NAME 和 PK_NAME 列总是返回 NULL。

注释

sp_foreignkeys 查询 OLE DB 提供程序的 IDBSchemaRowset 接口的 FOREIGN_KEYS 行集，该提供程序与 table_server 相对应。table_name、table_schema、table_catalog 和 column 参数传递到此接口，用以限制返回的行。

示例

下面的示例返回有关 Northwind 数据库中 Customers 表的外键信息。

USE master
EXEC sp_foreignkeys @table_server = N'LONDON1',
   @pktab_name = N'Customers',
   @pktab_catalog = N'Northwind'

请参见

sp_catalogs

sp_column_privileges

sp_indexes

sp_linkedservers

sp_primarykeys

sp_tables_ex

sp_table_privileges

系统存储过程


sp_fulltext_catalog

创建和除去全文目录，然后启动和停止目录的索引操作。可为每个数据库创建多个全文目录。

语法

sp_fulltext_catalog [ @ftcat = ] 'fulltext_catalog_name' ,
[ @action = ] 'action'
[ , [ @path = ] 'root_directory' ]

参数

[@ftcat =] 'fulltext_catalog_name'

全文目录的名称。对于每个数据库，目录名必须是唯一的。fulltext_catalog_name 的数据类型为 sysname。

[@action =] 'action'

将要执行的动作。action 的数据类型为 varchar(20)，可以是下面值中的一个。

说明 可根据需要创建、除去和修改全文目录；但是避免同时对多个目录上的架构进行修改。建议使用 sp_fulltext_table 存储过程执行这些操作。

值 | 描述
Create | 在文件系统中创建一个空的新全文目录，并且向 sysfulltextcatalogs 添加一行，该行与 fulltext_catalog_name 及 root_directory（如果存在的话）值相关。在数据库内，fulltext_catalog_name 必须是唯一的。
Drop | 将 fulltext_catalog_name 从文件系统中删除，以此来除去它，并且删除 sysfulltextcatalogs 中相关的行。如果此目录中包含一个或多个表的索引，此动作将失败。应执行 sp_fulltext_table 'table_name', 'drop' 以除去目录中的表。 如果目录不存在，就会显示错误。
start_incremental | 启动 fulltext_catalog_name 的增量填充。如果目录不存在，就会显示错误。如果一个全文索引填充已经是活动的，那么就会显示一个警告，而不发生填充动作。使用增量填充，只为全文索引检索那些更改过的行，但条件是被全文索引的表中存在一个 timestamp 列。
start_full | 启动 fulltext_catalog_name 的完全填充。即使与此全文目录相关联的每一个表的每一行都进行过索引，也会对其检索全文索引。
Stop | 停止 fulltext_catalog_name 的索引填充。如果目录不存在，就会显示错误。如果已经停止了填充，那么并不会显示警告。
Rebuild | 重建 fulltext_catalog_name，方法是从文件系统中删除现有的全文目录，然后重建全文目录，并使该全文目录与所有带有全文索引引用的表重新建立关联。 重建并不更改数据库系统表中的任何全文元数据，也不会对新创建的全文目录进行重新填充。若要重新填充，必须使用 start_full 或 start_incremental 操作执行 sp_fulltext_catalog。

[@path =] 'root_directory''

是针对 create 动作的根目录（并不是完整的物理路径）。root_directory 的数据类型为 nvarchar(100)，默认值为 NULL，表示使用安装时指定的默认位置。这是 Mssql 目录中的 Ftdata 子目录；例如，C:\Program Files\Microsoft SQL Server\Mssql\Ftdata。指定的根目录必须驻留在同一台计算机的驱动器上，它不仅包含驱动器号，而且不能是相对路径。不支持网络驱动器、可移动驱动器、软盘及 UNC 路径。全文目录必须在与 Microsoft® SQL Server™ 实例相关联的本地硬驱动器上创建。

只有当 action 为 create 时，@path 才有效。对于 create 以外的动作（stop、rebuild，等等），@path 必须为 NULL 或被省略。

返回代码值

0（成功）或 1（失败）

结果集

无

注释

使用 start_full 动作在 fulltext_catalog_name 中创建全文数据的一个完整快照。使用 start_incremental 动作只对数据库中更改过的行重新索引。对于增量索引，在表的一个列中需要一个 timestamp 列。

全文目录及索引数据存储在某些文件中，这些文件创建在全文目录目录中。全文目录目录作为 @path 指定目录中的子目录创建，如果未指定 @path，则在服务器默认值全文目录目录中创建。生成全文目录目录名称的方式可以保证它在服务器上是唯一的。因些，一个服务器上所有的全文目录目录可以共享相同的路径。

权限

只有 sysadmin 固定服务器角色和 db_owner（或更高）固定数据库角色的成员才可以执行 sp_fulltext_catalog。

示例
A. 创建全文目录

下面的示例在 Northwind 数据库中创建一个空的全文目录 Cat_Desc。

USE Northwind
EXEC sp_fulltext_catalog 'Cat_Desc', 'create'
B. 重建全文目录

下面的示例在 Northwind 数据库中重建一个现有的全文目录 Cat_Desc。

USE Northwind
EXEC sp_fulltext_catalog 'Cat_Desc', 'rebuild'
C. 启动全文目录的填充

下面的示例将开始 Cat_Desc 目录的完全填充。

USE Northwind
EXEC sp_fulltext_catalog 'Cat_Desc', 'start_full'
D. 停止全文目录的填充

下面的示例将停止 Cat_Desc 目录的填充。

USE Northwind
EXEC sp_fulltext_catalog 'Cat_Desc', 'stop'
E. 删除全文目录

下面的示例将删除 Cat_Desc 目录。

USE Northwind
EXEC sp_fulltext_catalog 'Cat_Desc', 'drop'

请参见

FULLTEXTCATALOGPROPERTY

sp_fulltext_database

sp_help_fulltext_catalogs

sp_help_fulltext_catalogs_cursor

系统存储过程


sp_fulltext_column

指定表的某个特定列是否参与全文索引。

语法

sp_fulltext_column [ @tabname = ] 'qualified_table_name' ,
[ @colname = ] 'column_name' ,
[ @action = ] 'action'
 [ , [ @language = ] 'language' ]
 [ , [ @type_colname = ] 'type_column_name' ]

参数

[@tabname =] 'qualified_table_name'

一段或两段的表名。该表必须已经存在于当前的数据库中。该表必须有全文索引。qualified_table_name 的数据类型为 nvarchar(517)，无默认值。

[@colname =] 'column_name'

是 qualified_table_name 中某个列的名称。该列必须是一个字符，或是一个 image 列，不能是一个已计算列。column_name 的数据类型为 sysname，无默认值。

说明 SQL Server 能够创建 text 数据的全文索引，text 数据存储在具有 image 数据类型的列中。不对图像或图片编制索引。

[@action =] 'action'

将要执行的动作，action 的数据类型为 varchar(20)，无默认值，可以是下列值中的一个。

值 | 描述
add | 将 qualified_table_name 的 column_name 添加到表的非活动全文索引中。该动作启用全文索引的列。
drop | 从表的非活动全文索引中删除 qualified_table_name 的 column_name。

[@language =] 'language'

存储在列中的数据的语言。下表列出了包括在 SQL Server 中的语言。

说明 当某个列包含使用多种语言的数据或不支持语言的数据时，请使用"中性"设置。由配置选项 default full-text language 指定默认值。

区域设置 | 区域设置 ID
中性 | 0
简体中文 | 0x0804
繁体中文 | 0x0404
荷兰语 | 0x0413
英国英语 | 0x0809
美国英语 | 0x0409
法语 | 0x040c
德国 | 0x0407
意大利 | 0x0410
日语 | 0x0411
朝鲜语 | 0x0412
现代西班牙语 | 0x0c0a
普通瑞典语 | 0x041d

[@type_colname =] 'type_column_name'

qualified_table_name 中某个列的名称，该列存放着 column_name 的文档类型。该列必须为 char、nchar、varchar 或 nvarchar。只有当 column_name 的数据类型为 image 时才使用它。type_column_name 的数据类型为 sysname，无默认值。

返回代码值

0（成功）或 1（失败）

结果集

无

注释

如果全文索引是活动的，应停止所有正在进行的填充。而且，如果一个带活动全文索引的表启用了更改跟踪，SQL 服务器确保该索引是当前的。例如，SQL Server 停止表中所有当前的填充，除去现有的索引，并启动新填充。

如果打开更改跟踪，并需要在保留索引的同时从全文索引中添加或除去列，应停用该表并添加或除去所需的列。这些动作冻结索引。当可以启动填充时，可以稍后再激活该表。

权限

只有 sysadmin 固定服务器角色成员、db_owner 和 db_ddladmin 固定数据库角色成员和对象所有者才能执行 sp_fulltext_column。

示例
将一列添加到全文索引
  1. 下面的示例将来自 Categories 表的 Description 列添加到表的全文索引。
    USE Northwind
EXEC sp_fulltext_column Categories, Description, 'add'
  2. 下面的示例假设在 spanishTbl 表上创建一个全文索引。添加 spanishCol 列：
    sp_fulltext_column 'spanishTbl', 'spanishCol', 'add', 0xC0A

    运行该查询时：

    SELECT *
FROM spanishTbl
WHERE CONTAINS(spanishCol, 'formsof(inflectional, trabajar)')

    结果集将包括带有不同形式的 trabajar的行（要使用），如 trabajo、trabajamos 和 trabajan。

    说明 在单个全文查询函数子句中列出的所有列都必须使用相同的语言。

请参见

OBJECTPROPERTY

sp_help_fulltext_columns

sp_help_fulltext_columns_cursor

sp_help_fulltext_tables

sp_help_fulltext_tables_cursor

系统存储过程


sp_fulltext_database

初始化全文索引，或者从当前数据库中删除所有的全文目录。

语法

sp_fulltext_database [ @action = ] 'action'

参数

[@action =] 'action'

将要执行的动作。action 的数据类型为 varchar(20)，可以是下面值中的一个。

值 | 描述
enable | 在当前数据库中启用全文索引。 重要 使用时要小心。如果已经存在全文目录，那么该过程将除去所有的全文目录，重新创建系统表中指明的任何全文索引，并且将数据库标记为已全文启用。 这个动作并不引发索引填充，为了填充或重新填充全文索引，必须使用 sp_fulltext_catalog 对每个目录发出明确的 start_full 或 start_incremental。
disable | 对于当前数据库，删除文件系统中所有的全文目录，并且将该数据库标记为已经禁用全文索引。这个动作并不在全文目录或表级上更改任何全文索引元数据。

返回代码值

0（成功）或 1（失败）

结果集

无

注释

禁用全文索引并不从 sysfulltextcatalogs 删除行，也不表明启用全文索引的表不再为全文索引进行标记。所有的全文元数据定义仍然在系统表中。但却表明全文索引已为数据库关闭，不再有全文索引活动发生。

权限

只有 sysadmin 固定服务器角色和 db_owner 固定数据库角色的成员才可以执行 sp_fulltext_database。

示例
A. 为全文索引启用数据库

下面的示例为 Northwind 数据库启用全文索引。

USE Northwind
EXEC sp_fulltext_database 'enable'
B. 从数据库中删除所有目录

下面的示例为 Northwind 数据库禁用全文索引。

USE Northwind
EXEC sp_fulltext_database 'disable'

请参见

DATABASEPROPERTY

FULLTEXTSERVICEPROPERTY

系统存储过程


sp_fulltext_service

更改 Microsoft® 搜索服务的（全文检索）属性。

语法

sp_fulltext_service [ @action = ] 'action'
[ , [ @value = ] 'value' ]

参数

[@action =] 'action'

将被更改或重置的属性。action 的数据类型为 varchar(20)，无默认值，可以是下面值中的一个。

值 | 描述
resource_usage | 指定将用于 Microsoft 搜索服务的资源数量。
clean_up | 在文件系统中搜索并删除某些全文目录资源，这些资源在 sysfulltextcatalogs 中没有相应的条目。
connect_timeout | 超时前，Microsoft 搜索服务等待连接到 Microsoft® SQL Server™ 以进行全文填充的秒钟数。 如果在 SQL Server 对数据库的请求作出反应前发生超时，填充无法完成。
data_timeout | 在超时发生前，Microsoft 搜索服务将等待 SQL Sever 数据库服务器为进行全文索引填充而返回的数据所用的秒数。如果在 SQL Server 对数据库的请求作出反应前发生超时，则索引填充将无法完成。

[@value =] 'value'

是指定的属性值。value 的数据类型为 int，默认值为 NULL。下面的表显示了所需值的属性。

属性 | 值
resource_usage | 从 1（背景）到 5（专用），默认值为 3
clean_up | NULL
connect_timeout | 从 1 到 32767
data_timeout | 从 1 到 32767

返回代码值

0（成功）或 1（失败）

结果集

无

注释

当 Microsoft 搜索服务 (MSSearch) 不在运行中时，全文目录中的元数据有时可能会发生更改（如全文目录被除去或数据库被除去时）。除去动作会更改与全文目录有关的元数据，但无法完成执行，因为 Microsoft 搜索服务不在运行中。这将导致 SQL Server 中的全文元数据与文件系统中相关的物理全文目录之间出现不一致。可以使用 sp_fulltext_service 的 clean_up 动作改正这种不一致。Microsoft 搜索服务必须运行。

权限

只有 serveradmin 固定服务器角色的成员或系统管理员才可以执行 sp_fulltext_service。

示例

下面的示例在全文目录上执行一个清除操作。

EXEC sp_fulltext_service 'clean_up'

请参见

FULLTEXTSERVICEPROPERTY

系统存储过程


sp_fulltext_table

为全文索引对表进行标记或去除标记。

语法

sp_fulltext_table [ @tabname = ] 'qualified_table_name'
, [ @action = ] 'action'
[ , [ @ftcat = ] 'fulltext_catalog_name'
, [ @keyname = ] 'unique_index_name' ]

参数

[@tabname =] 'qualified_table_name'

一段或两段的表名。该表必须存在于当前的数据库中。qualified_table_name 的数据类型为 nvarchar(517)，无默认值。

[@action =] 'action'

将要执行的动作。action 的数据类型为 varchar(20)，无默认值，可以是下面值中的一个。

值 | 描述
Create | 为 qualified_table_name 引用的表创建全文索引的元数据，并且指定该表的全文索引数据应该驻留在 fulltext_catalog_name 中。该动作还将 unique_index_name 的用法指派为全文键列。这个唯一的索引必须已经存在，并且必须在表的某个列上已经定义。 完成全文目录填充后才能对该表执行全文检索。
Drop | 对于 qualified_table_name，除去全文索引上的元数据。如果全文索引是活动的，那么在除去它之前会自动停用它。在除去全文索引之前，不必删除列。
Activate | 停用全文索引后，激活为 qualified_table_name 聚集全文索引数据的能力。在激活全文索引之前，应该至少有一列参与这个全文索引。 一旦为索引添加了第一列，全文索引便自动成为活动的。如果从索引中除去最后一列，该索引将成为非活动的。如果打开更改跟踪，激活非活动的索引将会启动新填充。 请注意，这个动作并没有实际填充全文索引，只是将表注册在文件系统中的全文目录，这样，在进行下一次全文索引填充时，就可以检索来自 qualified_table_name 的行。
Deactivate | 停用 qualified_table_name 的全文索引，使得无法再为 qualified_table_name 聚集全文索引数据。全文索引元数据依然保留，并且该表还可以被重新激活。 如果打开更改跟踪，停用一个活动的索引将会冻结索引状态：任何正在进行的填充都将停止，不再将更多的更改传播到索引。
start_change_tracking | 启动全文索引的增量填充。如果该表没有时间戳，那么就启动全文索引的完全填充。开始跟踪表发生的变化。 全文更改跟踪不跟踪对类型为 image、text 或 ntext 的全文索引列所执行的任何 WRITETEXT 或 UPDATETEXT 操作。
stop_change_tracking | 停止跟踪表发生的变化。
update_index | 将当前一系列跟踪的变化传播到全文索引。
Start_background_updateindex | 在变化发生时，开始将跟踪的变化传播到全文索引。
Stop_background_updateindex | 在变化发生时，停止将跟踪的变化传播到全文索引。
start_full | 启动表的全文索引的完全填充。
start_incremental | 启动表的全文索引的增量填充。
停止 | 停止完全或增量填充。

[@ftcat =] 'fulltext_catalog_name'

是 create 动作有效的现有全文目录名。对于所有其它动作，该参数必须为 NULL。fulltext_catalog_name 的数据类型为 sysname，默认值为 NULL。

[@keyname =] 'unique_index_name'

有效的单键列，create 动作的 qualified_table_name 上的唯一的非空索引。对于所有其它动作，该参数必须为 NULL。unique_index_name 的数据类型为 sysname，默认值为 NULL。

返回代码值

0（成功）或 1（失败）

结果集

无

注释

为一个特定的表停用全文索引后，在下一次完全填充之前，现有的全文索引仍保留在原位；可是，由于 Microsoft® SQL Server™ 关闭了在停用表上的查询，所以不能使用该索引。

如果重新激活该表，而不重新填充索引，旧索引仍可用于对其余任何启用了全文索引的非新的列进行查询。删除列的数据在指定全部全文列 (*) 搜索的查询中相匹配。

为全文索引定义一个表后，把全文唯一键列从一个数据类型切换到另一个数据类型。切换方法可以是更改该列的数据类型，也可以是把全文唯一键从一列更改到另一列上。采用上述方法，在后续查询时，完全重新填充可能会引致失败并返回错误信息。"对于全文检索键值 key_value，转换到类型 data_type 失败。"为防止发生这种情况，使用 sp_fulltext_table 的"除去"动作为该表除去全文定义，并使用 sp_fulltext_table 和 sp_fulltext_column 对它进行重新定义。

如果全文唯一键列是个字符列或 Unicode 字符列，则必须将其定义为 450 字节或更少。

权限

只有 sysadmin 固定服务器角色成员、db_owner 和 db_ddladmin 固定数据库角色成员和对象所有者才能执行 sp_fulltext_table。

示例
A. 为全文索引启用表

下面的示例为 Northwind 数据库的 Categories 表创建全文索引元数据。Cat_Desc 是全文目录。PK_Categories 为 Categories 上唯一的、单列索引。

USE Northwind
EXEC sp_fulltext_table 'Categories', 'create', 'Cat_Desc', 'PK_Categories'
.. Add some columns
EXEC sp_fulltext_column 'Categories','Description','add'
.. Activate the index
EXEC sp_fulltext_table 'Categories','activate'
B. 激活并传播跟踪更改
当更改发生时，下面的示例激活并启动将所跟踪的更改传播到全文索引。
USE Northwind
GO
EXEC sp_fulltext_table Categories, 'Start_change_tracking'
EXEC sp_fulltext_table Categories, 'Start_background_updateindex'
C. 删除全文索引

下面的示例为 Northwind 数据库的 Categories 表删除全文索引元数据。

USE Northwind

EXEC sp_fulltext_table 'Categories', 'drop'

请参见

INDEXPROPERTY

OBJECTPROPERTY

sp_help_fulltext_tables

sp_help_fulltext_tables_cursor

sp_helpindex

系统存储过程


sp_get_log_shipping_monitor_info

返回有关"日志传送对"的状态信息。日志传送对是主服务器—主数据库和辅助服务器—辅助数据库的集合。

语法

sp_get_log_shipping_monitor_info
[@primary_server_name =] 'primary_server_name'
[@primary_database_name =] 'primary_database_name'
[@secondary_server_name =] 'secondary_server_name'
[@secondary_database_name =] 'secondary_database_name'

参数

[@primary_server_name =] 'primary_server_name'

主服务器名称和模式。primary_server_name 的数据类型为 sysname，默认值为"%"。

[@primary_database_name =] 'primary_database_name'

主数据库的名称或模式。primary_database_name 的数据类型为 sysname，默认值为"%"。

[@secondary_server_name =] 'secondary_server_name'

辅助服务器的名称或模式。secondary_server_name 的数据类型为 sysname，默认值为"%"。

[@secondary_database_name =] 'secondary_database_name'

辅助数据库的名称或模式。secondary_database_name 的数据类型为 sysname，默认值为"%"。

结果集

下表显示了结果集中包含的信息。

列名 | 数据类型 | 描述
primary_server_name | sysname | 主服务器名称。
primary_database_name | sysname | 主数据库名称。
secondary_server_name | sysname | 辅助服务器名称。
secondary_database_name | sysname | 辅助数据库名称。
backup_threshold | int | 自上次备份后至出现阀值警报错误前的时间长度（按分钟计）。
backup_threshold_alert | int | 当超过备份阀值时将出现的错误。
backup_threshold_alert_enabled | bit | 指定当超过备份阀值时是否发出警报。 1：警报。 0：无警报。
last_backup_filename | nvarchar(500) | 上一个备份文件的名称。
last_backup_last_updated | datetime | 上一个文件备份的日期和时间。
backup_outage_start_time | int | 辅助服务器上计划的停歇开始时间（HHMMSS 格式）。如果在计划停歇期间超过备份阀值，则不发出警报。
backup_outage_end_time | int | 主服务器上计划停歇的停止时间（HHMMSS 格式）。如果在计划停歇期间超过备份阀值，则不发出警报。
backup_outage_weekday_mask | int | 一星期中计划停歇的那一天。
backup_in_sync | int | 表明上次备份是否出现在备份同步阀值之内。 1：在备份同步阀值之内出现。 -1：在停歇窗口内出现。
last_copied_filename | nvarchar(500) | 上一个已复制文件的名称。
last_copied_last_updated | datetime | 上一次文件备份的日期和时间。
last_loaded_filename | nvarchar(500) | 上一个加载的文件名称。
last_loaded_last_updated | datetime | 上一次加载文件的日期和时间。
copy_enabled | bit | 表明是否启用辅助数据库复制。 1：启用。 0：不启用。
load_enabled | bit | 表明是否启用辅助数据库加载。 1：启用。 0：不启用。
out_of_sync_threshold | int | 自上一次加载后至出现错误前的时间长度（按分钟计）。
load_threshold_alert | int | 当超过 sync 阀值范围时将出现的错误。
load_threshold_alert_enabled | bit | 表明当超过同步阀值范围时是否发出警报。 1：警报。 0：无警报。
load_outage_start_time | int | 计划停歇开始的开始时间（HHMMSS 格式）。如果在计划停歇期间超过同步阀值范围，则不发出警报。
load_outage_end_time | int | 计划停歇开始的结束时间（HHMMSS 格式）。如果在计划停歇期间超过同步阀值范围，则不发出警报。
load_outage_weekday_mask | int | 一星期中计划停歇的那一天。
load_in_sync | int | 表明上次备份是否出现在备份同步阀值之内。 1：在阀值范围内出现。 -1：在停歇窗口中出现。
maintenance_plan_id | uniqueidentifier | 主服务器上的维护计划 ID。Maintenance_plan_id 可以为 NULL。
secondary_plan_id | uniqueidentifier | 辅助服务器上的日志传送计划 ID。
allow_role_change | bit | 显示辅助服务器角色是否可更改。 1=角色可更改。 0=角色不可更改。

权限

仅 sysadmin 固定服务器角色成员可以执行 sp_get_log_shipping_monitor_info。

示例

下面的示例返回关于以"pubs"开头的目的数据库的所有日志传送对的信息。

EXEC   sp_get_log_shipping_monitor_info @secondary_database_name = 'pubs%'


sp_getapplock

锁定应用程序资源。

语法

sp_getapplock [ @Resource = ] 'resource_name',
[ @LockMode = ] 'lock_mode'
[ , [ @LockOwner = ] 'lock_owner' ]
[ , [ @LockTimeout = ] 'value' ]

参数

[@Resource =] 'resource_name'

由客户端应用程序指定的锁资源名称。应用程序必须确保资源的唯一性。指定名称经过内部哈希计算后成为可以存储在 SQL Server 锁管理器中的值，resource name 的数据类型为 nvarchar(255)，没有默认值。

[@LockMode =] 'lock_mode'

锁模式。lock_mode 的数据类型为 nvarchar(32)，没有默认值，它可以为下列值之一：Shared、Update、Exclusive、IntentExclusive、IntentShared。

[@LockOwner =] 'lock_owner'

是锁的所有者。lock_owner 的数据类型为 nvarchar(32)，并且可以是 Transaction（默认值）或 Session。当 lock_owner 值为默认值或当显式地指定 Transaction 时，则必须从事务内执行 sp_getapplock。

[@LockTimeout =] 'value'

锁超时值，以毫秒为单位。默认值与 @@LOCK_TIMEOUT 返回的值相同。若要指定对于不能立即授予的锁请求应返回一个错误，而不应等待锁，请指定 0。

返回代码值

>= 0（成功）或 <= 0（失败）

Value | 结果
0 | 锁已同时成功授予。
1 | 在等待释放其它不兼容锁后成功授予锁。
-1 | 锁请求超时。
-2 | 锁请求被取消。
-3 | 选择锁请求作为死锁牺牲品。
-999 | 参数验证或其它调用错误。

注释

在资源上设置的锁与当前事务或当前会话相关联。当事务提交或回滚时，将释放与当前事务相关联的锁。当会话注销时，将释放与会话相关联的锁。服务器因任何原因而关闭时，都将释放锁。

可以使用 sp_releaseapplock 显式释放锁。如果应用程序为同一锁资源多次调用 sp_getapplock，则必须调用同样次数的 sp_releaseapplock 来释放锁。

如果为同一锁资源多次调用 sp_getapplock，但是指定了不同的锁模式，则对资源的影响将是两个锁模式的联合。多数情况下，这意味着将锁模式提升为现有模式和新请求模式中更强的模式。即使出现锁释放调用，也会把持这一更强的模式直到最终释放锁。例如，在以下调用顺序中，将以排它模式而非共享模式控制资源。

USE Northwind
GO
BEGIN TRAN
DECLARE @result int
EXEC @result = sp_getapplock @Resource = 'Form1',
            @LockMode = 'Shared'
EXEC @result = sp_getapplock @Resource = 'Form1',
            @LockMode = 'Exclusive'
EXEC @result = sp_releaseapplock @Resource = 'Form1'
COMMIT TRAN

如果应用程序锁发生死锁，则该死锁不会回滚请求此应用程序锁的事务。必须手工完成任何可能导致返回值的潜在请求的回滚。因此，建议在代码中使用错误检查，如果返回某些值（例如 -3），则启动 ROLLBACK TRANSACTION 或选择性操作。

以下是示例：
USE Northwind
GO
BEGIN TRAN
DECLARE @result int
EXEC @result = sp_getapplock @Resource = 'Form1',
            @LockMode = 'Exclusive'
IF @result = '-3'
BEGIN
      ROLLBACK TRAN
END
ELSE
BEGIN
   EXEC @result = sp_releaseapplock @Resource = 'Form1'
   COMMIT TRAN
END

SQL Server 使用当前数据库 ID 来限定资源。因此，如果在不同数据库上执行 sp_getapplock，即便使用了相同的参数值，结果仍然是在单独资源上使用单独锁。

使用 sp_lock 检查锁信息或使用 SQL 事件探查器监视锁。

权限

执行权限默认授予 public 角色。

示例

下面的示例在 Northwind 数据库中的资源"Form1"上设置共享锁，使其与当前事务关联。

USE
Northwind
GO
BEGIN TRAN
DECLARE @result int
EXEC @result = sp_getapplock @Resource = 'Form1',
                   @LockMode = 'Shared'
COMMIT TRAN

请参见

sp_releaseapplock


sp_getbindtoken

返回事务的唯一标识符。 该唯一标识符被引用为绑定令牌。sp_getbindtoken 返回用于在客户端之间共享事务的字符串表示法。

语法

sp_getbindtoken [@out_token =] 'return_value' OUTPUT [, @for_xp_flag]

参数

[@out_token =] 'return_value'

是用于共享事务的令牌。return_value 的数据类型为 varchar(255)，没有默认值。

@for_xp_flag

常量。如果等于 1，则创建一个绑定令牌，该令牌可被传递给扩展存储过程以回调服务器。

返回代码值

无

结果集

无

注释

在 Microsoft SQL Server 2000 中，sp_getbindtoken 仅当在活动事务内部执行该存储过程时才返回有效令牌。 否则，SQL Server 将返回一个错误信息。例如：

说明 在 SQL Server 7.0 中，即使在活动事务外部执行该存储过程，sp_getbindtoken 也返回有效令牌。下例工作于 SQL Server 7.0 环境中。

/*open a database*/
USE MYDB
GO
/*declare bind token; no active transaction*/
DECLARE @bind_token varchar(255)
/*return bind token*/
EXECUTE sp_getbindtoken @bind_token OUTPUT
/*get an error message*/
Server: Msg 3921, Level 16, State 1, Procedure sp_getbindtoken, Line 4
Cannot get a transaction token if there is no transaction active.
Reissue the statement after a transaction has been started.

当 sp_getbindtoken 用于在打开的事务内登记分布式事务连接时，SQL Server 2000 返回同一令牌。例如：

USE MYDB
   DECLARE @bind_token varchar(255)
   BEGIN TRAN
      EXECUTE sp_getbindtoken @bind_token OUTPUT
      SELECT @bind_token AS Token
      BEGIN DISTRIBUTED TRAN
         EXECUTE sp_getbindtoken @bind_token OUTPUT
         SELECT @bind_token AS Token
/*returns the same token*/
Token
-----
PKb'gN5<9aGEedk_16>8U=5---/5G=--
(1 row(s_) affected)

Token
-----
PKb'gN5<9aGEedk_16>8U=5---/5G=--
(1 row(s_) affected)

绑定令牌可以与 sp_bindsession 一起使用，将新会话绑定到同一事务上。绑定令牌仅在每个 SQL Server 的本地机上有效且不能在多个 SQL Server 实例中共享。

若要获得并传递绑定令牌，则必须在运行 sp_bindsession 之前运行 sp_getbindtoken，以共享同一锁空间。如果获得绑定令牌，则 sp_bindsession 可正确运行。

说明 建议使用 srv_getbindtoken 开放式数据服务 API 来获得从扩展存储过程处使用的绑定令牌。

权限

执行权限默认授予 public 角色。

示例
A. 获得绑定令牌

下面的示例获得绑定令牌并显示绑定令牌名称。

DECLARE @bind_token varchar(255)
BEGIN TRAN
EXECUTE sp_getbindtoken @bind_token OUTPUT
SELECT @bind_token AS Token

下面是结果集：

Token
----------------------------------------------------------
\0]---5^PJK51bP<1F<-7U-]ANZ
B. 使用 @for_xp_flag 参数

下面的示例指定用于向服务器回叫的常量。

DECLARE @bind_token varchar(255)
BEGIN TRAN
EXECUTE sp_getbindtoken @bind_token OUTPUT, 1
SELECT @bind_token AS Token

如果 @for_xp_flag 没有使用常量，将返回下列错误信息：

Msg 214, Level 16, State 1, Server <server_name>, Procedure <procedure_name>, Line 5
Cannot convert parameter @for_xp_flag to type constant expected by procedure.

请参见

sp_bindsession

系统存储过程

srv_getbindtoken


sp_grantdbaccess

为 Microsoft® SQL Server™ 登录或 Microsoft Windows NT® 用户或组在当前数据库中添加一个安全帐户，并使其能够被授予在数据库中执行活动的权限。

语法

sp_grantdbaccess [@loginame =] 'login'
[,[@name_in_db =] 'name_in_db' [OUTPUT]]

参数

[@loginame =] 'login'

当前数据库中新安全帐户的登录名称。Windows NT 组和用户必须用 Windows NT 域名限定，格式为"域\用户"，例如 LONDON\Joeb。登录不能使用数据库中已有的帐户作为别名。login 的数据类型为 sysname，没有默认值。

[@name_in_db =] 'name_in_db' [OUTPUT]

数据库中帐户的名称。name_in_db 是 sysname 类型的 OUTPUT 变量，默认值为 NULL。如果没有指定，则使用 login。如果将其指定为 NULL 值的 OUTPUT 变量，则设置 @name_in_db 为 login。当前数据库不必存在 name_in_db。

返回代码值

0（成功）或 1（失败）

注释

SQL Server 用户名可以包含 1 到 128 个字符，包括字母、符号和数字。但是，用户名不能：

  • 含有反斜线符号 (\)。

  • 为 NULL，或为空字符串 ('')。

在使用安全帐户访问数据库之前，必须授予它对当前数据库的访问权。使用 sp_grantdbaccess 仅可以管理当前数据库中的帐户。若要从数据库中删除帐户，请使用 sp_revokedbaccess。

如果当前数据库中没有 guest 安全帐户，而且 login 为 guest，则可以添加 guest 的安全帐户。

sa 登录不能添加到数据库中。

不能从用户定义的事务中执行 sp_grantdbaccess。

权限

只有 sysadmin 固定服务器角色、db_accessadmin 和 db_owner 固定数据库角色的成员才能执行 sp_grantdbaccess。

示例

下面的示例在当前数据库中为 Windows NT 用户 Corporate\GeorgeW 添加帐户，并取名为 Georgie。

EXEC sp_grantdbaccess 'Corporate\GeorgeW', 'Georgie'

请参见

sp_revokedbaccess

系统存储过程


sp_grantlogin

使 Microsoft® Windows NT® 用户或组帐户得以使用 Windows 身份验证连接到 Microsoft SQL Server™。

语法

sp_grantlogin [@loginame =] 'login'

参数

[@loginame =] 'login'

是要添加的 Windows NT 用户或组的名称。Windows NT 组和用户必须用 Windows NT 域名限定，格式为"域\用户"，例如 London\Joeb。login 的数据类型为 sysname，没有默认值。

返回代码值

0（成功）或 1（失败）

注释

使用 sp_grantlogin 可恢复先前执行的 sp_denylogin 对 Windows NT 用户造成的影响。

使用 sp_addlogin 可使 SQL Server 登录得以连接到 SQL Server。

尽管在执行 sp_grantlogin 后，登录可以连接到 SQL Server，但是，除非在每个登录必须访问的数据库中都创建该登录的用户帐户，否则对用户数据库的访问仍会被拒绝。使用 sp_grantdbaccess 在每个用户数据库中创建用户帐户。

在用户定义事务内无法执行 sp_grantlogin。

权限

仅 sysadmin 或 securityadmin 固定服务器角色的成员可以执行 sp_grantlogin。

示例

下面的示例使 Windows NT 用户 Corporate\BobJ 得以连接到 SQL Server。

EXEC sp_grantlogin 'Corporate\BobJ'

或

EXEC sp_grantlogin [Corporate\BobJ]

请参见

sp_addlogin

sp_revokelogin

sp_denylogin

系统存储过程


sp_help

报告有关数据库对象（sysobjects 表中列出的任何对象）、用户定义数据类型或 Microsoft® SQL Server™ 所提供的数据类型的信息。

语法

sp_help [ [ @objname = ] name ]

参数

[@objname =] name

是 sysobjects 中的任意对象的名称，或者是在 systypes 表中任何用户定义数据类型的名称。Name 的数据类型为 nvarchar(776)，默认值为 NULL。不能使用数据库名称。

返回代码值

0（成功）或 1（失败）

结果集

返回的结果集取决于 name 是否已指定、何时指定以及它是何种数据库对象等因素。

  1. 如果执行不带参数的 sp_help，则返回当前数据库中现有的所有类型对象的摘要信息。
    列名 | 数据类型 | 描述
    Name | nvarchar(128) | 对象名
    Owner | nvarchar(128) | 对象所有者
    Object_type | nvarchar(31) | 对象类型

  2. 如果 name 是 SQL Server 数据类型或用户定义数据类型，则 sp_help 返回此结果集。
    列名 | 数据类型 | 描述
    Type_name | nvarchar(128) | 数据类型名称。
    Storage_type | nvarchar(128) | SQL Server 类型名称。
    Length | smallint | 数据类型的物理长度（以字节为单位）。
    Prec | int | 精度（总的数字位数）。
    Scale | int | 小数点右边的数字位数。
    Nullable | varchar(35) | 指明是否允许 NULL 值：是或否。
    Default_name | nvarchar(128) | 绑定到该类型的默认值名称。如果没有绑定默认值，则为 NULL。
    Rule_name | nvarchar(128) | 绑定到该类型的规则名称。如果没有绑定默认值，则为 NULL。
    Collation | sysname | 数据类型的排序规则。如果是非字符数据类型，则为 NULL。

  3. 如果 name 是任意数据库对象（而不是数据类型），那么 sp_help 将返回此结果集，以及基于指定对象类型的其它结果集。
    列名 | 数据类型 | 描述
    Name | nvarchar(128) | 表名
    Owner | nvarchar(128) | 表的所有者
    Type | nvarchar(31) | 表的类型
    Created_datetime | datetime | 创建的日期表

    根据指定的数据库对象，sp_help 返回其它结果集。

    如果 name 是系统表、用户表或者视图，则 sp_help 返回这些结果集（例外，对于视图，不返回描述数据文件在文件组中所处位置的结果集）。

    1. 按列对象返回其它结果集：
      列名 | 数据类型 | 描述
      Column_name | nvarchar(128) | 列名。
      Type | nvarchar(128) | 列数据类型。
      Computed | varchar(35) | 指出是否计算了在列中的值：（是或否）。
      Length | int | 以字节为单位的列长度。
      Prec | char(5) | 列精度。
      Scale | char(5) | 列数值范围。
      Nullable | varchar(35) | 指出在列中是否允许 NULL 值：是或否。
      TrimTrailingBlanks | varchar(35) | 剪裁尾随空格（是或否）。
      FixedLenNullInSource | varchar(35) | 只是为了向后兼容。
      Collation | sysname | 列的排序规则。如果是非字符数据类型，则为 NULL。

    2. 按标识列返回的其它结果集：
      列名 | 数据类型 | 描述
      Identity | nvarchar(128) | 其数据类型被声明为标识的列名。
      Seed | numeric | 标识列的起始值。
      Increment | numeric | 此列中的值所使用的增量。
      Not For Replication int 当重复登录（例如 sqlrepl）试图在表中插入数据时，无法强制使用 IDENTITY 属性：
      1 = True
      0 = False

    3. 按列返回的其它结果集：
      列名 | 数据类型 | 描述
      RowGuidCol | sysname | 全局唯一标识符列的名称。

    4. 按文件组返回的其它结果集：
      列名 | 数据类型 | 描述
      Data_located_on_filegroup | nvarchar(128) | 数据所在的文件组（主要文件组、次要文件组或事务日志）。

    5. 按索引返回的其它结果集：
      列名 | 数据类型 | 描述
      index_name | sysname | 索引名。
      index_description | varchar(210) | 索引的描述。
      index_keys | nvarchar(2078) | 生成索引所在列的列名。

    6. 按约束返回的其它结果集
      列名 | 数据类型 | 描述
      constrain_type | nvarchar(146) | 约束的类型。
      constrain_name | nvarchar(128) | 约束名。
      delete_action nvarchar(9) 指明 DELETE 操作是：无操作、层叠或暂缺。

      （仅适用于 FOREIGN KEY 约束。）
      update_action nvarchar(9) 指明 UPDATE 操作是：无操作、层叠或暂缺。

      （仅适用于 FOREIGN KEY 约束。）
      status_enabled | varchar(8) | 指明是否启用约束：启用、禁用或暂缺。（仅适用于 CHECK 和 FOREIGN KEY 约束。）
      Status_for_replication | varchar(19) | 指明约束是否用于复制。（仅适用于 CHECK 和 FOREIGN KEY 约束。）
      constrain_keys | nvarchar(2078) | 构成约束的列名。或者（对于默认值和规则而言）指定义默认值或规则的文本。

    7. 按引用对象返回的其它结果集：
      列名 | 数据类型 | 描述
      Table is referenced by | nvarchar(516) | 识别引用表的其它数据库对象。

  4. 如果 name 是系统存储过程或扩展存储过程，那么 sp_help 将返回此结果集。
    列名 | 数据类型 | 描述
    Parameter_name | nvarchar(128) | 存储过程参数名。
    Type | nvarchar(128) | 存储过程参数的数据类型。
    Length | smallint | 最大物理存储长度（以字节为单位）。
    Prec | int | 精度（总的数字位数）。
    Scale | int | 小数点右边的数字个数。
    Param_order | smallint | 参数的顺序。

注释

sp_help 过程仅在当前数据库中查找对象。

当没有指定 name 时，sp_helptrigger 列出当前数据库中所有对象的名称、所有者和对象类型。sp_helptrigger 提供有关触发器的信息。

权限

执行权限默认授予 public 角色。

示例
A. 返回有关所有对象的信息

下面的示例列出有关 sysobjects 中每个对象的信息。

USE master
EXEC sp_help
B. 返回有关单个对象的信息

下面的示例显示有关 publishers 表的信息。

USE pubs
EXEC sp_help publishers

请参见

sp_helpgroup

sp_helpindex

sp_helprotect

sp_helpserver

sp_helptrigger

sp_helpuser

系统存储过程


sp_help_alert

报告有关为服务器定义的警报的信息。

语法

sp_help_alert [ [ @alert_name = ] 'alert_name' ]
[ , [ @order_by = ] 'order_by' ]
[ , [ @alert_id = ] alert_id ]
[ , [ @category_name = ] 'category' ]

参数

[@alert_name =] 'alert'

是警报名称。alert_name 的数据类型为 nvarchar(128)。如果没有指定 alert_name，那么将返回有关所有警报的信息。

[@order_by =] 'order_by'

是用于生成结果的排序次序。order_by 的数据类型为 sysname，默认值为 N 'name'。

[@alert_id =] alert_id]

是用于报告有关信息的警报标识号。alert_id 的数据类型为 int，默认值为 NULL。

[@category_name =] 'category'

是警报的分类。category 的数据类型为 sysname，默认值为 NULL。

返回代码值

0（成功）或 1（失败）

结果集
列名 | 数据类型 | 描述
id | int | 系统指派的唯一整数标识符。
name | sysname | 警报名称（例如 Demo:Full msdb log）。
event_source | nvarchar(100) | 事件源。对于 Microsoft® SQL Server™ 7.0 版，事件源始终为 MSSQLServer。
event_category_id | int | 保留。
event_id | int | 保留。
message_id | int | 定义警报的消息错误号。（通常对应于 sysmessages 表中的错误号）。如果使用了严重度来定义警报，则 message_id 为 0 或 NULL。
severity | int | 定义警报的严重度级别（从 9 到 25、110、120、130 或 140）。
enabled | tinyint | 当前警报的状态是已启用 (1) 还是未启用 (0)。不发送未启用警报。
delay_between_responses | int | 响应的等待期间（以秒为单位）。
last_occurrence_date | int | 上次出现警报的日期。
last_occurrence_time | int | 上次出现警报的时间。
last_response_date | int | SQLServerAgent 服务上次响应警报的日期。
last_response_time | int | SQLServerAgent 服务上次响应警报的时间。
notification_message | nvarchar(512) | 发送给操作员作为电子邮件或寻呼机提示部分的可选的其它消息。
include_event_description | tinyint | Microsoft Windows NT® 应用程序日志中对 SQL Server 错误的描述是否应成为通知消息的一部分。
database_name | sysname | 必须出现错误才能使警报得以激发的数据库。如果数据库名为 NULL，那么无论是否出现错误都激发警报。
event_description_keyword | nvarchar(100) | Windows NT 应用程序日志中的 SQL Server 错误的描述，该错误描述必须类似于所提供的字符次序。
occurrence_count | int | 警报出现的次数。
count_reset_date | int | 上次重置 occurrence_count 的日期。
count_reset_time | int | 上次重置 occurrence_count 的时间。
job_id | uniqueidentifier | 作业标识号。
job_name | sysname | 响应警报而执行的按需作业。
has_notification | int | 如果将这个警报通知给一个或多个操作员，则为非零。该值是下列值中的一个或多个（用 OR 连起来）： 1= 有电子邮件通知 2= 有呼叫提示 4= 有网络发送通知。
Flags | int | 保留。
performance_condition | nvarchar(512) | 如果 type 是 2，那么此列将显示性能条件的定义。否则此列为 NULL。
category_name | sysname | 保留。对于 SQL Server 7.0 始终是"[Uncategorized]"。
type | int | 1 = SQL Server 事件警报 2 = SQL Server 性能警报

注释

必须从 msdb 数据库执行 sp_help_alert。

权限

只有 sysadmin 固定服务器角色的成员才可以执行 sp_help_alert。

示例

下面的示例报告有关 Demo:Sev.25 Errors 警报的信息。

EXEC sp_help_alert 'Demo: Sev. 25 Errors'

请参见

sp_add_alert

sp_update_alert

系统存储过程


sp_help_category

提供有关作业、警报或操作员的指定类的信息。

语法

sp_help_category [ [ @class = ] 'class' ]
[ , [ @type = ] 'type' ]
[ , [ @name = ] 'name' ]
[ , [ @suffix = ] suffix ]

参数

[@class =] 'class'

有关所请求信息的类别。class 的数据类型为 varchar(8)，默认值为 JOB。class 可以是下列值之一。

值 | 描述
JOB | 提供有关作业分类的信息。
ALERT | 提供有关警报分类的信息。
OPERATOR | 提供有关操作员分类的信息。

[@type =] 'type'

是所请求信息的分类类型。type 的数据类型为 varchar(12)，默认值为 NULL，可以是下列值之一。

值 | 描述
LOCAL | 本地作业分类。
MULTI -SERVER | 多服务器作业分类。
NONE | 非 JOB 类的分类。

[@name =] 'name'

是所请求信息的分类名称。name 的数据类型为 sysname，默认值为 NULL。

[@suffix =] suffix

指定结果集中的 category_type 列是 ID 还是名称。suffix 的数据类型为 bit，默认值为 0。如果是 1 则将 category_type 显示为名称，如果是 0 则将其显示为 ID。

返回代码值

0（成功）或 1（失败）

结果集
列名 | 数据类型 | 描述
category_id | int | 分类 ID
category_type | tinyint | 分类的类型： 1 = 本地 2 = 多服务器 3 = 无
name | sysname | 分类名

注释

必须在 msdb 数据库中执行 sp_help_category。

如果未指定参数，则结果集提供有关所有作业分类的信息。

权限

执行权限默认授予 public 角色。任何可以执行该过程的用户都可以对下列内容进行创建、删除或更新操作：作业、作业步骤、作业分类、作业调度、作业服务器、任务或作业历史信息。

示例
A. 返回本地作业信息

下面的示例返回有关在本地管理的作业的信息。

USE msdb
EXEC sp_help_category @type = 'LOCAL'
B. 返回警报信息

下面的示例返回有关 Replication 警报分类的有关信息。

USE msdb
EXEC sp_help_category @class = 'ALERT', @name = 'Replication'

请参见

sp_add_category

sp_delete_category

sp_update_category

系统存储过程


sp_help_downloadlist

针对所提供的作业，列出在 sysdownloadlist 系统表中的所有行，或者在未指定作业的情况下列出所有行。

语法

sp_help_downloadlist [ [ @job_id = ] job_id | [ @job_name = ] 'job_name' ]
[ , [ @operation = ] 'operation' ]
[ , [ @object_type = ] 'object_type' ]
[ , [ @object_name = ] 'object_name' ]
[ , [ @target_server = ] 'target_server' ]
[ , [ @has_error = ] has_error ]
[ , [ @status =] status ]
[ , [ @date_posted = ] date_posted ]

参数

[@job_id =] job_id

是为其返回信息的作业标识号。job_id 的数据类型为 uniqueidentifier，默认值为 NULL。

[@job_name =] 'job_name'

是作业名。job_name 的数据类型为 sysname，默认值为 NULL。

[@operation =] 'operation'

是用于指定作业的有效操作。operation 的数据类型为 varchar(64)，默认值为 NULL，而且可以是下列值之一。

值 | 描述
DEFECT | 请求目标服务器脱离 Master SQLServerAgent 服务的服务器操作。
DELETE | 删除整个作业的作业操作。
INSERT | 插入整个作业或者刷新现有作业的作业操作。如果可用，则该操作将包含所有的作业步骤与作业调度。
RE-ENLIST | 使目标服务器再次将其登记信息（包括轮询间隔和时区）发送到多服务器域的服务器操作。目标服务器还将重新下载 MSXOperator 详细信息。
SET-POLL | 为目标服务器轮询多服务器域设置间隔（以秒为单位）的服务器操作。如已指定，则 value 将被解释为所要求的间隔值，其范围从 10 到 28,800。
START | 请求开始执行作业的作业操作。
STOP | 请求停止执行作业的作业操作。
SYNC-TIME | 使目标服务器将其系统时钟与多服务器域时钟同步的服务器操作。因为这是一个费时操作，所以只能有限制地偶尔执行。
UPDATE | 仅更新作业的 sysjobs 信息，而不更新作业步骤或作业调度的作业操作。它自动由 sp_update_job 调用。

[@object_type =] 'object_type'

是指定作业的对象类型。object_type 的数据类型为 varchar(64)，默认值为 NULL。object_type 可以是 JOB 也可以是 SERVER。有关 object_type 值的更多信息，请参见 sp_add_category。

[@object_name =] 'object_name'

是对象名。object_name 的数据类型为 sysname，默认值为 NULL。如果 object_type 为 JOB，则 object_name 为作业名称。如果 object_type 为 SERVER，则 object_name 是服务器名称。

[@target_server =] 'target_server'

是目标服务器名称。target_server 的数据类型为 varchar(30)，默认值为 NULL。

[@has_error =] has_error

指明作业是否对错误作出反应。has_error 的数据类型为 tinyint，默认值为 NULL，它表示不对错误作出反应。而 1 表示对所有错误都应作出反应。

[@status =] status

是作业状态。status 的数据类型为 tinyint，默认值为 NULL。

[@date_posted =] date_posted

是日期和时间，在指定的日期和时间上或之后建立的所有项都应该包括在结果集中。date_posted 的数据类型为 datetime，默认值为 NULL。

返回代码值

0（成功）或 1（失败）

结果集
列名 | 数据类型 | 描述
instance_id | int | 指令的唯一整数标识号。
source_server | nvarchar(30) | 发出指令的服务器的计算机名。在 Microsoft® SQL Server™ 7.0 中，这始终是主 (MSX) 服务器的计算机名。
operation_code | nvarchar(4000) | 指令的操作代码。
object_name | sysname | 受指令影响的对象。
object_id | uniqueidentifier | 受指令影响的对象的标识号（用于作业对象的 job_id，或者是用于服务器对象的 0x00），或者特定于 operation_code 的数据值。
target_server | nvarchar(30) | 下载此指令的目标服务器。
error_message | nvarchar(1024) | 目标服务器在处理此指令的过程中遇到问题时发出的错误信息（如果有）。说明：任何错误信息都将阻止目标服务器进一步下载。
date_posted | datetime | 指令发布到表的日期。
date_downloaded | datetime | 目标服务器下载指令的日期。
Status | tinyint | 作业状态： 0 = 尚未下载 1 = 已成功下载。

权限

执行该过程的权限默认授予 sysadmin 固定服务器角色或 db_owner 固定数据库角色，他们可以将权限授予其他用户。

示例

下面的示例针对 Weekly Sales Data Backup 作业列出 sysdownloadlist 中的行。

USE msdb
EXEC sp_help_downloadlist @job_name='Weekly Sales Data Backup',    @operation='UPDATE',
   @object_type='JOB',
   @object_name='Weekly Sales Backup',
   @target_server='SEATTLE2',
   @has_error=1,
   @status=NULL,
   @date_posted=NULL

请参见

系统存储过程


sp_help_fulltext_catalogs

返回指定的全文目录的 ID、名称、根目录、状态以及全文索引表的数量。

语法

sp_help_fulltext_catalogs [ @fulltext_catalog_name = ] 'fulltext_catalog_name'

参数

[@fulltext_catalog_name =] 'fulltext_catalog_name'

是全文目录的名称。fulltext_catalog_name 的数据类型为 sysname。如果省略该参数或参数值为 NULL，则返回与当前数据库相关的所有全文目录的信息。

返回代码值

0（成功）或 1（失败）

结果集

下表显示结果集，按 ftcatid 排序。

列名 | 数据类型 | 描述
ftcatid | smallint | 全文目录的标识符。
NAME | sysname | 全文目录的名称。
PATH | nvarchar(260) | 全文目录根目录的物理位置。NULL 表示在安装期间确定的默认目录。（这是 Microsoft® SQL Server™ 目录下的 Ftdata 子目录；例如 C:\Mssql\Ftdata。）
STATUS | integer | 目录的全文索引填充状态： 0 = 空闲 1 = 正在进行完全填充 2 = 暂停 3 = 已中止 4 = 正在恢复 5 = 关闭 6 = 正在进行增量填充 7 = 生成索引 8 = 磁盘已满。已暂停 9 = 更改跟踪
NUMBER_FULLTEXT_TABLES | integer | 与目录相关的全文索引表的数量。

权限

执行权限默认授予 public 角色的成员。

示例

下面的示例返回有关 Cat_Desc 全文目录的信息。

USE Northwind
EXEC sp_help_fulltext_catalogs 'Cat_Desc'

请参见

FULLTEXTCATALOGPROPERTY

sp_fulltext_catalog

sp_help_fulltext_catalogs_cursor

系统存储过程


sp_help_fulltext_catalogs_cursor

使用游标返回指定的全文目录的 ID、名称、根目录、状态和全文索引表的数量。

语法

sp_help_fulltext_catalogs [ @cursor_return = ] @cursor_variable OUTPUT ,
[ @fulltext_catalog_name = ] 'fulltext_catalog_name'

参数

[@cursor_return =] @cursor_variable OUTPUT

是 cursor 类型的输出变量。游标是只读的可滚动动态游标。

[@fulltext_catalog_name =] 'fulltext_catalog_name'

是全文目录的名称。fulltext_catalog_name 的数据类型为 sysname。如果省略该参数或参数值为 NULL，则返回与当前数据库相关的所有全文目录的信息。

返回代码值

0（成功）或 1（失败）

结果集
列名 | 数据类型 | 描述
ftcatid | smallint | 全文目录的标识符。
NAME | sysname | 全文目录的名称。
PATH | nvarchar(260) | 全文目录根目录的物理位置。NULL 表示在安装期间确定的默认目录。（这是 Microsoft® SQL Server™ 目录下的 Ftdata 子目录，例如 C:\Mssql\Ftdata。）
STATUS | integer | 目录的全文索引填充状态： 0 = 空闲 1 = 正在进行完全填充 2 = 暂停 3 = 已中止 4 = 正在恢复 5 = 关闭 6 = 正在进行增量填充 7 = 生成索引 8 = 磁盘已满，已暂停 9 = 更改跟踪
NUMBER_FULLTEXT_TABLES | integer | 与目录相关的全文索引表的数量。

权限

执行权限默认授予 public 角色。

示例

下面的示例返回有关 Cat_Desc 全文目录的信息。

USE Northwind
GO
DECLARE @mycursor CURSOR
EXEC sp_help_fulltext_catalogs_cursor @mycursor OUTPUT, 'Cat_Desc'
FETCH NEXT FROM @mycursor
WHILE (@@FETCH_STATUS <> -1)
   BEGIN
      FETCH NEXT FROM @mycursor
   END
CLOSE @mycursor
DEALLOCATE @mycursor
GO

请参见

FULLTEXTCATALOGPROPERTY

sp_fulltext_catalog

sp_help_fulltext_catalogs

系统存储过程


sp_help_fulltext_columns

返回为全文检索指派的列。

语法

sp_help_fulltext_columns [ [ @table_name = ] 'table_name' ] ]
[ , [ @column_name = ] 'column_name' ]

参数

[@table_name =] 'table_name'

是请求全文索引信息的一段或两段表名。table_name 的数据类型为 nvarchar(517)，默认值为 NULL。如果省略 table_name，则检索每个全文索引表的全文索引列信息。

[@column_name =] 'column_name'

是请求全文索引元数据的列名。column_name 的数据类型为 sysname，默认值为 NULL。如果省略 column_name 或其值为 NULL，则返回 table_name 每个全文索引列的全文列信息。如果也省略 table_name 或其值为 NULL，则返回数据库中所有表的每个全文索引列的全文索引列信息。

返回代码值

0（成功）或 1（失败）

结果集
列名 | 数据类型 | 描述
TABLE_OWNER | sysname | 表所有者。这是创建该表的数据库用户的名称。
TABLE_ID | integer | 表 ID。
TABLE_NAME | sysname | 表的名称。
FULLTEXT_COLID | integer | 全文索引列的列 ID。
FULLTEXT_COLUMN_NAME | sysname | 为索引指派的全文索引表中的列。
FULLTEXT_BLOBTP_COLNAME | sysname | 指定全文索引列文档类型的全文索引表中的列。该值只适用于全文索引列为 image 列的情况。
FULLTEXT_BLOBTP_COLID | integer | 文档类型列的列 ID。该值只适用于全文索引列为 image 列的情况。
FULLTEXT_LANGUAGE | sysname | 用于对列进行全文检索的语言。

权限

执行权限默认授予 public 角色的成员。

示例

下面的示例返回在 Categories 表中为全文索引指派的列的信息。

USE Northwind
EXEC sp_help_fulltext_columns Categories

下面是结果集：

TABLE_OWNER     TABLE_NAME    FULLTEXT_COLID  FULLTEXT_COLUMN_NAME
-----------     -----------   --------------  --------------------
dbo             Categories    3               Description

请参见

COLUMNPROPERTY

sp_fulltext_column

sp_help_fulltext_columns_cursor

系统存储过程


sp_help_fulltext_columns_cursor

使用游标返回为全文索引指派的列。

语法

sp_help_fulltext_columns_cursor [ @cursor_return = ] @cursor_variable OUTPUT
[ , [ @table_name = ] 'table_name' ]
[ , [ @column_name = ] 'column_name' ]

参数

[@cursor_return =] @cursor_variable OUTPUT

是 cursor 类型的输出变量。结果游标是只读的可滚动动态游标。

[@table_name =] 'table_name'

是请求全文索引信息的一段或两段表名。table_name 的数据类型为 nvarchar(517)，默认值为 NULL。如果省略 table_name，则检索每个全文索引表的全文索引列信息。

[@column_name =] 'column_name'

是需要全文索引元数据的列名。column_name 的数据类型为 sysname，默认值为 NULL。如果省略 column_name 或其值为 NULL，则返回 table_name 每个全文索引列的全文列信息。如果也省略 table_name 或其值为 NULL，则返回数据库中所有表的每个全文索引列的全文索引列信息。

返回代码值

0（成功）或 1（失败）

结果集
列名 | 数据类型 | 描述
TABLE_OWNER | sysname | 表所有者。这是创建该表的数据库用户的名称。
TABLE_ID | integer | 表 ID。
TABLE_NAME | sysname | 表名。
FULLTEXT_COLID | integer | 全文索引列的列 ID。
FULLTEXT_COLUMN_NAME | sysname | 为索引指派的全文索引表中的列。
FULLTEXT_BLOBTP_COLNAME | sysname | 指定全文索引列文档类型的全文索引表中的列。该值只适用于全文索引列为 image 列的情况。
FULLTEXT_BLOBTP_COLID | integer | 文档类型列的列 ID。该值只适用于全文索引列为 image 列的情况。
FULLTEXT_LANGUAGE | sysname | 用于对列进行全文检索的语言。

权限

执行权限默认授予 public 角色的成员。

示例

下面的示例返回有关列的信息，这些列已指派给数据库的所有表中的全文索引。

USE Northwind
GO
DECLARE @mycursor CURSOR
EXEC sp_help_fulltext_columns_cursor @mycursor OUTPUT
FETCH NEXT FROM @mycursor
WHILE (@@FETCH_STATUS <> -1)
   BEGIN
      FETCH NEXT FROM @mycursor
   END
CLOSE @mycursor
DEALLOCATE @mycursor
GO

请参见

COLUMNPROPERTY

sp_fulltext_column

sp_help_fulltext_columns

系统存储过程


sp_help_fulltext_tables

返回为全文索引注册的表的列表。

语法

sp_help_fulltext_tables [ [ @fulltext_catalog_name = ] 'fulltext_catalog_name' ]
[ , [ @table_name = ] 'table_name' ]

参数

[@fulltext_catalog_name =] 'fulltext_catalog_name'

是全文目录的名称。fulltext_catalog_name 的数据类型为 sysname，默认值为 NULL。如果省略 fulltext_catalog_name 或其值为 NULL，则返回与数据库相关的所有全文索引表。如果指定 fulltext_catalog_name，但省略 table_name 或其值为 NULL，则检索与此目录相关的每个全文索引表的全文索引信息。如果指定 fulltext_catalog_name 和 table_name，并且 table_name 与 fulltext_catalog_name 相关，则返回一行结果，否则会产生错误。

[@table_name =] 'table_name'

是请求全文元数据的一段或两段表的名称。table_name 的数据类型为 nvarchar(517)，默认值为 NULL。如果只指定 table_name，则只返回与 table_name 相关的行。

返回代码值

0（成功）或 1（失败）

结果集
列名 | 数据类型 | 描述
TABLE_OWNER | sysname | 表所有者。这是创建该表的数据库用户的名称。
TABLE_NAME | sysname | 表名。
FULLTEXT_KEY_INDEX_NAME | sysname | 在指派为唯一键列的列上施加 UNIQUE 约束的索引。
FULLTEXT_KEY_COLID | integer | 以 FULLTEXT_KEY_NAME 标识的唯一索引的列 ID。
FULLTEXT_INDEX_ACTIVE | integer | 指定该表中全文索引标记的列是否适于查询： 0 = 非活动 1 = 活动
FULLTEXT_CATALOG_NAME | sysname | 全文索引数据所在的全文目录。

权限

执行权限默认授予 public 角色的成员。

示例

下面的示例返回与 Cat_Desc 全文目录相关的全文索引表的名称。

USE Northwind
EXEC sp_help_fulltext_tables 'Cat_Desc'

请参见

INDEXPROPERTY

OBJECTPROPERTY

sp_fulltext_table

sp_help_fulltext_tables_cursor

系统存储过程


sp_help_fulltext_tables_cursor

使用游标返回为全文索引注册的表的列表。

语法

sp_help_fulltext_tables_cursor [ @cursor_return = ] @cursor_variable OUTPUT
[ , [ @fulltext_catalog_name = ] 'fulltext_catalog_name' ]
[ , [ @table_name = ] 'table_name' ]

参数

[@cursor_return =] @cursor_variable OUTPUT

是 cursor 类型的输出变量。游标是只读的可滚动动态游标。

[@fulltext_catalog_name =] 'fulltext_catalog_name'

是全文目录的名称。fulltext_catalog_name 的数据类型为 sysname，默认值为 NULL。如果省略 fulltext_catalog_name 或其值为 NULL，则返回与数据库相关的所有全文索引表。如果指定 fulltext_catalog_name，但省略 table_name 或其值为 NULL，则检索与此目录相关的每个全文索引表的全文索引信息。如果指定 fulltext_catalog_name 和 table_name，并且 table_name 与 fulltext_catalog_name 相关，则返回一行结果，否则会产生错误。

[@table_name =] 'table_name'

是请求全文元数据的一段或两段表的名称。table_name 的数据类型为 nvarchar(517)，默认值为 NULL。如果只指定 table_name，则只返回与 table_name 相关的行。

返回代码值

0（成功）或 1（失败）

结果集
列名 | 数据类型 | 描述
TABLE_OWNER | sysname | 表所有者。这是创建该表的数据库用户的名称。
TABLE_NAME | sysname | 表名。
FULLTEXT_KEY_INDEX_NAME | sysname | 在指派为唯一键列的列上施加 UNIQUE 约束的索引。
FULLTEXT_KEY_COLID | integer | 以 FULLTEXT_KEY_NAME 标识的唯一索引的列 ID。
FULLTEXT_INDEX_ACTIVE | integer | 指定该表中全文索引标记的列是否适于查询： 0 = 非活动 1 = 活动
FULLTEXT_CATALOG_NAME | sysname | 全文索引数据所在的全文目录。

权限

执行权限默认授予 public 角色的成员。

示例

下面的示例返回与 Cat_Desc 全文目录相关的全文索引表的名称。

USE Northwind
GO
DECLARE @mycursor CURSOR
EXEC sp_help_fulltext_tables_cursor @mycursor OUTPUT, 'Cat_Desc'
FETCH NEXT FROM @mycursor
WHILE (@@FETCH_STATUS <> -1)
   BEGIN
      FETCH NEXT FROM @mycursor
   END
CLOSE @mycursor
DEALLOCATE @mycursor
GO

请参见

INDEXPROPERTY

OBJECTPROPERTY

sp_fulltext_table

sp_help_fulltext_tables

系统存储过程


sp_help_job

返回有关 SQLServerAgent 服务用来在 Microsoft® SQL Server™ 中执行自动活动的那些作业的信息。

语法

sp_help_job [ [ @job_id = ] job_id ]
[ , [ @job_name = ] 'job_name' ]
[ , [ @job_aspect = ] 'job_aspect' ]
[ , [ @job_type = ] 'job_type' ]
[ , [ @owner_login_name = ] 'login_name' ]
[ , [ @subsystem = ] 'subsystem' ]
[ , [ @category_name = ] 'category' ]
[ , [ @enabled = ] enabled ]
[ , [ @execution_status = ] status ]
[ , [ @date_comparator = ] 'date_comparison' ]
[ , [ @date_created = ] date_created ]
[ , [ @date_last_modified = ] date_modified ]
[ , [ @description = ] 'description_pattern' ]

参数

[@job_id =] job_id

是作业标识号。job_id 的数据类型为 uniqueidentifier，默认值为 NULL。

[@job_name =] 'job_name'

是作业的名称。job_name 为 sysname 类型，其默认值为 NULL。

说明 必须指定 job_id 或 job_name，但不能两个都指定。

[@job_aspect =] 'job_aspect'

是要显示的作业特性。job_aspect 的数据类型为 varchar(9)，默认值为 NULL，并且可以是下列值之一。

值 | 描述
ALL | 作业特征信息
JOB | 作业信息
SCHEDULES | 调度信息
STEPS | 作业步骤信息
TARGETS | 目标信息

[@job_type =] 'job_type'

是报表中要包括的作业类型。job_type 的数据类型为 varchar(12)，默认值为 NULL。job_type 可以是 LOCAL 或 MULTI-SERVER。

[@owner_login_name =] 'login_name'

是作业所有者的登录名。login_name 的数据类型为 sysname，默认值为 NULL。

[@subsystem =] 'subsystem'

是对子系统的描述。subsystem 的数据类型为 nvarchar(60)，默认设置为 NULL。

[@category_name =] 'category'

是分类名。category 的数据类型为 sysname，默认值为 NULL。

[@enabled =] enabled

是一个数字，表示是显示启用作业的信息，还是显示禁用作业的信息。enabled 的数据类型为 tinyint，默认值为 NULL。1 表示启用的作业，0 表示禁用的作业。

[@execution_status =] status

是作业的执行状态。status 的数据类型为 int，默认值为 NULL，而且可以是下列值之一。

值 | 描述
0 | 只返回那些空闲的或挂起的作业。
1 | 正在执行。
2 | 正在等待线程。
3 | 在两次重试之间。
4 | 空闲。
5 | 挂起。
7 | 正在执行完成操作。

[@date_comparator =] 'date_comparison'

是在 date_created 和 date_modified 的比较中所使用的比较运算符。date_comparison 的数据类型为 char(1)，并且可以是 =、< 或 >。

[@date_created =] date_created

是创建作业的日期。date_created 的数据类型为 datetime，默认值为 NULL。

[@date_last_modified =] date_modified

是最后修改作业的日期。date_modified 的数据类型为 datetime，默认值为 NULL。

[@description =] 'description_pattern'

是作业的描述。description_pattern 的数据类型为 nvarchar(512)，默认值为 NULL。description_pattern 可以包含 SQL Server 通配符，以实现模式匹配。

返回代码值

0（成功）或 1（失败）

结果集

如果没有指定参数，那么 sp_help_job 返回下面的结果集。

列名 | 数据类型 | 描述
job_id | uniqueidentifier | 作业的唯一 ID。
originating_server | nvarchar(30) | 作业来自的服务器名称。
name | sysname | 作业的名称。
enabled | tinyint | 表示是否启用待执行的作业。
description | nvarchar(512) | 对作业的描述。
start_step_id | int | 执行作业的起始步骤 ID。
category | sysname | 作业分类。
owner | sysname | 作业所有者。
notify_level_eventlog | int | 位掩码，它表示在何种情况下通知事件应记录到 Microsoft Windows NT® 应用程序日志中。可以是下列值之一： 0 = 从不 1 = 当作业成功时 2 = 当作业失败时 3 = 当作业完成时（无论作业结果如何）
notify_level_email | int | 位掩码，它指明当作业完成时，在什么情况下应该发送一个提示电子邮件。可能值与 notify_level_eventlog 的可能值相同。
notify_level_netsend | int | 位掩码，它指明当作业完成时，在什么情况下应该发送一个网络消息。可能值与 notify_level_eventlog 的可能值相同。
notify_level_page | int | 位掩码，它指明当作业完成时，在什么情况下应该发送一个呼叫。可能值与 notify_level_eventlog 的可能值相同。
notify_email_operator | sysname | 要通知的操作员的电子邮件名称。
notify_netsend_operator | sysname | 当发送网络消息时，所使用的计算机或用户的名称。
notify_page_operator | sysname | 当发送寻呼时，所使用的计算机或用户的名称。
delete_level | int | 位掩码，它指明当作业完成时，在什么情况下应该删除作业。可能值与 notify_level_eventlog 的可能值相同。
date_created | datetime | 作业的创建日期。
date_modified | datetime | 上次修改作业的日期。
version_number | int | 作业的版本（每次修改作业时都自动对其进行更新）。
last_run_date | int | 作业上一次开始执行的日期。
last_run_time | int | 作业上一次开始执行的时间。
last_run_outcome | int | 作业上一次运行时所得到的结果： 0 = 失败 1 = 成功 3 = 取消 5 = 未知
next_run_date | int | 调度作业下一次运行的日期。
next_run_time | int | 调度作业下一次运行的时间。
next_run_schedule_id | int | 下一个运行的调度的标识号。
current_execution_status | int | 当前的执行状态。
current_execution_step | sysname | 作业中当前的执行步骤。
current_retry_attempt | int | 如果作业正在运行，并且已经重试过该步骤，那么这就是当前的重试尝试。
has_step | int | 作业具有的作业步骤的个数。
has_schedule | int | 作业具有的作业调度的个数。
has_target | int | 作业具有的目标服务器的个数。
Type | int | 1 = 本地作业。 2 = 多服务器作业。 0 = 作业没有目标服务器。

如果指定了 job_id 或 job_name，那么 sp_help_job 针对作业步骤、作业调度及作业目标服务器返回下面这些额外的结果集。

下面是针对作业步骤的结果集。

列名 | 数据类型 | 描述
step_id | int | 步骤的唯一（是针对该作业的）标识符。
step_name | sysname | 步骤的名称。
Subsystem | nvarchar(40) | 子系统，在该子系统中执行步骤命令。
Command | nvarchar(3200) | 执行的命令。
Flags | nvarchar(4000) | 控制步骤行为的值的位掩码。
cmdexec_success_code | int | 对于CmdExec 步骤，这是成功命令的进程退出代码。
on_success_action | nvarchar(4000) | 步骤成功时的操作： 1 = 成功后退出。 2 = 失败后退出。 3 = 转到下一步。 4 = 转至步骤。
on_success_step_id | int | 如果 on_success_action 为 4，即指明下一步执行步骤 4。
on_fail_action | nvarchar(4000) | 步骤失败时所采取的操作。值与 on_success_action 的值相同。
on_fail_step_id | int | 如果 on_fail_action 为 4，即指明下一步执行步骤 4。
Server | sysname | 保留。
database_name | sysname | 对于 Transact=SQL 步骤，这是将要在其中执行命令的数据库。
database_user_name | sysname | 对于 Transact=SQL 步骤，这是数据库用户上下文，命令将在这个数据库用户上下文中执行。
retry_attempts | int | 在将步骤认定为已经失败之前，应该对命令进行重试的最大次数（如果命令没有成功）。
retry_interval | int | 两次重试尝试之间的间隔（以分钟为单位）。
os_run_priority | varchar(4000) | 保留。
output_file_name | varchar(200) | 应该将命令的输出写入到其中的文件（只针对 Transact=SQL 及 CmdExec 步骤）。
last_run_outcome | int | 步骤上一次运行的结果： 0 = 失败 1 = 成功 3 = 取消 5 = 未知
last_run_duration | int | 步骤上一次运行的持续时间（以秒为单位）。
last_run_retries | int | 步骤上一次运行时，命令进行重试的次数。
last_run_date | int | 步骤上一次开始执行的日期。
last_run_time | int | 步骤上一次开始执行的时间。

下面是针对作业调度的结果集。

列名 | 数据类型 | 描述
schedule_id | int | 调度的标识符（对所有作业是唯一的）。
schedule_name | sysname | 调度的名称（只对这个作业是唯一的）。
Enabled | int | 指明调度是活动的 (1) 还是不活动的 (0)。
freq_type | int | 指明何时执行作业的值： 1 = 一次 4 = 每日一次 8 = 每周一次 16 = 每月一次 32 = 每月一次，与 freq_interval 相关 64 = 在 SQLServerAgent 服务启动时运行。
freq_interval | int | 执行作业的日子。该值依赖于 freq_type 的值。有关更多信息，请参见 sp_add_jobschedule。
freq_subday_type | int | freq_subday_interval 的单位。有关更多信息，请参见 sp_add_jobschedule。
freq_subday_interval | int | 在作业的每次执行之间所发生的 freq_subday_type 的周期个数。有关更多信息，请参见 sp_add_jobschedule。
freq_relative_interval | int | 在每个月中，freq_interval 的已调度作业的发生情况。有关更多信息，请参见 sp_add_jobschedule。
freq_recurrence_factor | int | 作业的已调度执行日期之间的间隔月数。
active_start_date | int | 开始执行作业的日期。
active_end_date | int | 结束执行作业的日期。
active_start_time | int | 在 active_start_date 那一天，开始执行作业的时间。
active_end_time | int | 在 active_end_date 那一天，结束执行作业的时间。
date_created | datetime | 创建调度的日期。
schedule_description | nvarchar(4000) | 对调度的英语描述（如果需要的话）。
next_run_date | int | 调度下一次引发作业运行的日期。
next_run_time | int | 调度下一次引发作业运行的时间。

下面是针对目标服务器的结果集。

列名 | 数据类型 | 描述
server_id | int | 目标服务器的标识符。
server_name | nvarchar(30) | 目标服务器的计算机名称。
enlist_date | datetime | 将目标服务器登记到主服务器 (MSX) 的日期。
last_poll_date | datetime | 目标服务器上一次轮询 MSX 的日期。
last_run_date | int | 在这个目标服务器上，作业上一次开始执行的日期。
last_run_time | int | 在这个目标服务器上，作业上一次开始执行的时间。
last_run_duration | int | 作业上一次在这个目标服务器上运行的持续时间。
last_run_outcome | tinyint | 作业上一次在这个服务器上运行的结果： 0 = 失败 1 = 成功 3 = 取消 5 = 未知
last_outcome_message | nvarchar(1024) | 作业上一次在这个目标服务器上运行时的结果消息。

权限

执行权限默认授予 msdb 数据库中的 public 角色。可以执行该过程的用户和 sysadmin 固定角色成员的用户都可以对下列内容进行创建、删除或更新操作：作业、作业步骤、作业分类、作业调度、作业服务器、任务或作业历史信息。

非 sysadmin 固定角色成员的用户可使用 sp_help_job 只查看自己的作业。

当由 sysadmin 固定服务器角色成员的用户唤醒调用 sp_help_job 时，将在运行 SQL Server 服务的安全上下文中执行 sp_help_job。当用户不是 sysadmin 组的成员时，sp_help_job 将模拟 SQL Server 代理的代理帐户，该帐户是使用 xp_sqlagent_proxy_account 指定的。如果代理帐户不可用，则 sp_help_job 将失败。仅对于 Microsoft® Windows NT® 4.0 和 Windows 2000 才如此。在 Windows 9.x 上无模拟，并且始终在启动 Windows 9.x 的用户的安全上下文中执行 sp_help_job。

示例
A. 列出所有作业的信息

下面的示例执行不带参数的 sp_help_job 过程，从而为当前在 msdb 数据库中定义的所有作业返回信息。

USE msdb
EXEC sp_help_job
B. 列出特定作业的信息

下面的示例列出了名为 Archive Tables 的多服务器作业的所有作业特征信息，该作业在其中启用，并且自创建以来已经被更改。

USE msdb
EXEC sp_help_job NULL, 'Archive Tables', 'ALL', 'MULTI-SERVER', 'janetl',
   NULL, NULL, 1, 1, '<', '12/01/97', '6/25/98', NULL

请参见

sp_add_job

sp_delete_job

sp_update_job

系统存储过程


sp_help_jobhistory

为多服务器管理域中的服务器提供有关作业的信息。

语法

sp_help_jobhistory [ [ @job_id = ] job_id ]
[ , [ @job_name = ] 'job_name' ]
[ , [ @step_id = ] step_id ]
[ , [ @sql_message_id = ] sql_message_id ]
[ , [ @sql_severity = ] sql_severity ]
[ , [ @start_run_date = ] start_run_date ]
[ , [ @end_run_date = ] end_run_date ]
[ , [ @start_run_time = ] start_run_time ]
[ , [ @end_run_time = ] end_run_time ]
[ , [ @minimum_run_duration = ] minimum_run_duration ]
[ , [ @run_status = ] run_status ]
[ , [ @minimum_retries = ] minimum_retries ]
[ , [ @oldest_first = ] oldest_first ]
[ , [ @server = ] 'server' ]
[ , [ @mode = ] 'mode' ]

参数

[@job_id =] job_id

作业标识号。job_id 的数据类型为 uniqueidentifier，默认值为 NULL。

[@job_name =] 'job_name'

是作业名称。job_name 的数据类型为 sysname，默认值为 NULL。

[@step_id =] step_id

是步骤标识号。step_id 的数据类型为 int，默认值为 NULL。

[@sql_message_id =] sql_message_id

执行作业时 Microsoft® SQL Server™ 返回的错误信息的标识号。sql_message_id 的数据类型为 int，默认值为 NULL。

[@sql_severity =] sql_severity

是当执行作业时由 SQL Server 返回的错误信息的严重级别。sql_severity 的数据类型为 int，默认值为 NULL。

[@start_run_date =] start_run_date

是作业开始执行的日期。start_run_date 的数据类型为 int，默认值为 NULL。必须以 YYYYMMDD 形式输入 start_run_date，其中 YYYY 表示四个字符的年份，MM 表示两个字符的月份名称，DD 则表示两个字符的日期名称。

[@end_run_date =] end_run_date

是完成作业的日期。end_run_date 的数据类型为 int，默认值为 NULL。必须以 YYYYMMDD 形式输入 end_run_date，其中 YYYY 表示四个字符的年份，MM 表示两个字符的月份名称，DD 则表示两个字符的日期名称。

[@start_run_time =] start_run_time

是作业开始执行的时间。start_run_time 的数据类型为 int，默认值为 NULL。必须以 HHMMSS 形式输入 start_run_time，其中 HH 表示两个字符的天中小时，MM 表示两个字符的天中分钟，SS 则表示两个字符的天中秒。

[@end_run_time =] end_run_time

是作业结束执行的时间。end_run_time 的数据类型为 int，默认值为 NULL。必须以 HHMMSS 形式输入 end_run_time，其中 HH 表示两个字符的天中小时，MM 表示两个字符的天中分钟，SS 则表示两个字符的天中秒。

[@minimum_run_duration =] minimum_run_duration

是完成作业所用的最小时间长度。minimum_run_duration 的数据类型为 int，默认值为 NULL。必须以 HHMMSS 形式输入 minimum_run_duration，其中 HH 表示一天中两个字符的小时，MM 表示两个字符的天中分钟，SS 则表示两个字符的天中秒。

[@run_status =] run_status

是作业的执行状态。run_status 的数据类型为 int，默认值为 NULL，而且可以是下列值之一。

值 | 描述
0 | 失败
1 | 已成功
2 | 重试（只针对步骤）
3 | 已取消
4 | 进行中的消息
5 | 未知

[@minimum_retries =] minimum_retries

是作业应该重试运行的最少次数。minimum_retries 的数据类型为 int，默认值为 NULL。

[@oldest_first =] oldest_first

表示是否使用最早的作业最先提交的方式来提交输出结果。oldest_first 的数据类型为 int，默认值为 0，这表示首先提交最晚的作业。而 1 表示首先提交最早的作业。

[@server =] 'server'

是在其上执行作业的服务器名称。server 的数据类型为 nvarchar(30)，默认值为 NULL。

[@mode =] 'mode'

表示 SQL Server 是打印结果集中的所有列 (FULL)，还是打印列的汇总。mode 的数据类型为 varchar(7)，默认值为 SUMMARY。

返回代码值

0（成功）或 1（失败）

结果集

实际的列列表依赖于 mode 的值。下面显示了列的最综合的集合，当 mode 为 FULL 时，就会返回这样的集合。

列名 | 数据类型 | 描述
instance_id | int | 历史条目标识号。
job_id | uniqueidentifier | 作业标识号。
job_name | sysname | 作业名称。
step_id | int | 步骤标识号（对于作业历史为 0）。
step_name | sysname | 步骤名称（对于作业历史为 NULL）。
sql_message_id | int | 对于 Transact-SQL 步骤，当运行命令时，最近遇到的 Transact-SQL 错误号。
sql_severity | int | 对于Transact-SQL 步骤，当运行命令时，遇到的最高 Transact-SQL 错误严重度。
message | nvarchar(1024) | 作业或步骤历史消息。
run_status | int | 作业或步骤的结果。
run_date | int | 作业或步骤开始执行的日期。
run_time | int | 作业或步骤开始执行的时间。
run_duration | int | 以 HHMMSS 格式表示的作业或步骤的已执行时间。
operator_emailed | nvarchar(20) | 接收有关该作业的电子邮件的操作员（对于步骤历史为 NULL）。
operator_netsent | nvarchar(20) | 接收有关该作业的网络消息的操作员（对于步骤历史为 NULL）。
operator_paged | nvarchar(20) | 接收有关该作业的呼叫的操作员（对于步骤历史为 NULL）。
retries_attempted | int | 步骤的重试次数（对于作业历史始终为 0）。
server | nvarchar(30) | 步骤或作业在其上执行的服务器。始终为 (local)。

注释

sp_help_jobhistory 返回一个带有指定的已调度作业的历史记录的报表。如果没有指定参数，那么该报表包含所有已调度作业的历史。

权限

sysadmin 固定服务器角色或 db_owner 固定数据库角色在默认情况下有执行此过程的权限，他们可以将权限授予其他用户。

示例

下面的示例显示了失败的作业以及失败的作业步骤的所有列及所有作业信息，这些失败的作业和失败的作业步骤带有 50100 错误信息（一个用户定义的错误信息），严重度为 20，起始日期为 1998 年 6 月 1 日，在 LONDON2 服务器上。

USE msdb
EXEC sp_help_jobhistory NULL, NULL, NULL, 50100, 20, 19980601, NULL,
   NULL, NULL, NULL, 0, NULL, 1, 'LONDON2', 'FULL'

请参见

sp_purge_jobhistory

系统存储过程


sp_help_jobschedule

返回有关作业的调度的信息，SQL Server 企业管理器使用这些作业来执行自动的活动。

语法

sp_help_jobschedule
 [ @job_id =] job_id |
[ @job_name = ] 'job_name''
 [ , [ @schedule_name = ] 'schedule_name' ] |
[ , [ @schedule_id = ] schedule_id ]

参数

[@job_id =] job_id

是作业标识号。job_id 的数据类型为 uniqueidentifier，默认值为 NULL。

[@job_name =] 'job_name'

是作业名称。job_name 的数据类型为 varchar(100)，默认值为 NULL。

说明 必须指定 job_id 或 job_name，但不能两个都指定。

[@schedule_name =] 'schedule_name'

是作业的调度项目名称。schedule_name 的数据类型为 varchar(100)，默认值为 NULL。

{[@schedule_id =] schedule_id

是作业的调度项目的标识号。schedule_id 的数据类型为 int，默认值为 NULL。

返回代码值

0（成功）或 1（失败）

结果集
列名 | 数据类型 | 描述
schedule_id | int | 调度标识号。
schedule_name | sysname | 调度的名称。
enabled | int | 指明调度是被启用 (1)，还是不被启用 (0)。
freq_type | int | 指明何时执行作业的值。 1 = 一次 4 = 每日一次 8 = 每周一次 16 = 每月一次 32 = 每月一次，与 freq_ interval 相关 64 = 在 SQLServerAgent 服务启动时运行。
freq_interval | int | 执行作业的日子。该值依赖于 freq_type 的值。有关更多信息，请参见 sp_add_jobschedule。
freq_subday_type | int | freq_subday_interval 的单位。有关更多信息，请参见 sp_add_jobschedule。
freq_subday_interval | int | 在作业的每次执行之间所发生的 freq_subday_type 的周期个数。有关更多信息，请参见 sp_add_jobschedule。
freq_relative_interval | int | 在每个月中，freq_interval 的已调度作业的发生情况。有关更多信息，请参见 sp_add_jobschedule。
freq_recurrence_factor | int | 作业的已调度执行日期之间的间隔月数。
active_start_date | int | 激活调度的日期。
active_end_date | int | 调度的结束日期。
active_start_time | int | 调度开始的时间。
active_end_time | int | 调度结束的时间。
date_created | datetime | 创建调度的日期。
schedule_description | nvarchar(4000) | 对调度的英语描述（如果已经调度）。
next_run_date | int | 调度下一次引发作业运行的日期。
next_run_time | int | 调度下一次引发作业运行的时间。

注释

sp_help_jobschedule 的参数只能用在某些组合中。如果指定了 schedule_id，那么就不能指定 job_id，也不能指定 job_name。否则，job_id 或 job_name 参数就可能与 schedule_name 一同使用。

权限

执行权限默认授予 public 角色。任何可以执行该过程的用户都可以对下列内容进行创建、删除或更新操作：作业、作业步骤、作业分类、作业调度、作业服务器、任务或作业历史信息。

示例
A. 返回特定作业的作业调度

下面的示例返回名为 Archive Tables 的作业的调度信息。

USE msdb
EXEC sp_help_jobhistory @job_name = 'Archive Tables'
B. 返回调度中指定项目的作业调度

下面的示例返回名为 Archive Tables 的作业以及其调度项目 Weekly Archive 的历史记录。

USE msdb
EXEC sp_help_jobhistory @job_name = 'Archive Tables',
   @schedule_name = 'Weekly Archive'

请参见

sp_add_jobschedule

sp_delete_jobschedule

sp_update_jobschedule

系统存储过程


sp_help_jobserver

为给定的作业返回有关服务器的信息。

语法

sp_help_jobserver [ @job_id = ] job_id |
[ @job_name = ] 'job_name'
[ , [ @show_last_run_details = ] show_last_run_details ]

参数

[@job_id =] job_id

是为其返回信息的作业标识号。job_id 的数据类型为 uniqueidentifier，默认值为 NULL。

[@show_last_run_detail =] 'job_name'

是为其返回信息的作业名。job_name 的数据类型为 sysname，默认设置为 NULL。

说明 必须指定 job_id 或 job_name，但不能两个都指定。

[@show_last_run_details =] show_last_run_details

表示上一次运行的执行信息是否包含在结果集中。show_last_run_details 的数据类型为 tinyint，默认值为 0。0 表示不包括上一次的运行信息，但 1 包括。

返回代码值

0（成功）或 1（失败）

结果集
列名 | 数据类型 | 描述
server_id | int | 目标服务器的标识号。
server_name | nvarchar(30) | 目标服务器的计算机名称。
enlist_date | datetime | 将目标服务器登记到主服务器 (MSX) 的日期。
last_poll_date | datetime | 目标服务器上一次轮询 MSX 的日期。

如果将 show_last_run_details 设置成 1，并且执行 sp_help_jobserver，那么结果集中有下面这些额外的列。

列名 | 数据类型 | 描述
last_run_date | Int | 在这个目标服务器上，作业上一次开始执行的日期。
last_run_time | Int | 作业上一次在这台服务器上开始执行的时间。
last_run_duration | Int | 作业上一次在这台目标服务器上运行所持续的时间（以秒为单位）。
last_outcome_message | nvarchar(1024) | 作业上一次在这个服务器上运行的结果： 0 = 失败 1 = 成功 3 = 取消 5 = 未知

权限

sysadmin 固定服务器角色和 db_owner 固定数据库角色在默认情况下有执行此过程的权限，他们可以将权限授予其他用户。

示例

下面的示例返回有关 Archive Tables 作业的信息，其中包括上一次运行的信息。

USE msdb
EXEC sp_help_jobserver @job_name = 'Archive Tables',
   @show_last_run_details = 1

请参见

sp_add_jobserver

sp_delete_jobserver

系统存储过程


sp_help_jobstep

返回有关 SQLServerAgent 服务用来执行自动活动的作业的步骤的信息。

语法

sp_help_jobstep [ @job_id = ] 'job_id' |
[ @job_name = ] 'job_name
[ , [ @step_id = ] step_id ]
[ , [ @step_name = ] 'step_name' ]
[ , [ @suffix = ] suffix ]

参数

[@job_id =] 'job_id'

是为其返回作业信息的作业标识号。job_id 的数据类型为 uniqueidentifier，默认值为 NULL。

[@job_name =] 'job_name'

是作业名称。job_name 的数据类型为 sysname，默认值为 NULL。

说明 必须指定 job_id 或 job_name，但不能两个都指定。

[@step_id =] step_id

作业中步骤的标识号。如果没有包括这项参数，则包含作业中所有的步骤。step_id 的数据类型为 int，默认值为 NULL。

[@step_name =] 'step_name'

是作业中步骤的名称。step_name 的数据类型为 sysname，默认值为 NULL。

[@suffix =] suffix

是一个标志，表示是否将一个文本描述追加到输出的 flags 列。suffix 的数据类型为 bit，默认值为 0。如果 suffix 是 1，则追加描述。

返回代码值

0（成功）或 1（失败）

结果集
列名 | 数据类型 | 描述
step_id | Int | 步骤的唯一标识符。
step_name | sysname | 作业中步骤的名称。
subsystem | nvarchar(40) | 子系统，在该子系统中执行步骤命令。
command | nvarchar(3200) | 在步骤中执行的命令。
flags | Int | 控制步骤行为的值的位掩码。
cmdexec_success_code | Int | 对于CmdExec 步骤，这是成功命令的进程退出代码。
on_success_action | timyint | 如果步骤成功，将要采取的操作： 1 = 退出正在报告成功的作业。 2 = 退出正在报告失败的作业。 3 = 转至下一步骤。 4 = 转至步骤。
on_success_step_id | Int | 如果 on_success_action 为 4，即指明下一步执行步骤 4。
on_fail_action | Tinyint | 如果步骤失败了，应怎么办。值和 on_success_action 的值一样。
on_fail_step_id | Int | 如果 on_fail_action 为 4，即指明下一步执行步骤 4。
server | sysname | 保留。
database_name | sysname | 对于 Transact-SQL 步骤，这是将在其中执行命令的数据库。
database_user_name | sysname | 对于 Transact-SQL 步骤，这是数据库用户上下文，命令在这个用户上下文中执行。
retry_attempts | Int | 应该对命令进行重试的最大次数（如果命令没有成功）。
retry_interval | Int | 重试尝试的间隔（以分钟为单位）。
os_run_priority | Int | 保留。
output_file_name | nvarchar(200) | 命令的输出结果将要写入其中的文件（只针对 Transact-SQL 及 CmdExec 步骤）。
last_run_outcome | Int | 步骤上一次运行的结果： 0 = 失败 1 = 成功 2 = 重试 3 = 取消 5 = 未知
last_run_duration | Int | 步骤上一次运行的持续时间（以秒为单位）。
last_run_retries | Int | 步骤上一次运行时，命令进行重试的次数。
last_run_date | Int | 步骤上一次开始执行的日期。
last_run_time | Int | 步骤上一次开始执行的时间。

权限

执行权限默认授予 public 角色。任何可以执行该过程的用户都可以对下列内容进行创建、删除或更新操作：作业、作业步骤、作业分类、作业调度、作业服务器、任务或作业历史信息。

示例
A. 返回特定作业中所有步骤的信息

下面的示例返回名为 Backup Files 的作业的所有作业步骤。

USE msdb
EXEC sp_help_jobstep @job_name = 'Backup Files'
B. 返回特定作业步骤的信息

下面的示例返回有关名为 Backup Files 的作业的第一个作业步骤的信息。

USE msdb
EXEC sp_help_jobstep @job_name = 'Backup Files', @step_id = 1

请参见

sp_add_jobstep

sp_delete_jobstep

sp_help_job

sp_update_jobstep

系统存储过程


sp_help_maintenance_plan

返回有关指定的维护计划的信息。如果没有指定计划，那么该存储过程将返回有关所有维护计划的信息。

语法

sp_help_maintenance_plan [ [ @plan_id = ] 'plan_id' ]

参数

[@plan_id =] 'plan_id'

指定维护计划的计划 ID。plan_id 的数据类型为 UNIQUEIDENTIFIER。默认设置为 NULL。

返回代码值

无

结果集

如果指定了 plan_id，那么 sp_help_maintenance_plan 将返回三个表：Plan、Database 及 Job。

Plan 表

列名 | 数据类型 | 描述
plan_id | uniqueidentifier | 维护计划 ID。
plan_name | sysname | 维护计划名称。
date_created | datetime | 创建维护计划的日期。
owner | sysname | 维护计划的所有者。
max_history_rows | int | 在系统表中，为记录维护计划的历史所分配的最大行数。
remote_history_server | int | 远程服务器的名称，可以将历史报表写入该服务器中。
max_remote_history_rows | int | 远程服务器上的系统表中所分配的最大行数，可以将历史报表写入该远程服务器中。
user_defined_1 | int | 默认设置为 NULL。
user_defined_2 | nvarchar(100) | 默认设置为 NULL。
user_defined_3 | datetime | 默认设置为 NULL。
user_defined_4 | uniqueidentifier | 默认设置为 NULL。

Database 表

列名 | 描述
database_name | 所有与维护计划相关的数据库的名称。database_name 的数据类型为 sysname。

Job 表

列名 | 描述
job_id | 所有与维护计划相关的作业的 ID。job_id 的数据类型为 uniqueidentifier。

如果没有指定计划 ID，或者它为 NULL，则 sp_help_maintenance_plan 将返回有关全部现有维护计划的信息。

列名 | 数据类型 | 描述
plan_id | uniqueidentifier | 维护计划 ID。
plan_name | sysname | 维护计划名称。
date_created | datetime | 创建维护计划的日期。
owner | sysname | 维护计划所有者。
max_history_rows | int | 在系统表中，为记录维护计划的历史所分配的最大行数。
remote_history_server | int | 远程服务器的名称，可以将历史报表写入该远程服务器中。
max_remote_history_rows | int | 远程服务器上的系统表中所分配的最大行数，可以将历史报表写入该远程服务器中。
user_defined_1 | int | 默认设置为 NULL。
user_defined_2 | nvarchar(100) | 默认设置为 NULL。
user_defined_3 | datetime | 默认设置为 NULL。
user_defined_4 | uniqueidentifier | 默认设置为 NULL。

权限

只有 sysadmin 固定服务器角色的成员才可以执行 sp_help_maintenance_plan。


sp_help_notification

报告给定的操作员的警报列表，或者报告给定的警报的操作员列表。

语法

sp_help_notification [ @object_type = ] 'object_type' ,
[ @name = ] 'name' ,
[ @enum_type = ] 'enum_type' ,
[ @notification_method = ] notification_method
[ , [ @target_name = ] 'target_name' ]

参数

[@object_type =] 'object_type'

是将要返回的信息类型。object_type 的数据类型为 char(9)，无默认值。object_type 可以为 ALERTS，这样将列出指派给所提供的操作员名称的警报；还可以为 OPERATORS，这样将列出对所提供的警报名称负责的操作员。

[@name =] 'name'

是警报名称（如果 object_type 为 ALERTS）或操作员名称（如果 object_type 为 OPERATORS）。name 的数据类型为 sysname，无默认值。

[@enum_type =] 'enum_type'

是返回的 object_type 信息。大多数情况下，enum_type 为 ACTUAL。enum_type 的数据类型为 char(10)，无默认值，并且可以是下列值之一。

值 | 描述
ACTUAL | 只列出与 name 相关的 object_types。
ALL | 列出所有的 object_types，包括那些与 name 不相关的 object_types。
TARGET | 只列出那些与提供的 target_name 相匹配的 object_types，而不考虑与 name 的关联。

[@notification_method =] notification_method

是数值，而该值确定要返回的提示方法列。notification_method 的数据类型为 tinyint，并且可以是下列值之一。

值 | 描述
1 | 电子邮件：只返回 use_email 列。
2 | 寻呼机：只返回 use_pager 列。
4 | NetSend：只返回 use_netsend 列。
7 | 全部：返回全部列。

[@target_name =] 'target_name'

是要搜索的警报名称（如果 object_type 为 ALERTS）或者是要搜索的操作员名称（如果 object_type 为 OPERATORS）。只有当 enum_type 为 TARGET 时，才需要 target_name。target_name 的数据类型为 sysname，默认值为 NULL。

返回代码值

0（成功）或 1（失败）

结果集

如果 object_type 为 ALERTS，那么结果集将为给定操作员列出所有警报。

列名 | 数据类型 | 描述
alert_id | int | 警报标识号。
alert_name | sysname | 警报名称。
use_email | int | 使用电子邮件提示操作员： 1 = 是 0 = 否
use_pager | int | 使用寻呼机提示操作员： 1 = 是 0 = 否
use_netsend | int | 使用网络弹出消息提示操作员： 1 = 是 0 = 否
has_email | int | 为该警报发送的电子邮件提示的次数。
has_pager | int | 为该警报发送的寻呼机提示的次数。
has_netsend | int | 为该警报发送的 netsend 提示的次数。

如果 object_type 是 OPERATORS，那么结果集为给定的警报列出所有操作员。

列名 | 数据类型 | 描述
operator_id | int | 操作员标识号。
operator_name | sysname | 操作员名称。
use_email | int | 使用电子邮件发送操作员的提示： 1 = 是 0 = 否
use_pager | int | 使用寻呼机发送操作员的提示： 1 = 是 0 = 否
use_netsend | int | 使用网络弹出消息提示操作员： 1 = 是 0 = 否
has_email | int | 操作员有电子邮件地址： 1 = 是 0 = 否
has_pager | int | 操作员有寻呼机地址： 1 = 是 0 = 否

注释

必须从 msdb 数据库运行该存储过程。

权限

执行该过程的权限默认授予 sysadmin 固定服务器角色和 db_owner 固定数据库角色，他们可以将权限授予其他用户。

示例
A. 列出特定操作员的警报

下面的示例返回操作员 John Doe 接收到任何一种有关提示的所有警报。

USE msdb
EXEC sp_help_notification 'ALERTS', 'John Doe', 'ACTUAL', 7
B. 列出特定警报的操作员

下面的示例返回接收到有关 Test Alert 警报的任何一种提示的所有操作员。

USE msdb
EXEC sp_help_notification 'OPERATORS', 'Test Alert', 'ACTUAL', 7

请参见

sp_add_notification

sp_delete_notification

sp_update_notification

系统存储过程


sp_help_operator

报告有关为服务器定义的操作员的信息。

语法

sp_help_operator [ [ @operator_name = ] 'operator_name' ]
[ , [ @operator_id = ] operator_id ]

参数

[@operator_name =] 'operator_name'

是操作员名称。operator_name 的数据类型为 sysname。如果没有指定 operator_name，那么返回有关所有操作员的信息。

[@operator_id =] operator_id

是为其请求信息的操作员的标识号。operator_id 的数据类型为 int，默认值为 NULL。

返回代码值

0（成功）或 1（失败）

结果集
列名 | 数据类型 | 描述
id | int | 操作员标识号。
name | sysname | 操作员名称。
enabled | tinyint | 操作员可以接收到任何提示： 1 = 是 0 = 否
email_address | nvarchar(100) | 操作员电子邮件地址。
last_email_date | int | 上一次用电子邮件提示操作员的日期。
last_email_time | int | 上一次用电子邮件提示操作员的时间。
pager_address | nvarchar(100) | 操作员寻呼机地址。
last_pager_date | int | 上一次用寻呼机提示操作员的日期。
last_pager_time | int | 上一次用寻呼机提示操作员的时间。
weekday_pager_start_time | int | 某一时间段的起始时间，在工作日的该时间段内操作员可以接收到寻呼机提示。
weekday_pager_end_time | int | 某一时间段的结束时间，在工作日的该时间段内操作员可以接收到寻呼机提示。
Saturday_pager_start_time | int | 某一时间段的起始时间，在星期六的该时间段内操作员可以接收到寻呼机提示。
Saturday_pager_end_time | int | 某一时间段的结束时间，在星期六的该时间段内操作员可以接收到寻呼机提示。
Sunday_pager_start_time | int | 某一时间段的起始时间，在星期日的该时间段内操作员可以接收到寻呼机提示。
Sunday_pager_end_time | int | 某一时间段的结束时间，在星期日的该时间段内操作员可以接收到寻呼机提示。
pager_days | tinyint | 一星期内各天的位掩码（1 = 星期天，64 = 星期六），它指明操作员可以接收寻呼机提示的时间。
netsend_address | nvarchar(100) | 接收网络弹出提示的操作员地址。
last_netsend_date | int | 上一次用网络弹出消息提示操作员的日期。
last_netsend_time | int | 上一次用网络弹出消息提示操作员的时间。
category_name | sysname | 该操作员所属的操作员分类的名称。

注释

必须从 msdb 数据库运行 sp_help_operator。

权限

执行该过程的权限默认授予 sysadmin 固定服务器角色和 db_owner 固定数据库角色，他们可以将权限授予其他用户。

示例

下面的示例报告有关操作员 andrewf 的信息。

USE msdb
EXEC sp_help_operator 'andrewf'

请参见

sp_add_operator

sp_delete_operator

sp_update_operator

系统存储过程


sp_help_targetserver

列出所有的目标服务器。

语法

sp_help_targetserver [ [ @server_name =] 'server_name' ]

参数

[@server_name =] 'server_name'

是将返回其信息服务器的名称。server_name 的数据类型为 nvarchar(30)，默认值为 NULL。

返回代码值

0（成功）或 1（失败）

结果集

如果没有指定 server_name，sp_help_targetserver 将返回下面的结果集。

列名 | 数据类型 | 描述
server_id | int | 服务器标识号。
server_name | nvarchar(30) | 服务器名称。
location | nvarchar(200) | 指定的服务器的位置。
time_zone_adjustment | int | 对格林尼治标准时间 (GMT) 进行的时区调整，以小时为单位。
enlist_date | datetime | 指定的服务器的登记日期。
last_poll_date | datetime | 上一次为作业而轮询服务器的日期。
status | int | 指定服务器的状态。
unread_instructions | int | 服务器是否有未读指令。（如果已经下载了所有的行，则该列为 0。）
local_time | datetime | 目标服务器上的本地日期和时间，基于主服务器上一次轮询时目标服务器上的本地时间。
Enlisted_by_nt_user | nvarchar(100) | 登记到目标服务器的 Microsoft® Windows NT® 用户。
poll_interval | int | 目标服务器为下载作业和上载作业状态而对 Master SQLServerAgent 服务进行轮询的频率。

权限

执行该过程的权限默认授予 sysadmin 固定服务器角色和 db_owner 固定数据库角色，他们可以将权限授予其他用户。

示例

下面的示例列出所有服务器的信息，然后只列出目标服务器 LONDON1 的信息。

USE msdb
EXEC sp_help_targetserver
EXEC sp_help_targetserver 'LONDON1'

请参见

sp_add_targetservergroup

sp_delete_targetserver

sp_delete_targetservergroup

sp_update_targetservergroup

sysdownloadlist

系统存储过程


sp_help_targetservergroup

列出指定的组中所有的目标服务器。如果未指定任何组，则 Microsoft® SQL Server™ 返回有关所有目标服务器组的信息。

语法

sp_help_targetservergroup [ [ @name = ] 'name' ]

参数

[@name =] 'name'

是将返回其信息的目标服务器组的名称。name 的数据类型为 varchar(100)，默认值为 NULL。

返回代码值

0（成功）或 1（失败）

结果集
列名 | 数据类型 | 描述
servergroup_id | int | 服务器组的标识号
name | sysname | 服务器组的名称

权限

执行该过程的权限默认授予 sysadmin 固定服务器角色和 db_owner 固定数据库角色，他们可以将权限授予其他用户。

示例

下面的示例列出所有的目标服务器组，然后列出目标服务器组 Servers Maintaining Customer Information 中所有的目标服务器。

USE msdb
EXEC sp_help_targetservergroup
EXEC sp_help_targetservergroup 'Servers Maintaining Customer Information'

请参见

sp_add_targetservergroup

sp_delete_targetservergroup

sp_update_targetservergroup

系统存储过程


sp_helpconstraint

返回一个列表，其内容包括所有约束类型、约束类型的用户定义或系统提供的名称、定义约束类型时用到的列，以及定义约束的表达式（仅适用于 DEFAULT 和 CHECK 约束）。

语法

sp_helpconstraint [ @objname = ] 'table'
[ , [ @nomsg = ] 'no_message' ]

参数

[@objname =] 'table'

返回其约束信息的表。指定的表对于当前数据库必须是本地的。table 的数据类型为 nvarchar(776)，无默认值。

[@nomsg =] 'no_message'

是打印表名的可选参数。no_message 的数据类型为 varchar(5)，默认值为 msg。nomsg 表示取消打印。

返回代码值

0（成功）或 1（失败）

结果集

如果 sp_helpconstraint 参与到主键中，则它显示按降序索引的列。降序索引列将在结果集中列出，在其名称后带有减号 (-)。默认值（升序索引列）将仅按名称列出。

注释

执行 sp_help table 时将报告有关指定表的所有信息。若要仅查看约束信息，请使用 sp_helpconstraint。

权限

执行权限默认授予 public 角色。

示例

下面的示例显示 authors 表的所有约束。

USE pubs
EXEC sp_helpconstraint authors

请参见

ALTER TABLE

CREATE TABLE

sp_help

系统存储过程


sp_helpdb

报告有关指定数据库或所有数据库的信息。

语法

sp_helpdb [ [ @dbname= ] 'name' ]

参数

[@dbname=] 'name'

是要为其提供信息的数据库名称。name 的数据类型为 sysname，无默认值。如果没有指定 name，则 sp_helpdb 报告 master.dbo.sysdatabases 中的所有数据库。

返回代码值

0（成功）或 1（失败）

结果集
列名 | 数据类型 | 描述
name | nvarchar(24) | 数据库名称。
db_size | nvarchar(13) | 数据库总计大小。
owner | nvarchar(24) | 数据库所有者（例如 sa）。
dbid | smallint | 数字数据库 ID。
created | char(11) | 数据库创建的日期。
status | varchar(340) | 以逗号分隔的值的列表，这些值是当前在数据库上设置的数据库选项的值。 只有启用布尔值选项时，才将这些选项列出。非布尔值选项及其对应值以 option_name=value 的形式列出。 有关更多信息，请参见 ALTER DATABASE。
compatibility_level | tinyint | 数据库兼容级别（60、65、70 和 80）

如果指定 name，那么将有其它结果集，这些结果集显示指定数据库的文件分配。

列名 | 数据类型 | 描述
name | nchar(128) | 逻辑文件名。
fileid | smallint | 数字文件标识符。
file name | nchar(260) | 操作系统文件名（物理文件名称）。
filegroup | nvarchar(128) | 文件所属的组。为便于分配和管理，可以将数据库文件分成文件组。日志文件不能作为文件组的一部分。
size | nvarchar(18) | 文件大小。
maxsize | nvarchar(18) | 文件可达到的最大值。此字段中的 UNLIMITED 值表示文件可以一直增大直到磁盘满为止。
growth | nvarchar(18) | 文件的增量。表示每次需要新的空间时给文件增加的空间大小。
usage | varchar(9) | 文件用法。数据文件的用法是 data only（仅数据），而日志文件的用法是 log only（仅日志）。

注释

结果集中的 status 列报告在 sysdatabases 的 status 列中打开了哪些位。不报告 sysdatabases 中 status2 列的信息。

权限

执行权限默认授予 public 角色。

sp_helpdb 必须访问服务器上的数据库以确定要显示的有关数据库的信息。因此，服务器上的每个数据库都必须满足下列条件之一：

  1. 执行 sp_helpdb 的用户必须拥有访问数据库的权限。

  2. guest 用户帐户必须存在于数据库中。

如果无法访问数据库，那么 sp_helpdb 将显示错误信息 15622 和有关数据库的尽可能多的信息。

示例
A. 返回有关单个数据库的信息

下面的示例显示有关 pubs 数据库的信息。

exec sp_helpdb pubs
B. 返回有关所有数据库的信息

下面的示例显示有关运行 Microsoft® SQL Server™ 的服务器上的所有数据库的信息。

exec sp_helpdb

请参见

ALTER DATABASE

CREATE DATABASE

sp_configure

sp_dboption

sp_renamedb

系统存储过程


sp_helpdbfixedrole

返回固定数据库角色的列表。

语法

sp_helpdbfixedrole [ [ @rolename = ] 'role' ]

参数

[@rolename =] 'role'

是固定数据库角色的名称。role 的数据类型为 sysname，默认值为 NULL。如果指定了 role，则仅返回有关该角色的信息。反之，将返回所有固定数据库角色的列表和描述。

返回代码值

0（成功）或 1（失败）

结果集
列名 | 数据类型 | 描述
DbFixedRole | sysname | 固定数据库角色的名称。
Description | nvarchar(70) | DbFixedRole 的描述。

注释

固定数据库角色定义在数据库级别上，并且有权限执行特定数据库级别的管理活动。不能添加、删除或更改固定数据库角色。

固定数据库角色 | 描述
db_owner | 数据库所有者
db_accessadmin | 数据库访问管理员
db_securityadmin | 数据库安全管理员
db_ddladmin | 数据库 DDL 管理员
db_backupoperator | 数据库备份操作员
db_datareader | 数据库数据读取者
db_datawriter | 数据库数据写入者
db_denydatareader | 数据库拒绝数据读取者
db_denydatawriter | 数据库拒绝数据写入者

此表显示用于修改数据库角色的存储过程。

存储过程 | 对策
sp_addrolemember | 将登录帐户添加到固定数据库角色。
sp_helprole | 显示固定数据库角色的成员列表。
sp_droprolemember | 从固定数据库角色中删除成员。

权限

执行权限默认授予 public 角色。

示例

下面的示例显示所有固定数据库角色的列表。

EXEC sp_helpdbfixedrole

请参见

sp_addrolemember

sp_dbfixedrolepermission

sp_droprolemember

sp_helprole

sp_helprolemember

系统存储过程


sp_helpdevice

报告有关 Microsoft® SQL Server™ 数据库文件的信息。sp_helpdevice 用于向后兼容那些使用数据库文件的检索设备的 SQL Server 的早期版本。

语法

sp_helpdevice [ [ @devname= ] 'name' ]

参数

[@devname=] 'name'

是要向其提供信息的设备名称。name 的数据类型为 sysname，无默认值。

返回代码值

0（成功）或 1（失败）

结果集
列名 | 数据类型 | 描述
device_name | sysname | 设备名称（或文件名）。
physical_name | nvarchar(46) | 物理文件名。
description | nvarchar(255) | 设备的描述。
status | int | 对应于 description 列中状态描述的编号。
cntrltype | smallint | 设备的控制器编号： 2 = 硬盘设备 3 或 4 = 磁盘转储设备 5 = 磁带设备 0 = 数据库设备
size | int | 2 KB 页的设备大小。

注释

如果指定 name，则 sp_helpdevice 将显示有关指定数据库设备或转储设备的信息。如果没有指定 name，则 sp_helpdevice 将显示有关 master.dbo.sysdevices 中所有数据库设备和转储设备的信息。

使用 DISK INIT 语句，以前的样式数据库设备将被添加到系统。使用 sp_addumpdevice，可以将转储设备添加到系统。

在 device_number 列中，0 用于转储设备，0 用于 MASTER 数据库设备，从 1 到 255 的值用于其它数据库设备。

权限

执行权限默认授予 public 角色。

示例

下面的示例报告有关 SQL Server 上的所有数据库设备和转储设备的信息。

sp_helpdevice

请参见

sp_dropdevice

sp_helpdb


sp_helpextendedproc

显示当前定义的扩展存储过程，以及此过程（函数）所属动态链接库的名称。

语法

sp_helpextendedproc [ [@funcname = ] 'procedure' ]

参数

[@funcname =] 'procedure'

是要显示其信息的扩展存储过程的名称。procedure 的数据类型为 sysname，默认值为 NULL。

返回代码值

0（成功）或 1（失败）

结果集
列名 | 数据类型 | 描述
name | sysname | 扩展存储过程的名称。
dll | nvarchar(255) | 动态链接库的名称。

注释

指定 procedure 时，sp_helpextendedproc 报告指定扩展存储过程的信息。不提供 procedure 时，sp_helpextendedproc 返回全部扩展存储过程的名称，以及每个扩展存储过程所属的 DLL 名称。

权限

执行权限默认授予 public 角色。

示例
A. 报告所有扩展存储过程的帮助

下面的示例报告所有扩展存储过程的信息。

USE master
EXEC sp_helpextendedproc
B. 报告单个扩展存储过程的帮助

下面的示例报告 xp_cmdshell 扩展存储过程的信息。

USE master
EXEC sp_helpextendedproc xp_cmdshell

请参见

sp_addextendedproc

sp_dropextendedproc

系统存储过程


sp_helpfile

返回与当前数据库关联的文件的物理名称及特性。使用此存储过程确定附加到服务器或从服务器分离的文件名。

语法

sp_helpfile [ [ @filename = ] 'name' ]

参数

[@filename =] 'name'

是当前数据库中任意文件的逻辑名称。name 的数据类型为 sysname，默认值为 NULL。如果不指定 name，会列出当前数据库中所有文件的特性。

返回代码值

0（成功）或 1（失败）

结果集
列名 | 数据类型 | 描述
name | sysname | 逻辑文件名。
fileid | smallint | 文件的数字标识符。
filename | nchar(260) | 物理文件名。
filegroup | sysname | 文件所属的组。为便于分配和管理，可以将数据库文件分成文件组。日志文件不属于文件组。
size | nvarchar(18) | 文件大小。
maxsize | nvarchar(18) | 文件可达到的最大值。此字段中的 UNLIMITED 值表示文件可以一直增大直到磁盘满为止。
growth | nvarchar(18) | 文件的增量。表示每次需要新的空间时给文件增加的空间大小。
usage | varchar(9) | 文件用法。数据文件只能用于 data only，而日志文件只能用于 log only。

权限

执行权限默认赋予 public 角色。

示例

下面的示例返回有关 pubs 中的文件的信息。

USE pubs
EXEC sp_helpfile

请参见

sp_attach_db

sp_attach_single_file_db

sp_detach_db

sp_helpfilegroup

系统存储过程


sp_helpfilegroup

返回与当前数据库相关的文件组的名称及特性。

语法

sp_helpfilegroup [ [ @filegroupname = ] 'name' ]

参数

[@filegroupname =] 'name'

是当前数据库中任意文件组的逻辑名称。name 的数据类型为 sysname，默认值为 NULL。如果不指定 name，会列出当前数据库中所有文件组的特性。

返回代码值

0（成功）或 1（失败）

结果集
列名 | 数据类型 | 描述
groupname | sysname | 文件组的名称。
groupid | smallint | 数字组标识符。
filecount | integer | 文件组中的文件数目。

权限

执行权限默认赋予 public 角色。

示例

下面的示例返回有关 pubs 中的文件组的信息。

USE pubs
EXEC sp_helpfilegroup

请参见

sp_attach_db

sp_attach_single_file_db

sp_detach_db

sp_helpfile

系统存储过程


sp_helpgroup

报告有关当前数据库中一个角色或全部角色的信息。包括此过程是为了向后兼容。Microsoft® SQL Server™ 7.0 版使用角色而不是组。请使用 sp_helprole。

语法

sp_helpgroup [ [ @grpname = ] 'role' ]

参数

[@grpname =] 'role'

是角色名。role 必须在当前数据库中存在。role 的数据类型为 sysname，默认值为 NULL。如果指定 role，则返回有关角色的名称和角色成员的信息；否则返回有关当前数据库中所有角色的信息。

返回代码值

0（成功）或 1（失败）

结果集

未指定 role。

列名 | 数据类型 | 描述
Group_name | sysname | 当前数据库中角色的名称。
Group_id | smallint | 当前数据库中角色的角色 ID。

指定 role。

列名 | 数据类型 | 描述
Group_name | sysname | 当前数据库中角色的名称。
Group_id | smallint | 当前数据库中角色的角色 ID。
Users_in_group | sysname | 当前数据库中角色的成员。
Userid | smallint | 角色成员的用户 ID。

注释

若要查看与角色相关的权限，请使用 sp_helprotect。

权限

执行权限默认授予 public 角色。

示例
A. 返回有关单个角色的信息

下面的示例返回有关 hackers 角色的信息。

EXEC sp_helpgroup 'hackers'
B. 返回有关所有角色的信息

下面的示例返回有关当前数据库中所有角色的信息。

EXEC sp_helpgroup

请参见

sp_helprotect

sp_helprole

sp_helpuser

系统存储过程


sp_helphistory

提供 sp_helphistory 是为了向后兼容。有关 Microsoft®SQL Server™ 2000 替换过程的更多信息，请参见 SQL Server 向后兼容性详细信息。

注释

sp_helphistory 的结果由与所有指定参数的匹配情况决定。

权限

执行权限默认授予 public 角色。任何可以执行该过程的用户都可以对下列内容进行创建、删除或更新操作：作业、作业步骤、作业分类、作业调度、作业服务器、任务或作业历史信息。

请参见

sp_addtask

sp_purgehistory

系统存储过程


sp_helpindex

报告有关表或视图上索引的信息。

语法

sp_helpindex [ @objname = ] 'name'

参数

[@objname =] 'name'

是当前数据库中表或视图的名称。name 的数据类型为 nvarchar(776)，没有默认值。

返回代码值

0（成功）或 1（失败）

结果集
列名 | 数据类型 | 描述
index_name | sysname | 索引名。
index_description | varchar(210) | 索引描述。
index_keys | nvarchar(2078) | 表或视图列，在这些列上构造索引。

被降序索引的列将在结果集中列出，该列的名称后面带有一个减号 (-)，当列出被升序索引的列（这是默认情况）时，只带有该列的名称。

注释

如果已经用 UPDATE STATISTICS 的 NORECOMPUTE 选项设置了索引，那么在 sp_helpindex 的结果集中会显示这个信息。

权限

执行权限默认授予 public 角色。

示例

下面的示例报告 sysobjects 表上索引的类型。

sp_helpindex sysobjects

请参见

CREATE INDEX

DROP INDEX

DROP STATISTICS

sp_help

sp_statistics

系统存储过程

UPDATE STATISTICS


sp_helplanguage

报告有关某个特定的备用语言或所有语言的信息。

语法

sp_helplanguage [ [ @language = ] 'language' ]

参数

[@language =] 'language'

备用语言的名称，将为该语言显示信息。language 的数据类型为 sysname，默认值为 NULL。如果指定了 language，那么返回有关该指定语言的信息。如果没有指定语言，那么返回有关 syslanguages 系统表中所有语言的信息。

返回代码值

0（成功）或 1（失败）

结果集
列名 | 数据类型 | 描述
langid | smallint | 语言标识号。
dateformat | nchar(3) | 日期的格式。
datefirst | tinyint | 一周的第一天：1 表示星期一，2 表示星期二，依此类推，直到 7 表示星期日。
upgrade | int | 此语言上一次升级的 Microsoft® SQL Server™ 版本。
name | sysname | 语言名称。
alias | sysname | 语言的备用名称。
months | nvarchar(372) | 月份名称。
shortmonths | nvarchar(132) | 简写月份名称。
days | nvarchar(217) | 日期名称。
lcid | int | 此种语言的 Microsoft Windows NT® 区域设置 ID。
msglangid | smallint | SQL Server 消息组 ID。

权限

执行权限默认授予 public 角色。

示例
A. 返回有关单个语言的信息

下面的示例显示有关备用语言 French（法语）的信息。

sp_helplanguage french
B. 返回有关所有语言的信息

下面的示例显示有关所有安装的备用语言的信息。

sp_helplanguage

请参见

@@LANGUAGE

SET LANGUAGE

系统存储过程


sp_helplinkedsrvlogin

提供有关某些登录映射的信息，这些登录是针对特定的链接服务器定义的，而这些链接服务器是用于分布式查询和远程存储过程的。

语法

sp_helplinkedsrvlogin [ [ @rmtsrvname = ] 'rmtsrvname' ]
[ , [ @locallogin = ] 'locallogin' ]

参数

[@rmtsrvname =] 'rmtsrvname'

是链接服务器名称，登录映射应用于该服务器。rmtsrvname 的数据类型为 sysname，默认值为 NULL。如果为 NULL，则返回所定义的、针对运行 Microsoft® SQL Server™ 的本地计算机上定义的所有链接服务器的全部登录映射。

[ @locallogin =] 'locallogin'

是本地服务器上的 SQL Server 登录，该登录有一个到链接服务器 rmtsrvname 的映射。locallogin 的数据类型为 sysname，默认值为 NULL。NULL 指定：返回在 rmtsrvname 上定义的所有登录映射。如果不为 NULL，必须存在一个 locallogin 到 rmtsrvname 的映射。locallogin 可以是 SQL Server 登录或 Microsoft Windows NT® 用户。必须已经将 SQL Server 的访问权限直接授予 Windows NT 用户，或者通过该用户在已授予访问权限的 Windows NT 组中的成员身份授予。

返回代码值

0（成功）或 1（失败）

结果集
列名 | 数据类型 | 描述
LinkedServer | sysname | 链接服务器名称。
Local Login | sysname | 本地登录，映射应用于该本地登录。
Is Self Mapping | smallint | 0 = 当连接到 Linked Server 时，将 Local Login 映射到 Remote Login。 1 = 当连接到 Linked Server 时，将 Local Login 映射到相同的登录和密码。
Remote Login | sysname | 当 Is Self Mapping 是 0 时，映射到 Local Login 的 Linked Server 上的登录名。如果 Is Self Mapping 是 1，那么 Remote Login 为 NULL。

注释

在删除登录映射之前，使用 sp_helplinkedsrvlogin 确定所涉及的链接服务器。

权限

执行权限默认授予 public 角色。

示例
A. 显示所有链接服务器的所有登录映射

下面的示例显示在运行 SQL Server 的本地计算机上定义的所有链接服务器的所有登录映射。

EXEC sp_helplinkedsrvlogin
go

Linked Server    Local Login   Is Self Mapping Remote Login
---------------- ------------- --------------- --------------
Accounts         NULL          1               NULL
Sales            NULL          1               NULL
Sales            Mary          0               sa
Marketing        NULL          1               NULL

(4 row(s) affected)
B. 显示某个链接服务器的所有登录映射

下面的示例显示 Sales 链接服务器的所有本地定义的登录映射。

EXEC sp_helplinkedsrvlogin 'Sales'
go

Linked Server    Local Login   Is Self Mapping Remote Login
---------------- ------------- --------------- --------------
Sales            NULL          1               NULL
Sales            Mary          0               sa

(2 row(s) affected)
C. 显示某个本地登录的所有登录映射

下面的示例显示登录 Mary 的所有本地定义的登录映射。

EXEC sp_helplinkedsrvlogin NULL, 'Mary'
go

Linked Server    Local Login   Is Self Mapping Remote Login
---------------- ------------- --------------- --------------
Sales            NULL          1               NULL
Sales            Mary          0               sa

(2 row(s) affected)

请参见

建立链接服务器的安全性

sp_addlinkedserver

sp_droplinkedsrvlogin

系统存储过程


sp_helplogins

提供有关每个数据库中的登录及相关用户的信息。

语法

sp_helplogins [ [ @LoginNamePattern = ] 'login' ]

参数

[@LoginNamePattern =] 'login'

是登录名。login 的数据类型为 sysname，默认值为 NULL。如果指定 login，则它必须存在。如果没有指定 login，那么返回有关所有登录的信息。

返回代码值

0（成功）或 1（失败）

结果集

第一个报表包含有关每个指定的登录的信息。

列名 | 数据类型 | 描述
LoginName | sysname | 登录名。
SID | varbinary(85) | 登录安全标识符。
DefDBName | sysname | LoginName 连接到 Microsoft® SQL Server™ 时使用的默认数据库。
DefLangName | sysname | LoginName 所使用的默认语言。
Auser | char(5) | Yes = LoginName 在一个数据库中有相关联的用户名。 No = LoginName 没有相关联的用户名。
ARemote | char(7) | Yes = LoginName 有相关的远程登录。 No = LoginName 没有相关的登录。

第二个报表包含有关与每个登录相关的用户及别名的信息。

列名 | 数据类型 | 描述
LoginName | sysname | 登录名。
DBName | sysname | 连接到 SQL Server 时，LoginName 所使用的默认数据库。
UserName | sysname | 在 DBName 中，LoginName 所映射到的用户帐户以及 LoginName 所属的角色。
UserOrAlias | char(8) | MemberOf = UserName 是角色。 User = UserName 是用户帐户。

注释

在删除登录之前，使用 sp_helplogins 确定该登录映射到的用户帐户。

权限

只有 sysadmin 和 securityadmin 固定服务器角色的成员才可以执行 sp_helplogins。

sp_helplogins 必须检查服务器上所有的数据库，以确定这些数据库中与登录相关的用户帐户。因此，服务器上的每个数据库都必须满足下列条件之一：

  • 执行 sp_helplogins 的用户必须有访问该数据库的权限。

  • guest 用户帐户必须存在于数据库中。

如果不能访问某个数据库，则 sp_helplogins 显示错误信息 15622，并且尽其所能显示所有与这些数据库中的用户帐户相关的登录信息。

示例

下面的示例报告有关登录 John 的信息。

EXEC sp_helplogins 'John'
go

LoginName SID                        DefDBName DefLangName AUser ARemote
--------- -------------------------- --------- ----------- ----- -------
John      0x23B348613497D11190C100C  master    us_english  yes   no

(1 row(s) affected)

LoginName   DBName   UserName   UserOrAlias
---------   ------   --------   -----------
John        pubs     John       User

(1 row(s) affected)

请参见

sp_helpuser

系统存储过程


sp_helpntgroup

报告在当前数据库中有帐户的 Microsoft® Windows NT® 组的有关信息。

语法

sp_helpntgroup [ [ @ntname = ] 'name' ]

参数

[@ntname =] 'name'

是 Windows NT 组的名称。name 的数据类型为 sysname，默认值为 NULL。name 必须是当前数据库中有效的 Windows NT 组。如果没有指定 name，那么在输出结果中包含当前数据库中的所有 Windows NT 组。指定数据库中已知的 Windows NT 组的名称（使用 sp_grantdbaccess 添加该名称。）

返回代码值

0（成功）或 1（失败）

结果集
列名 | 数据类型 | 描述
NTGroupName | sysname | Windows NT 组的名称。
NTGroupId | smallint | 组 ID。
SID | varbinary(85) | NTGroupName 的安全标识符。
HasDbAccess | int | 1 = Windows NT 组有权访问数据库。

注释

若要查看当前数据库中 Microsoft SQL Server™ 角色的列表，请使用 sp_helprole。

权限

执行权限默认授予 public 角色。

示例

下面的示例显示当前数据库中 Windows NT 组的一个列表。

EXEC sp_helpntgroup

请参见

sp_grantdbaccess

sp_helprole

sp_revokedbaccess

系统存储过程


sp_helpremotelogin

报告已经在本地服务器上定义的某个或所有远程服务器的远程登录的有关信息。

语法

sp_helpremotelogin [ [ @remoteserver = ] 'remoteserver' ]
[ , [ @remotename = ] 'remote_name' ]

参数

[@remoteserver =] 'remoteserver'

是远程服务器，返回有关该服务器的远程登录信息。remoteserver 的数据类型为 sysname，默认值为 NULL。如果没有指定 remoteserver，那么返回所有已在本地服务器上定义的远程服务器的有关信息。

[@remotename =] 'remote_name'

是远程服务器上的某个特定远程登录。remote_name 的数据类型为 sysname，默认值为 NULL。如果没有指定 remote_name，那么返回有关为 remoteserver 定义的所有远程用户的信息。

返回代码值

0（成功）或 1（失败）

结果集
列名 | 数据类型 | 描述
server | sysname | 在本地服务器上定义的远程服务器的名称。
local_user_name | sysname | 本地服务器上的登录，来自服务器的远程登录映射到该登录。
remote_user_name | sysname | 远程服务器上的登录，该登录映射到 local_user_name。
options | sysname | Trusted = 从远程服务器连接到本地服务器时，远程登录不需要提供密码。 Untrusted（或空白）= 从远程连接到本地服务器时，会提示远程登录提供密码。

注释

使用 sp_helpserver 列出在本地服务器上定义的远程服务器的名称。

权限

执行权限默认授予 public 角色。

示例
A. 报告关于单个服务器的帮助

下面的示例显示有关远程服务器 Accounts 上所有远程用户的信息。

EXEC sp_helpremotelogin 'Accounts'
B. 报告关于所有远程用户的帮助

下面的示例显示有关本地服务器所知的所有远程服务器上的所有远程用户的信息。

EXEC sp_helpremotelogin

请参见

sp_addremotelogin

sp_dropremotelogin

sp_helpserver

sp_remoteoption

系统存储过程


sp_helprole

返回有关当前数据库中角色的信息。

语法

sp_helprole [ [ @rolename = ] 'role' ]

参数

[@rolename =] 'role'

是当前数据库中某个角色的名称。role 的数据类型为 sysname，默认值为 NULL。role 必须存在于当前的数据库中。如果没有指定 role，那么返回有关当前数据库中所有角色的信息。

返回代码值

0（成功）或 1（失败）

结果集
列名 | 数据类型 | 描述
RoleName | sysname | 当前数据库中角色的名称。
RoleId | smallint | RoleName 的 ID。
IsAppRole | int | 0 = RoleName 不是应用程序角色。 1 = RoleName 是应用程序角色。

注释

若要查看与角色相关的权限，请使用 sp_helprotect。

若要查看数据库角色的成员，请使用 sp_helprolemember。

权限

执行权限默认授予 public 角色。

示例

下面的示例显示当前数据库中的所有角色。

EXEC sp_helprole

请参见

sp_addapprole

sp_addrole

sp_droprole

sp_helprolemember

sp_helpsrvrolemember

系统存储过程


sp_helprolemember

返回有关当前数据库中某个角色的成员的信息。

语法

sp_helprolemember [ [ @rolename = ] 'role' ]

参数

[@rolename =] 'role'

是当前数据库中某个角色的名称。role 的数据类型为 sysname，默认值为 NULL。role 必须存在于当前的数据库中。如果没有指定 role，那么返回所有角色，这些角色至少包含当前数据库中的一个成员。

返回代码值

0（成功）或 1（失败）

结果集
列名 | 数据类型 | 描述
DbRole | sysname | 当前数据库中角色的名称。
MemberName | sysname | DbRole 成员的名称。
MemberSID | varbinary(85) | MemberName 的安全标识符。

注释

如果某个子角色是指定角色的成员，那么请使用带有子角色名称的 sp_helprolemember 查看该子角色的成员。

使用 sp_helpsrvrolemember 显示固定服务器角色的成员。

权限

执行权限默认授予 public 角色。

示例

下面的示例显示 Sales 角色的成员。

EXEC sp_helprolemember 'Sales'

请参见

sp_addrolemember

sp_droprolemember

sp_helprole

sp_helpsrvrolemember

系统存储过程


sp_helprotect

返回一个报表，报表中包含当前数据库中某对象的用户权限或语句权限的信息。

语法

sp_helprotect [ [ @name = ] 'object_statement' ]
[ , [ @username = ] 'security_account' ]
[ , [ @grantorname = ] 'grantor' ]
[ , [ @permissionarea = ] 'type' ]

参数

[@name =] 'object_statement'

是当前数据库中要报告其权限的对象或语句的名称。object_statement 的数据类型为 nvarchar(776)，默认值为 NULL，此默认值将返回所有的对象及语句权限。如果值是一个对象（表、视图、存储过程或扩展存储过程），那么它必须是当前数据库中一个有效的对象。对象名称可以包含所有者限定符，形式为 owner.object。

如果 object_statement 是一个语句，则可以为：

  • CREATE DATABASE

  • CREATE DEFAULT

  • CREATE FUNCTION

  • CREATE PROCEDURE

  • CREATE RULE

  • CREATE TABLE

  • CREATE VIEW

  • BACKUP DATABASE

  • BACKUP LOG

[@username =] 'security_account'

是返回其权限的安全帐户名称。security_account 的数据类型为 sysname，默认值为 NULL，这个默认值将返回当前数据库中所有的安全帐户。security_account 必须是当前数据库中的有效安全帐户。当指定 Microsoft® Windows NT® 用户时，请指定该 Windows NT 用户在数据库中可被识别的名称（用 sp_grantdbaccess 添加）。

[@grantorname =] 'grantor'

是已授权的安全帐户的名称。grantor 的数据类型为 sysname，默认值为 NULL，这个默认值将返回数据库中任何安全帐户所授权限的所有信息。当指定 Windows NT 用户时，请指定该 Windows NT 用户在数据库中可被识别的名称（用 sp_grantdbaccess 添加）。

[@permissionarea =] 'type'

是一个字符串，表示是显示对象权限（字符串 o）、语句权限（字符串 s）还是两者都显示 (o s)。type 的数据类型为 varchar(10)，默认值为 o s。type 可以是 o 和 s 的任意组合，在 o 和 s 之间可以有也可以没有逗号或空格。

返回代码值

0（成功）或 1（失败）

结果集
列名 | 数据类型 | 描述
Owner | sysname | 对象所有者的名称。
Object | sysname | 对象的名称。
Grantee | sysname | 被授予权限的用户的名称。
Grantor | sysname | 向指定的被授权限用户进行授权的用户的名称。
ProtectType | char(10) | 保护类型的名称： GRANT REVOKE
Action | varchar(20) | 权限的名称： REFERENCES SELECT INSERT DELETE UPDATE CREATE TABLE CREATE DATABASE CREATE FUNCTION CREATE RULE CREATE VIEW CREATE PROCEDURE EXECUTE BACKUP DATABASE CREATE DEFAULT BACKUP LOG
Column | sysname | 权限的类型： All = 权限适用于对象所有的当前列。 New = 权限适用于任何以后可以在对象上进行修改（使用 ALTER 语句）的新列。 All+New = All 和 New 的组合。

注释

该过程的所有参数都是可选的。如果不带参数执行 sp_helprotect，将显示当前数据库中所有已经授予或拒绝的权限。

如果指定了一部分参数，而不是指定全部参数，请使用命名参数来标识特定的参数，或者使用 NULL 作为占位符。例如，若要报告授予方 dbo 的所有权限，请执行：

EXEC sp_helprotect NULL, NULL, dbo

或

EXEC sp_helprotect @grantorname = 'dbo'

输出报表按权限分类、所有者、对象、被授予方、授予方、保护类型分类、保护类型、动作以及列连续 ID 进行排序。

权限

执行权限默认授予 public 角色。

示例
A. 列出某个表的权限

下面的示例列出了表 titles 的权限。

EXEC sp_helprotect 'titles'
B. 列出某个用户的权限

下面的示例列出当前数据库中用户 Judy 所拥有的所有权限。

EXEC sp_helprotect NULL, 'Judy'
C. 列出由某个特定的用户授予的权限

下面的示例列出了当前数据库中由用户 Judy 授予的所有权限，使用 NULL 作为缺少的参数的占位符。

EXEC sp_helprotect NULL, NULL, 'Judy'
D. 仅列出语句权限

下面的示例列出当前数据库中所有的语句权限，使用 NULL 作为缺少的参数的占位符。

EXEC sp_helprotect NULL, NULL, NULL, 's'

请参见

DENY

GRANT

REVOKE

系统存储过程


sp_helpserver

报告某个特定远程或复制服务器的信息，或者报告两种类型的所有服务器的信息。提供服务器名称、服务器网络名、服务器复制状态、服务器标识号、排序规则名称和连接到链接服务器的超时值或对链接服务器进行查询的超时值。

语法

sp_helpserver [ [ @server = ] 'server' ]
[ , [ @optname = ] 'option' ]
[ , [ @show_topology = ] 'show_topology' ]

参数

[@server =] 'server'

服务器，将报告该服务器的信息。没有提供 server 时，将报告有关 master.dbo.sysservers 中所有服务器的情况。server 的数据类型为 sysname，默认值为 NULL。

[@optname =] 'option'

是描述服务器的选项。option 的数据类型为 varchar(35)，默认值为 NULL，并且可以是下列值之一。

值 | 描述
collation compatible | 分布式查询执行的效果与链接的服务器有关。如果该选项设置为 true，则 Microsoft® SQL Server™ 假定链接服务器中的所有字符在字符集和排序规则序列（或排序次序）上与本地服务器兼容。
data access | 启用和禁用分布式查询访问的链接服务器。
dist | 分发服务器。
dpub | 到该分发服务器的远程发布服务器。
lazy schema validation | 在查询开始跳过远程表的架构检查。
pub | 发布服务器。
rpc | 从给定的服务器启用 RPC。
rpc out | 对给定的服务器启用 RPC。
sub | 订阅服务器。
system | 仅限内部使用。
use remote collation | 使用远程列的排序规则而不使用本地服务器的排序规则。

[@show_topology =] 'show_topology'

是给定服务器和其它服务器之间的关系。show_topology 的数据类型为 varchar(1)，默认值为 NULL。如果 show_topology 不等于 t 或为 NULL，则 sp_helpserver 返回在结果集部分列出的列。如果 show_topology 等于 t，则除了在结果集中列出的列外，sp_helpserver 还返回 topx 和 topy 信息。

返回代码值

0（成功）或 1（失败）

结果集
列名 | 数据类型 | 描述
name | sysname | 服务器名称。
network_name | sysname | 服务器的网络名。
status | varchar(70) | 服务器状态。
id | char(4) | 服务器的标识号。
collation_name | sysname | 服务器的排序规则。
connect_timeout | int | 连接到链接服务器的超时值。
query_timeout | int | 对链接服务器进行查询的超时值。

注释

一个服务器可以有多种状态。

权限

执行权限默认授予 public 角色。

示例
A. 显示所有服务器的信息

下面的示例显示所有服务器的信息（sp_helpserver 不带参数）。

USE master
EXEC sp_helpserver
B. 显示某个特定服务器的信息

下面的示例显示服务器 SEATTLE2 的所有信息。

USE master
EXEC sp_helpserver 'SEATTLE2'

请参见

sp_adddistpublisher

sp_addserver

sp_addsubscriber

sp_changesubscriber

sp_dboption

sp_dropserver

sp_dropsubscriber

sp_helpdistributor

sp_helpremotelogin

sp_helpsubscriberinfo

sp_serveroption

系统存储过程


sp_helpsort

显示 Microsoft® SQL Server™ 排序次序和字符集。

语法

sp_helpsort

返回代码值

0（成功）或 1（失败）

结果集

返回服务器默认排序规则

权限

执行权限默认授予 public 角色。

示例

下面的示例显示了服务器默认排序次序的名称、字符集以及一个包含其主要排序值的表。

sp_helpsort
go

下面是结果集。

Server default collation
------------------------
Latin1-General, case-sensitive, accent-sensitive, kanatype-insensitive, width-insensitive for Unicode Data, SQL Server Sort Order 51 on Code Page 1252 for non-Unicode Data.

请参见

COLLATE

排序规则

fn_helpcollations


sp_helpsrvrole

返回 Microsoft® SQL Server™ 固定服务器角色列表。

语法

sp_helpsrvrole [ [ @srvrolename = ] 'role' ]

参数

[@srvrolename =] 'role'

是固定服务器角色的名称。role 的数据类型为 sysname，默认值为 NULL，可以是下列值之一。

固定服务器角色 | 描述
sysadmin | 系统管理员
securityadmin | 安全管理员
serveradmin | 服务器管理员
setupadmin | 设置管理员
processadmin | 进程管理员
diskadmin | 磁盘管理员
dbcreator | 数据库创建者
bulkadmin | 可执行 BULK INSERT 语句

返回代码值

0（成功）或 1（失败）

结果集
列名 | 数据类型 | 描述
ServerRole | sysname | 服务器角色的名称
Description | sysname | ServerRole 的描述

注释

固定服务器角色在服务器级上定义，这些角色具有完成特定服务器级管理活动的权限。不能添加、删除或更改固定服务器角色。

下表显示了一些存储过程，可以用这些存储过程来修改服务器角色。

存储过程 | 对策
sp_addsrvrolemember | 将登录帐户添加到固定服务器角色。
sp_helpsrvrolemember | 显示固定服务器角色的成员列表。
sp_dropsrvrolemember | 删除服务器角色的成员。

权限

执行权限默认授予 public 角色。

示例

下面的示例显示固定服务器角色的可用列表。

EXEC sp_helpsrvrole

请参见

sp_addsrvrolemember

sp_dropsrvrolemember

sp_helpsrvrolemember

系统存储过程


sp_helpsrvrolemember

返回有关 Microsoft® SQL Server™ 固定服务器角色成员的信息。

语法

sp_helpsrvrolemember [ [ @srvrolename = ] 'role' ]

参数

[@srvrolename =] 'role'

是固定服务器角色的名称，将返回有关该角色的成员信息。role 的数据类型为 sysname，默认值为 NULL。如果没有指定 role，结果集中将包含所有固定服务器角色的信息。

role 可以是下列值之一。

固定服务器角色 | 描述
sysadmin | 系统管理员
securityadmin | 安全管理员
serveradmin | 服务器管理员
setupadmin | 设置管理员
processadmin | 进程管理员
diskadmin | 磁盘管理员
dbcreator | 数据库创建者
bulkadmin | 可执行 BULK INSERT 语句

返回代码值

0（成功）或 1（失败）

结果集
列名 | 数据类型 | 描述
ServerRole | sysname | 服务器角色的名称
MemberName | sysname | ServerRole 成员的名称
MemberSID | varbinary(85) | MemberName 的安全标识符

注释

可以使用 sp_helprolemember 显示数据库角色的成员。

权限

执行权限默认授予 public 角色。

示例

下面的示例列出 sysadmin 固定服务器角色的成员。

EXEC sp_helpsrvrolemember 'sysadmin'

请参见

sp_addsrvrolemember

sp_dropsrvrolemember

sp_helprole

sp_helprolemember

系统存储过程


sp_helpstats

返回指定表中列和索引的统计信息。

语法

sp_helpstats[ @objname =] 'object_name'
[ , [ @results = ] 'value' ]

参数

[@objname =] 'object_name'

指定提供统计信息的表。object_name 的数据类型为 nvarchar(520)，不能为空。

[@results =] 'value'

指定提供信息的范围。有效的条目是 ALL 和 STATS。ALL 列出所有索引的统计，也包括在列上创建了统计的列。而 STATS 只列出与索引不相关的统计。value 的数据类型为 nvarchar(5)，默认值为 STATS。

返回代码值

0（成功）或 1（失败）

结果集

下表描述结果集内的列。

列名 | 描述
statistics_name | 统计的名称。返回 sysname 并且不能为空。
statistics_keys | 统计所基于的键。返回 nvarchar(2078) 并且不能为空。

注释

可以使用 DBCC SHOW_STATISTICS 显示与特定索引或统计相关的详细统计信息。在 SQL Server 7.0 联机丛书中，请参见 DBCC SHOW_STATISTICS 以及 sp_helpindex 以获取相关的信息。

权限

执行权限默认授予 public 角色。

示例

执行 sp_createstats 为 Northwind 数据库中所有用户表的所有符合条件的列创建单列统计。要找出在表 Customers 中创建的统计，请执行 sp_helpstats。

下表列出了结果集的内容。

statistics_name | statistics_keys
PK_Customers | CustomerID
City | City
CompanyName | CompanyName
PostalCode | PostalCode
Region | Region
ContactName | ContactName
ContactTitle | ContactTitle
Address | Address
Country | Country
Phone | Phone
Fax | Fax


sp_helptask

提供 sp_helptask 只是为了向后兼容。有关 Microsoft® SQL Server™ 7.0 版中使用的过程的更多信息，请参见 SQL Server 向后兼容性详细信息。

提供用户拥有的一个或多个任务的相关信息。sp_helptask 阻止将保存在 systasks 表中的敏感信息返回给所有的用户。

重要 有关 SQL Server 早期版本中使用的语法的更多信息，请参见用于 6.x 版的《Microsoft SQL Server Transact-SQL 参考》。

权限

执行权限默认授予 public 角色。任何可以执行该过程的用户都可以对下列内容进行创建、删除或更新操作：作业、作业步骤、作业分类、作业调度、作业服务器、任务或作业历史信息。

请参见

sp_addtask

sp_droptask

sp_purgehistory

sp_updatetask

系统存储过程


sp_helptext

显示规则、默认值、未加密的存储过程、用户定义函数、触发器或视图的文本。

语法

sp_helptext [ @objname = ] 'name'

参数

[@objname =] 'name'

对象的名称，将显示该对象的定义信息。对象必须在当前数据库中。name 的数据类型为 nvarchar(776)，没有默认值。

返回代码值

0（成功）或 1（失败）

结果集
列名 | 数据类型 | 描述
Text | nvarchar(255) | 对象定义文本

注释

sp_helptext 在多个行中显示用来创建对象的文本，其中每行有 Transact-SQL 定义的 255 个字符。这些定义只驻留在当前数据库的 syscomments 表的文本中。

权限

执行权限默认授予 public 角色。

示例

下面的示例显示 employee_insupd 触发器的文本，该触发器在数据库 pubs 中。

USE pubs
EXEC sp_helptext 'employee_insupd'

请参见

CREATE PROCEDURE

CREATE TRIGGER

CREATE VIEW

sp_help

系统存储过程


sp_helptrigger

返回指定表中定义的当前数据库的触发器类型。

语法

sp_helptrigger [ @tabname = ] 'table'
[ , [ @triggertype = ] 'type' ]

参数

[@tabname =] 'table'

是当前数据库中表的名称，将返回该表的触发器信息。table 的数据类型为 nvarchar(776)，没有默认值。

[@triggertype =] 'type'

是触发器的类型，将返回此类型触发器的信息。type 的数据类型为 char(6)，默认值为 NULL，并且可以是下列值之一。

值 | 描述
DELETE | 返回 DELETE 触发器信息。
INSERT | 返回 INSERT 触发器信息。
UPDATE | 返回 UPDATE 触发器信息。

返回代码值

0（成功）或 1（失败）

结果集

下表显示了结果集中包含的信息。

列名 | 数据类型 | 描述
trigger_name | sysname | 触发器的名称。
trigger_owner | sysname | 触发器所有者的名称。
isupdate | int | 1= UPDATE 触发器 0= 不是 UPDATE 触发器
isdelete | int | 1= DELETE 触发器 0= 不是 DELETE 触发器
isinsert | int | 1= INSERT 触发器 0= 不是 INSERT 触发器
isafter | int | 1= AFTER 触发器 0= 不是 AFTER 触发器
isinsteadof | int | 1= INSTEAD OF 触发器 0= 不是 INSTEAD OF 触发器

权限

执行权限默认授予 public 角色。

示例

下面的示例创建一个名为 sales_warn 的触发器，当书的销售总量达到 10 时，就产生错误 50010。然后执行 sp_helptrigger 列出表 sales 中触发器的相关信息。

USE pubs
CREATE TRIGGER sales_warn
ON sales
FOR INSERT, UPDATE
AS RAISERROR (50010, 16, 10)

EXEC sp_helptrigger sales

下面是结果集：

trigger_name  trigger_owner           isupdate    isdelete    isinsert
------------- ----------------------- ----------- ----------- ---------
sales_warn        dbo                 1           0         1

(1 row(s) affected)

请参见

ALTER TRIGGER

CREATE TRIGGER

DROP TRIGGER

系统存储过程


sp_helpuser

报告有关当前数据库中 Microsoft® SQL Server™ 用户、Microsoft Windows NT® 用户和数据库角色的信息。

语法

sp_helpuser [ [ @name_in_db = ] 'security_account' ]

参数

[@name_in_db =] 'security_account'

当前数据库中 SQL Server 用户、Windows NT 用户或数据库角色的名称。security_account 必须存在于当前的数据库中。security_account 的数据类型为 sysname，默认值为 NULL。如果没有指定 security_account，系统过程将报告当前数据库中的所有用户、Windows NT 用户以及角色的信息。当指定 Windows NT 用户时，请指定该 Windows NT 用户在数据库中可被识别的名称（用 sp_grantdbaccess 添加）。

返回代码值

0（成功）或 1（失败）

结果集

既没有为 security_account 指定用户帐户，也没有为它指定 SQL Server 或 Windows NT 用户。

列名 | 数据类型 | 描述
UserName | sysname | 当前数据库中的用户和 Windows NT 用户。
GroupName | sysname | UserName 所属的角色。
LoginName | sysname | UserName 的登录。
DefDBName | sysname | UserName 的默认数据库。
UserID | smallint | 当前数据库中 UserName 的 ID。
SID | smallint | 用户的安全标识号 (SID)。

没有指定用户帐户，并且别名存在于当前的数据库中。

列名 | 数据类型 | 描述
LoginName | sysname | 当前数据库中，登录名已经化名为用户名。
UserNameAliasedTo | sysname | 当前数据库中，登录所化名为的用户名。

为 security_account 指定角色。

列名 | 数据类型 | 描述
Group_name | sysname | 当前数据库中角色的名称。
Group_id | smallint | 当前数据库中角色的角色 ID。
Users_in_group | sysname | 当前数据库中角色的成员。
Userid | smallint | 角色成员的用户 ID。

注释

使用 sp_helpsrvrole 及 sp_helpsrvrolemember 返回固定服务器角色的信息。

为数据库角色执行 sp_helpuser 等价于为该数据库角色执行 sp_helpgroup。

权限

执行权限默认授予 public 角色。

示例
A. 列出所有用户

下面的示例列出当前数据库中所有的用户。

EXEC sp_helpuser
B. 列出单个用户的信息

下面的示例列出用户 dbo 的信息。

EXEC sp_helpuser 'dbo'
C. 列出某个数据库角色的信息

下面的示例列出 db_securityadmin 固定数据库角色的信息。

EXEC sp_helpuser 'db_securityadmin'

请参见

sp_adduser

sp_dropuser

sp_helpgroup

sp_helprole

sp_helpsrvrole

sp_helpsrvrolemember

系统存储过程


sp_indexes

返回指定远程表的索引信息。

语法

sp_indexes [ @table_server = ] 'table_server'
[ , [@table_name = ] 'table_name' ]
    [ , [ @table_schema = ] 'table_schema' ]
    [ , [ @table_catalog = ] 'table_db' ]
[ , [ @index_name = ] 'index_name' ]
    [ , [ @is_unique = ] 'is_unique' ]

参数

[@table_server =] 'table_server'

是正在为其请求表信息的运行 Microsoft® SQL Server™ 的链接服务器名。table_server 的数据类型为 sysname，没有默认值。

[@table_name =] 'table_name'

为其提供索引信息的远程表的名称。table_name 的数据类型为 sysname，默认值为 NULL。如果为 NULL，则返回指定数据库中的所有表。

[@table_schema =] 'table_schema'

指定表架构。在 Microsoft SQL Server 环境中，该参数对应于表的所有者，table_schema 的数据类型为 sysname，默认值为 NULL。

[@table_catalog =] 'table_db'

table_name 所在数据库的名称。table_catalog 的数据类型为 sysname，默认值为 NULL。如果为 NULL，则 table_db 的默认值为 master。

[@index_name =] 'index_name'

要获取其信息的索引的名称，index 的数据类型为 sysname，默认值为 NULL。

[@is_unique =] 'is_unique'

要获取其信息的索引的类型。is_unique 的数据类型为 bit，默认值为 NULL，可以是下列值之一。

值 | 描述
1 | 返回有关唯一索引的信息。
0 | 返回有关非唯一索引的信息。
NULL | 返回有关所有索引的信息。

结果集
列名 | 数据类型 | 描述
TABLE_CAT | sysname | 指定的表所在的数据库的名称。
TABLE_SCHEM | sysname | 表的架构。
TABLE_NAME | sysname | 远程表的名称。
NON_UNIQUE | smallint | 索引是否唯一： 0 = 唯一 1 = 不唯一
INDEX_QUALIFER | sysname | 索引所有者的姓名。某些 DBMS 产品允许表所有者以外的用户创建索引。在 SQL Server 中，该列始终和 TABLE_NAME 相同。
INDEX_NAME | sysname | 索引的名称。
TYPE | smallint | 索引的类型： 0 = 表的统计 1 = 聚集 2 = 哈希 3 = 其它
ORDINAL_POSITION | int | 列在表中的顺序位置。表中的第一列为 1。该列始终返回值。
COLUMN_NAME | sysname | 返回的每个 TABLE_NAME 列的对应列名。
ASC_OR_DESC | varchar | 排序规则中使用的顺序： A = 升序 D = 降序 NULL = 不适用 SQL Server 总是返回 A。
CARDINALITY | int | 表中的行数或索引中唯一值的数目。
PAGES | int | 存储索引或表的页数。
FILTER_CONDITION | nvarchar(4000) | SQL Server 不返回值。

权限

执行权限默认授予 public 角色。

示例

下面的示例从 LONDON1 数据库服务器的 Northwind 数据库的 Employees 表中返回所有索引信息。

EXEC sp_indexes @table_server = 'LONDON1',
   @table_name = 'Employees',
   @table_catalog = 'Northwind',
   @is_unique = 0

请参见

sp_catalogs

sp_column_privileges

sp_foreignkeys

sp_indexes

sp_linkedservers

sp_tables_ex

sp_table_privileges

系统存储过程


sp_indexoption

设置用户定义索引的选项值。

说明 Microsoft® SQL Server™ 自动从页级、行级或表级锁定中选择。不必人工设置这些选项。sp_indexoption 是为那些清楚地知道特定类型的锁适用于何种情况的专家级用户提供的。

语法

sp_indexoption [ @IndexNamePattern = ] 'index_name'
, [ @OptionName = ] 'option_name'
, [ @OptionValue = ] 'value'

参数

[@IndexNamePattern =] 'index_name'

用户定义的数据库表或索引的合格名称或不合格名称。如果指定单个索引或表名，则无需引号。即使提供了完全合格的名称（包括数据库名称），数据库名也必须是当前数据库的名称。如果给定的表名没有索引，则指定的选项值被设置为用于该表的所有索引。index_pattern 的数据类型为 nvarchar(1035)，没有默认值。

[@OptionName =] 'option_name'

是索引选项名。option_name 的数据类型为 varchar (35)，没有默认值。option_name 可以有下列值。

值 | 描述
AllowRowLocks | 为 FALSE 时，不使用行级锁。使用页级锁和表级锁获得对指定索引的访问。
AllowPageLocks | 为 FALSE 时，不使用页级锁。使用行级锁和表级锁获得对指定索引的访问。
DisAllowRowLocks | 为 TRUE 时，不使用行级锁。使用页级锁和表级锁获得对指定索引的访问。
DisAllowPageLocks | 为 TRUE 时，不使用页级锁。使用行级锁和表级锁获得对指定索引的访问。

[@OptionValue =] 'value'

指定是启用（TRUE、on 或 1）还是禁用（FALSE、off 或 0）option_name 设置。value 的数据类型为 varchar(12)，没有默认值。

返回代码值

0（成功）或大于 0（失败）

注释

sp_indexoption 仅可用作设置用户定义索引的选项值。若要显示索引属性，请使用 INDEXPROPERTY。

权限

sysadmin 固定服务器角色成员、db_owner 和 db_ddladmin 固定数据库角色的成员以及表所有者可以修改任何用户定义索引的 AllowRowLocks/DisAllowRowLocks 和 AllowPageLocks/DisAllowPageLocks 选项。

其他用户只能修改自己拥有的表的选项。

示例

下面的示例禁用 Customers 表的 City 索引的页级锁。

USE Northwind
GO
EXEC sp_indexoption 'Customers.City',
   'disallowpagelocks',
   TRUE

请参见

INDEXPROPERTY

系统存储过程


sp_invalidate_textptr

使事务中的指定行内文本指针或所有行内文本指针无效。sp_invalidate_textptr 仅可用于行内文本指针，该指针来自启用了 text in row 选项的表。

语法

sp_invalidate_textptr [ [ @TextPtrValue = ] textptr_value ]

参数

[ @TextPtrValue = ] textptr_value

是将要无效的行内文本指针。textptr_value 的数据类型为 varbinary (16)，默认值为 NULL。如果为 NULL，sp_invalidate_textptr 将使事务中的所有行内文本指针无效。

返回代码值

0（成功）或 1（失败）

注释

SQL Server 允许每个数据库中的每个事务最多拥有 1024 个活动的有效行内文本指针；而跨多个数据库的事务可在每个数据库中拥有 1024 个行内文本指针。sp_invalidate_textptr 可用于使行内文本指针无效，从而释放空间供其它的行内文本指针使用。

有关 text in row 选项的更多信息，请参见sp_tableoption。

权限

sp_invalidate_textptr 的执行权限默认授予所有用户。

请参见

管理 ntext、text 和 image 数据

sp_tableoption

TEXTPTR

TEXTVALID


sp_linkedservers

返回本地服务器中定义的链接服务器列表。

语法

sp_linkedservers

返回代码值

0（成功）或非零数字（失败）

结果集
列名 | 数据类型 | 描述
SRV_NAME | sysname | 链接服务器的名称。
SRV_PROVIDERNAME | nvarchar(128) | OLE DB 提供程序的友好名称，该提供程序管理对指定的链接服务器进行的访问。
SRV_PRODUCT | nvarchar(128) | 链接服务器的产品名。
SRV_DATASOURCE | nvarchar(4000) | 与指定链接服务器对应的 OLE DB 数据源属性。
SRV_PROVIDERSTRING | nvarchar(4000) | 与链接服务器对应的 OLE DB 提供程序字符串属性。
SRV_LOCATION | nvarchar(4000) | 与指定链接服务器对应的 OLE DB 位置属性。
SRV_CAT | sysname | 与指定链接服务器对应的 OLE DB 目录属性。

请参见

sp_catalogs

sp_column_privileges

sp_columns_ex

sp_foreignkeys

sp_indexes

sp_primarykeys

sp_table_privileges

sp_tables_ex

系统存储过程


sp_lock

报告有关锁的信息。

语法

sp_lock [[@spid1 =] 'spid1'] [,[@spid2 =] 'spid2']

参数

[@spid1 =] 'spid1'

是来自 master.dbo.sysprocesses 的 Microsoft® SQL Server™ 进程 ID 号。spid1 的数据类型为 int，默认值为 NULL。执行 sp_who 可获取有关该锁的进程信息。如果没有指定 spid1，则显示所有锁的信息。

[@spid2 =] 'spid2'

是用于检查锁信息的另一个 SQL Server 进程 ID 号。spid2 的数据类型为 int，默认设置为 NULL。spid2 为可以与 spid1 同时拥有锁的另一个 spid，用户还可获取有关它的信息。

说明 sp_who 可含有 0 个、1 个或 2 个参数。这些参数确定存储过程是显示全部、1 个还是 2 个 spid 进程的锁定信息。

返回代码值

0（成功）

结果集
列名 | 数据类型 | 描述
spid | smallint | SQL Server 进程 ID 号。
dbid | smallint | 请求锁的数据库标识号。
ObjId | int | 请求锁的对象的对象标识号。
IndId | smallint | 索引标识号。
type | nchar(4) | 锁的类型： DB：数据库 FIL：文件 IDX：索引 PG：页 KEY：键 TAB：表 EXT：扩展盘区 RID：行标识符
Resource | nchar(16) | 与 syslockinfo.restext 中的值对应的锁资源。
Mode | nvarchar(8) | 锁请求者的锁模式。该锁模式代表已授予模式、转换模式或等待模式。
Status | int | 锁的请求状态 GRANT WAIT CNVRT

注释

用户可以通过向 SELECT 语句的 FROM 子句中添加优化程序提示或设置 SET TRANSACTION ISOLATION LEVEL 选项来控制锁定。有关语法和限制的信息，请参见 SELECT 和 SET TRANSACTION ISOLATION LEVEL。

通常，读操作获取共享锁，写操作获取排它锁。在更新操作的初始阶段读取数据时，会获取更新锁。更新锁与共享锁兼容。此后，如果更改了数据，更新锁会提升为排它锁。有时在更改数据时，会在获取排它锁之前暂时获取更新锁。此后，该更新锁会自动提升为排它锁。

可以锁定各种级别的数据，包括整个表、表中的一页或多页以及表的一行或多行。粒度级别较高的意向锁表示正在或试图以较低的锁粒度级别获取锁。例如，表意向锁表示获取共享页级锁或排它页级锁的意向。意向锁可以阻止另一个事务获取该表的表锁。

当分配或释放由 8 个数据库页组成的组时，将持有扩展盘区锁。扩展盘区锁在运行 CREATE 或 DROP 语句时或在运行需要新数据或索引页的 INSERT 或 UPDATE 语句时设置。

在读取 sp_lock 信息时，使用 OBJECT_NAME( ) 函数通过表的 ID 号获取表的名称，例如：

SELECT object_name(16003088)

所有与 SPID 值不关联的分布式事务都是孤立事务。SQL Server 2000 给所有孤立的分布式事务赋予 SPID 值"-2"

，使得用户更容易识别阻塞的分布式事务。有关更多信息，请参见 KILL。

有关使用 Windows NT 性能监视器查看特定进程 ID 信息的更多信息，请参见 DBCC。

权限

执行权限默认授予 public 角色。

示例
A. 列出所有锁

下面的示例显示 SQL Server 中当前持有的所有锁的信息。

USE master
EXEC sp_lock
B. 列出单个服务器进程的锁

下例显示进程 ID 53 的信息（其中包括锁信息）。

USE master
EXEC sp_lock 53

请参见

函数

KILL

锁定

sp_who

系统存储过程


sp_makewebtask

创建一项生成 HTML 文档的任务，该文档包含执行过的查询返回的数据。

说明 所有 Web 作业在企业管理器的"作业分类"对话框中都被归为 Web 助手。有关更多信息，请参见定义作业。

语法

sp_makewebtask [@outputfile =] 'outputfile', [@query =] 'query'
[, [@fixedfont =] fixedfont]
[, [@bold =] bold]
[, [@italic =] italic]
[, [@colheaders =] colheaders]
[, [@lastupdated =] lastupdated]
[, [@HTMLheader =] HTMLheader]
    [, [@username =] username]
[, [@dbname =] dbname]
[, [@templatefile =] 'templatefile']
[, [@webpagetitle =] 'webpagetitle']
[, [@resultstitle =] 'resultstitle']
[
        [, [@URL =] 'URL', [@reftext =] 'reftext']
| [, [@table_urls =] table_urls, [@url_query =] 'url_query']
]
    [, [@whentype =] whentype]
[, [@targetdate =] targetdate]
[, [@targettime =] targettime]
[, [@dayflags =] dayflags]
[, [@numunits =] numunits]
[, [@unittype =] unittype]
[, [@procname =] procname ]
[, [@maketask =] maketask]
[, [@rowcnt =] rowcnt]
[, [@tabborder =] tabborder]
[, [@singlerow =] singlerow]
[, [@blobfmt =] blobfmt]
[, [@nrowsperpage =] n]
[, [@datachg =] table_column_list]
[, [@charset =] characterset]
[, [@codepage =] codepage]

参数

[@outputfile =] 'outputfile'

在 Microsoft® SQL Server™ 的实例上生成的 HTML 文件的位置。如果文档将在远程计算机上生成，则该参数可以是 UNC 名称。outputfile 的数据类型为 nvarchar(255)，没有默认值。

[@query =] 'query'

要运行的查询。query 的数据类型为 ntext，没有默认值。当通过 sp_runwebtask 运行任务时，查询结果将以表格形式显示在 HTML 文档中。可以指定多个 SELECT 查询，从而导致在 outputfile 中显示多个表。

[@fixedfont =] fixedfont

指定查询结果是以固定字体 (1) 还是以成比例字体 (0) 显示。fixedfont 的数据类型为 tinyint，默认值为 1。

[@bold =] bold

指定查询结果是以粗体 (1) 还是非粗体 (0) 显示。bold 的数据类型为 tinyint，默认值为 0。

[@italic =] italic

指定查询结果是以斜体 (1) 还是非斜体 (0) 显示。italic 的数据类型为 tinyint，默认值为 0。

[@colheaders =] colheaders

指定查询结果是带列标题 (1) 还是不带列标题 (0) 显示。colheaders 的数据类型为 tinyint，默认值为 1。

[@lastupdated =] lastupdated

指定所生成的 HTML 文档是否显示"上次更新时间："时间戳指示上次更新的日期和时间 (1) 或者没有时间戳 (0)。在 HTML 文档中，时间戳出现在查询结果的前一行。lastupdated 的数据类型为 tinyint，默认值为 1。

[@HTMLHeader =] HTMLHeader

指定用于显示包含在 resultstitle 中的文本的 HTML 格式代码。HTMLheader 的数据类型为 tinyint，可以是下列值之一。

值 | HTML 格式代码
1 | H1
2 | H2
3 | H3
4 | H4
5 | H5
6 | H6

[@username =] username

是执行查询的用户名。username 的数据类型为 nvarchar (128)，默认设置为当前用户。系统管理员或数据库所有者可以指定其它用户名。

[@dbname =] dbname

在其上运行查询的数据库名。dbname 的数据类型为 nvarchar(128)，默认值为当前数据库。

[@templatefile =] 'templatefile'

用于生成 HTML 文档的模板文件的路径。模板文件包含 HTML 文档的格式特征信息和标记 <%insert_data_here%>，该标记指示将查询结果添加到 HTML 表中的位置。templatefile 的数据类型为 nvarchar(255)。

指定查询结果在模板文件中位置的方法有两种：

  1. 通过包含 <%insert_data_here%> 标记指定一个通用表格式，该标记指示将查询结果添加到 HTML 表中的位置。标记间没有间隔。当使用 <%insert_data_here%> 时，fixedfont、bold、italic、colheaders 和 tabborders 值都将应用于查询结果。

  2. 指定完整的行格式，以便生成更加精确的版面。使用 <%begindetail%> 和 <%enddetail%> 标记，并在这两个标记之间使用 <TR>、</TR>、<TD> 和 </TD> 这些 HTML 标记定义完整的行格式。对于每个要显示在结果集中的列，都插入 <%insert_data_here%> 标记。当使用完整行格式时，下列 sp_makewebtask 参数将被忽略：
    Bold | lastupdated | table_urls
    Colheaders | reftext | URL
    Fixedfont | resultstitle | url_query
    HTMLheader | singlerow | webpagetitle
    Italic | tabborder

    被 sp_makewebtask 所调用的扩展过程可以读取 Unicode 和非 Unicode 模板文件。如果 Unicode 文件包含签名标题，则该标题将在生成 HTML 文件时删除。

[@webpagetitle =] 'webpagetitle'

HTML 文档的标题。webpagetitle 的数据类型为 nvarchar(255)，默认值为 SQL Server Web Assistant。对于空白标题，需要为标题指定两个空格字符，或通过编辑 HTML 源文件来删除 <TITLE> 和 </TITLE> 标记以及标记中间的标题文本。

[@resultstitle =] 'resultstitle'

HTML 文档中显示查询结果上方的标题。resultstitle 的数据类型为 nvarchar(255)，默认值为 Query Results。

[@URL =] 'URL'

转到其它 HTML 文档的超级链接。该超级链接位于查询结果之后、HTML 文档末尾。URL 的数据类型为 nvarchar(255)。如果指定了 URL，也必须指定 reftext，但不能指定 table_urls 和 url_query。

[@reftext =] 'reftext'

说明该超级链接应将用户带往哪一个 HTML 文档的超级链接文本。reftext 的数据类型为 nvarchar(255)。超级链接文本说明了目的地，而超级链接地址来自 URL。

[@table_urls =] table_urls

表示超级链接是否包含于 HTML 文档中并源于在 SQL Server 上执行的 SELECT 语句。table_urls 的数据类型为 tinyint，默认值为 0，该值说明查询将不生成超级链接。值为 1 说明将使用 url_query 生成一个超级链接列表。

重要 如果 table_urls 为 1，则必须包含 url_query 以指定要执行的检索超级链接信息的查询，但不能指定 URL 和 reftext。

[@url_query =] 'url_query'

生成 URL 及其超级链接文本的 SELECT 语句。URL 和超级链接文本来源于 SQL Server 表。通过该参数，可以生成多个带有相关超级链接的 URL。与 table_urls 一起使用 url_query。url_query 的数据类型为 nvarchar(255)。url_query 必须返回一个包含两列的结果集：第一列为超级链接地址，第二列描述超级链接。插入 HTML 文档中的超级链接数等于执行 url_query 所返回的行数。

[@whentype =] whentype

指定何时运行创建 HTML 文档的任务。whentype 的数据类型为 tinyint，可以取下列值。

值 | 描述
1（默认值） | 立即创建页。立即创建、执行 Web 作业，并在执行后立即删除。
2 | 以后创建页。立即创建用于创建 HTML 文档的存储过程，但 Web 作业的执行被延迟到 targetdate 和 targettime（可选）所指定的日期和时间。如果未指定 targettime，则在中午 12:00 执行 Web 作业。当 whentype 为 2 时，targetdate 是必需的。目标日期和时间过后，此 Web 作业自动删除。
3 | 在一周中每隔 n 天创建页。HTML 文档在 dayflags 所指定的日期和 targettime（可选）所指定的时间创建，从 targetdate 所指定的日期开始。如果省略 targettime，默认值将为上午 12:00。当 whentype 为 3 时，将要求 targetdate。在 dayflags 中指定一周中的哪一（些）天，并且一周可以指定不止一天。通过指定 whentype 为 3 所创建的 Web 作业将不会自动删除，它将继续在一周中指定的那一（些）天运行，直到用户通过 sp_dropwebtask 删除它们。
4 | 每隔 n 分钟、小时、天或星期创建页。从 targetdate 和 targettime 所指定的时间开始每 n 时间段创建一次 HTML 文档。如果没有指定 targettime，Web 作业将在中午 12:00 执行。此时需要指定 targetdate。作业按 umunits 和 unittype 中的指定每 n 分钟、小时、天或星期自动运行，直到用户通过 sp_dropwebtask 删除它们。
5 | 按要求创建页。该过程是在没有自动调度的情况下创建的。用户通过运行 sp_runwebtask 创建 HTML 文档，并且只能用 sp_dropwebtask 来删除它。
6 | 立即和以后创建页。如同 whentype 为 2 的情况，将立即创建和重新创建 HTML 文档。
7 | 立即以及在一周中每隔 n 天创建页。将立即创建和重新创建 HTML 文档，如同 whentype 为 3，只是不要求 targetdate。
8 | 立即创建页并从此定期创建。将立即创建和重新创建 HTML 文档，如同 whentype 为 4，只是不要求 targetdate。
9 | 立即和应请求创建页。将立即创建和重新创建 HTML 文档，如同 whentype 为 5。必须手工删除该任务。
10 | 立即和在数据更改时创建页。立即创建页，并在以后表数据更改时创建页。此值要求 datachg。

重要 当一项作业被调度为定期运行时，必须运行 SQL Server 代理；否则不会生成 HTML 页。

[@targetdate =] targetdate

指定生成页的日期。格式为 YYYYMMDD。当省略 targetdate 时，将使用当前日期。如果 whentype 为 2（以后）、3（星期几）、4（定期）或 6（现在和以后），将要求 targetdate。targetdate 的数据类型为 int，默认值为 0。

[@targettime =] targettime

指定创建 HTML 文档的时间，targettime 的数据类型为 int，默认值为上午 12:00。格式为 HHMMSS。

[@dayflags =] dayflags

指定在一周中某天更新 HTML 文档。当 whentype 为 3（星期几）或 7（现在和星期几）时，要求 dayflags。dayflags 的数据类型为 tinyint，可以是下列值之一。

值 | 星期
1（默认值） | 星期日
2 | 星期一
4 | 星期二
8 | 星期三
16 | 星期四
32 | 星期五
64 | 星期六

若要指定多天，可以将这些值相加。例如，若要指定星期一和星期四，可以将 dayflags 设置为 18。

[@numunits =] numunits

指定更新 HTML 文档的频率。numunits 只有在 whentype 为 4（定期）或 8（现在和以后定期）时才使用。例如，如果 whentype 为 4，numunits 为 6，并且 unittype 为 1（小时），所指定的 HTML 文档将每 6 小时更新一次。numunits 的数据类型为 tinyint，默认值为 1。取值范围可从 1 到 255。

[@unittype =] unittype

指定当 numunits 为 4（定期）或 whentype 为 8（现在和以后）时，HTML 文档更新的频率。unittype 的数据类型为 tinyint，可以是下列值之一。

值 | 描述
1（默认值） | 小时
2 | 天
3 | 周
4 | 分钟

[@procname =] procname

HTML 文档的过程或任务名称。如果没有指定 procname，通过 sp_makewebtask 生成的过程名称将呈现 Web_YYMMDDHHMMSS<spid> 的形式。如果 procname 由用户指定，则过程名称必须符合有效过程名称的条件，并且必须唯一。procname 的数据类型为 nvarchar(128)。如果 procname 太长，将被截断。

[@maketask =] maketask

指定是否要创建一个任务，以执行生成 HTML 文档的内部存储过程。maketask 的数据类型为 int，可以是下列值之一。

值 | 描述
0 | 生成一个未加密的存储过程但不创建任务。
1 | 生成一个加密的存储过程并创建任务。
2（默认值） | 生成一个未加密的存储过程并创建任务。

[@rowcnt =] rowcnt

指定生成的 HTML 文档中所显示行的最大值。rowcnt 的数据类型为 int，默认值为 0，用来指定显示在 HTML 文档中满足给定查询的所有行。

[@tabborder =] tabborder

指定是否在结果表四周加边框。tabborder 的数据类型为 tinyint。如果 tabborder 为 1（默认值），则加边框。如果为 0，则不加边框。

[@singlerow =] singlerow

指定结果是否以每页一行显示。singlerow 的数据类型为 tinyint。如果 singlerow 为 0（默认值），则所有结果将在同一页的同一表中出现。如果 singlerow 为 1，将为结果集中的每个符合条件的行创建一个新的 HTML 页。在生成连续的 HTML 页时，将在指定的 output_filename 后添加一个数字。例如，如果 Web.html 是指定的输出文件名，则这些页将被命名为 Web1.html、Web2.html 等等。

[@blobfmt =] blobfmt

指定是将 ntext 或 image 数据类型的所有列嵌入同一的结果页（NULL，默认值），还是将这些列保存到其它页并通过 URL 链接到主 HTML 文档。blobfmt 的数据类型为 ntext 或 image。

若要将 ntext 或 image 数据放到单独的 HTML 页，请使用以下格式为 blobfmt 指定值：

"%n% FILE=output_filename TPLT=template_filename URL=url_link_name..."

其中

n
是结果列表中与文本字段对应的列号，n+1 是单独的 ntext 或 image HTML 文件的 URL 超级链接文本。

说明 不要在等号 (=) 前后加空格，也不要将文件名放在引号 (') 内。

输出文件名以表示连续行的数字结尾，类似于 singlerow。output_filename 是必需的，但 template_filename 和 url_link_name 是可选的。FILE = output_filename 是输出文件位置的完整路径。如果提供，url_link_name 就是可以通过万维网访问的该文件的 http:// 链接。如果没有提供 url_link_name，将以 file:/// 标记开头的整个物理文件名作为 url_link_name。对于多个 text 或 image 列，可以重复使用 blobfmt (%n% FILE=...) 中相同的语法。

如果提供了 template_filename，使用 <%insert_data_here%> 方法可以表示数据的插入点。

URL 文本是结果集的一部分，而且始终是起始 ntext 或 image 列之后的那一列。URL 文本列不是以单独列在结果集中显示的。

[@nrowsperpage =] n

指定结果集应在多页中显示，每页中有 n 行，并且使用 NEXT 和 PREVIOUS URL 将连续页链接起来。n 的数据类型为 int，默认值为 0，表示所有结果都将显示在一页上。如果指定了 singlerow，则不能使用此参数。

[@datachg =] table_column_list

是数据改变时触发创建新页操作的表和可选列名称的列表。table_columns_list 的数据类型为 ntext。该值的格式为：

{TABLE=name[COLUMN=name]}[,...]

当 whentype 为 10 时，该参数是必需的。通过此选项，为指定的表和列创建三个触发器（UPDATE、INSERT 和 DELETE），并通过激发这些触发器来执行 Web 任务。如果表中已有触发器，则 sp_runwebtask 将添加到触发器的结尾处（如果该触发器不是由 WITH ENCRYPTION 创建的），并且这个参数中的 COLUMN 字段说明将被忽略。如果表中有一个通过 WITH ENCRYPTION 选项创建的触发器，则 sp_makewebtask 将失败。

[@charset =] characterset

为 Microsoft Internet Explorer 或兼容的浏览器所识别的字符集别名代码。characterset 的数据类型为 nvarchar(25)，默认值为 N'utf-8'。characterset 用来为 .htm 文件中的 META 元素字符集标记指定值。

[@codepage =] codepage

和字符集对应的数值。例如，代码页 65001 和字符集 UTF-8 对应。codepage 的数据类型为 int，默认值为 65001。要得到所支持的代码页的完整列表，请使用 sp_enumcodepages。

返回代码值

0（成功）或非零（失败）

重要 和以前版本的 Microsoft SQL Server 相比，返回代码值有所改变。

结果集

无

注释

对于调度的任务，所有错误都在有关 SQL Server 实例的 Microsoft Windows NT® 应用程序日志中报告，且都有一个 xpsqlweb 源文件。

重要 sp_dropwebtask、sp_makewebtask 和 sp_runwebtask 存储过程只能在 SQL Server 6.5 或更高版本上运行。

SQL Server Web 助手提供了一个使用 sp_makewebtask 存储过程的接口。有关使用 Web 助手创建 Web 页的更多信息，请参见使用 Web 助手向导。

HTML 文档可以使用的字体取决于 Web 浏览器软件的功能。有关字体可用性和 HTML 格式的更多信息，请参见浏览器软件文档。

重要 Microsoft Windows® 95 和 Microsoft Windows 98 Web 助手的所有用户在所用数据库中必须有用户帐户。使用 sp_adduser 向每个用户可能访问的数据库添加帐户。当运行 Windows 95/98 操作系统时，按需分配任务只能由任务所有者或系统管理员运行。

权限

用户必须有运行指定查询所需的 SELECT 权限，并在要运行该查询的数据库中有 CREATE PROCEDURE 权限。SQL Server 帐户必须具有将生成的 HTML 文档写入指定位置的权限。只有 sysadmin 固定服务器角色的成员才可以模拟其他用户。

示例
A. 使用模板文件创建多个查询

下例创建一个 HTML 文档，并按要求检索五本书的书名和价格、五个出版商的名称和五位作者的姓名。在本文档中，数据位置由 <%insert_data_here%> 标记指定。

本节显示了名为 C:\Web\Multiple.tpl 的模板文件。

说明 为使本示例正常运行，此处提供的模板文件代码必须保存在名为 C:\Web\Multiple.tpl 的文件中。在将模板保存在 C:\Web 目录之前，还需先创建 C:\Web 目录。

<HTML>

<HEAD>

<TITLE>SQL Server Multiple Queries with Template Web Sample</TITLE>

<BODY>

<H1>Books For Sale</H1>
<HR>

<P>
<TABLE BORDER>
<TR> <TH><I>Title</I></TH> <TH><B>Price</B></TH> </TR>
<%begindetail%>
<TR> <TD><I> <%insert_data_here%> </I> </TD>
    <TD ALIGN=RIGHT><B> $<%insert_data_here%></B></TD> </TR>
<%enddetail%>
</TABLE>
<P>

<HR>

<%insert_data_here%>

<P>

<TABLE BORDER>
<TR> <TH ALIGN=CENTER>ID</TH> <TH ALIGN=LEFT><I>Publisher's Name</I></TH> </TR>
<%begindetail%>
<TR> <TD> <%insert_data_here%> </TD>
    <TD ALIGN=LEFT><I> <%insert_data_here%></I></TD> </TR>
<%enddetail%>
</TABLE>

<HR>

<%insert_data_here%>

<P>

<A HREF = "http://www.microsoft.com">Microsoft</A><P>
<A HREF = "http://msdn.microsoft.com">MSDN</A><P>

</BODY>

</HTML>

本示例的下面这部分显示使用 sp_makewebtask 执行查询。

USE pubs
GO
EXECUTE sp_makewebtask @outputfile = 'C:\WEB\MULTIPLE.HTM',
@query = 'SELECT title, price FROM titles SELECT au_lname, au_fname
FROM authors SELECT pub_id, pub_name FROM publishers SELECT au_lname,
au_fname FROM authors', @templatefile = 'C:\WEB\MULTIPLE.TPL',
@dbname = 'pubs', @rowcnt = 5, @whentype = 9
GO

下面是结果集：

<HTML>

<HEAD>

<TITLE>SQL Server Multiple Queries with Template Web Sample</TITLE>

<BODY>

<H1>Books For Sale</H1>
<HR>

<P>
<TABLE BORDER>
<TR> <TH><I>Title</I></TH> <TH><B>Price</B></TH> </TR>

<TR> <TD><I> The Busy Executive's Database Guide </I> </TD>
    <TD ALIGN=RIGHT><B> $19.9900</B></TD> </TR>

<TR> <TD><I> Cooking with Computers: Surreptitious Balance Sheets </I> </TD>
    <TD ALIGN=RIGHT><B> $11.9500</B></TD> </TR>

<TR> <TD><I> You Can Combat Computer Stress! </I> </TD>
    <TD ALIGN=RIGHT><B> $2.9900</B></TD> </TR>

<TR> <TD><I> Straight Talk About Computers </I> </TD>
    <TD ALIGN=RIGHT><B> $19.9900</B></TD> </TR>

<TR> <TD><I> Silicon Valley Gastronomic Treats </I> </TD>
    <TD ALIGN=RIGHT><B> $19.9900</B></TD> </TR>

</TABLE>
<P>

<HR>

<P>
<P><TABLE BORDER=1>
<TR><TH ALIGN=LEFT>au_lname</TH><TH ALIGN=LEFT>au_fname</TH></TR>
<TR><TD><TT>Bennet</TT></TD><TD><TT>Abraham</TT></TD></TR>
<TR><TD><TT>Blotchet-Halls</TT></TD><TD><TT>Reginald</TT></TD></TR>
<TR><TD><TT>Carson</TT></TD><TD><TT>Cheryl</TT></TD></TR>
<TR><TD><TT>DeFrance</TT></TD><TD><TT>Michel</TT></TD></TR>
<TR><TD><TT>del Castillo</TT></TD><TD><TT>Innes</TT></TD></TR>
</TABLE>
<HR>

<P>

<TABLE BORDER>
<TR> <TH ALIGN=CENTER>ID</TH> <TH ALIGN=LEFT><I>Publisher's Name</I></TH> </TR>

<TR> <TD> 0736 </TD>
    <TD ALIGN=LEFT><I> New Moon Books</I></TD> </TR>

<TR> <TD> 0877 </TD>
    <TD ALIGN=LEFT><I> Binnet & Hardley</I></TD> </TR>

<TR> <TD> 1389 </TD>
    <TD ALIGN=LEFT><I> Algodata Infosystems</I></TD> </TR>

<TR> <TD> 1622 </TD>
    <TD ALIGN=LEFT><I> Five Lakes Publishing</I></TD> </TR>

<TR> <TD> 1756 </TD>
    <TD ALIGN=LEFT><I> Ramona Publishers</I></TD> </TR>

</TABLE>

<HR>

<P>
<P><TABLE BORDER=1>
<TR><TH ALIGN=LEFT>au_lname</TH><TH ALIGN=LEFT>au_fname</TH></TR>
<TR><TD><TT>Bennet</TT></TD><TD><TT>Abraham</TT></TD></TR>
<TR><TD><TT>Blotchet-Halls</TT></TD><TD><TT>Reginald</TT></TD></TR>
<TR><TD><TT>Carson</TT></TD><TD><TT>Cheryl</TT></TD></TR>
<TR><TD><TT>DeFrance</TT></TD><TD><TT>Michel</TT></TD></TR>
<TR><TD><TT>del Castillo</TT></TD><TD><TT>Innes</TT></TD></TR>
</TABLE>
<HR>

<P>

<A HREF = "http://www.microsoft.com">Microsoft</A><P>
<A HREF = "http://msdn.microsoft.com">MSDN</A><P>

</BODY>

</HTML>
B. 创建超级链接

下面的示例创建一个称作 my_favorite_sites 的两列表。第一列 url_def 指定 Web 位置的 URL，第二列 display_text 是对应 URL 的超级链接文本。创建表并填入值后，便创建 HTML 文档。

USE pubs
GO
CREATE TABLE my_favorite_web_sites(url_def varchar(255), display_text varchar(255) NULL)
GO
INSERT my_favorite_web_sites(url_def, display_text)
VALUES ('http://www.microsoft.com', 'Microsoft Home Page')
INSERT my_favorite_web_sites(url_def) VALUES ('http://www.widgets.microsoft.com')
GO
EXECUTE sp_makewebtask @outputfile = 'C:\WEB\URL.HTM',
@query='SELECT title, price FROM titles ORDER BY price desc',
@table_urls = 1, @tabborder = 0, @lastupdated=0, @colheaders = 0,
@url_query= 'SELECT url_def, display_text FROM
my_favorite_web_sites', @whentype = 9
GO

下面是结果集：

<HTML>

<HEAD>

<TITLE>Microsoft SQL Server Web Assistant</TITLE>

</HEAD>

<BODY>

<H1>Query Results</H1>
<HR>

<P>
<P><TABLE BORDER=0>
<TR><TD><TT>But Is It User Friendly?</TT></TD><TD><TT>22.9500</TT></TD></TR>
<TR><TD><TT>Computer Phobic AND Non-Phobic Individuals: Behavior Variations</TT></TD><TD><TT>21.5900</TT></TD></TR>
<TR><TD><TT>Onions, Leeks, and Garlic: Cooking Secrets of the Mediterranean</TT></TD><TD><TT>20.9500</TT></TD></TR>
<TR><TD><TT>Secrets of Silicon Valley</TT></TD><TD><TT>20.0000</TT></TD></TR>
<TR><TD><TT>The Busy Executive's Database Guide</TT></TD><TD><TT>19.9900</TT></TD></TR>
<TR><TD><TT>Straight Talk About Computers</TT></TD><TD><TT>19.9900</TT></TD></TR>
<TR><TD><TT>Silicon Valley Gastronomic Treats</TT></TD><TD><TT>19.9900</TT></TD></TR>
<TR><TD><TT>Prolonged Data Deprivation: Four Case Studies</TT></TD><TD><TT>19.9900</TT></TD></TR>
<TR><TD><TT>Sushi, Anyone?</TT></TD><TD><TT>14.9900</TT></TD></TR>
<TR><TD><TT>Cooking with Computers: Surreptitious Balance Sheets</TT></TD><TD><TT>11.9500</TT></TD></TR>
<TR><TD><TT>Fifty Years in Buckingham Palace Kitchens</TT></TD><TD><TT>11.9500</TT></TD></TR>
<TR><TD><TT>Is Anger the Enemy?</TT></TD><TD><TT>10.9500</TT></TD></TR>
<TR><TD><TT>Emotional Security: A New Algorithm</TT></TD><TD><TT>7.9900</TT></TD></TR>
<TR><TD><TT>Life Without Fear</TT></TD><TD><TT>7.0000</TT></TD></TR>
<TR><TD><TT>You Can Combat Computer Stress!</TT></TD><TD><TT>2.9900</TT></TD></TR>
<TR><TD><TT>The Gourmet Microwave</TT></TD><TD><TT>2.9900</TT></TD></TR>
<TR><TD><TT>The Psychology of Computer Cooking</TT></TD><TD>n/a</TD></TR>
<TR><TD><TT>Net Etiquette</TT></TD><TD>n/a</TD></TR>
</TABLE>
<HR>
<A HREF = "http://www.microsoft.com">Microsoft Home Page</A><P>
<A HREF = "http://www.widgets.microsoft.com">http://www.widgets.microsoft.com</A><P>

</BODY>

</HTML>
C. 以单行模式执行多个查询

下面的示例通过多个查询创建 8 个 HTML 文档，并使用单行模式。

以下是查询语句：

USE pubs
GO
EXECUTE sp_makewebtask @outputfile = 'C:\WEB\SROW.HTM',
@query = 'SELECT title, price FROM titles ORDER BY price desc
SELECT au_lname, au_fname FROM authors WHERE state = ''CA'' ',
@fixedfont = 0, @webpagetitle = 'Single row SQL Web Assistant',
@resultstitle = 'One row per page results', @singlerow = 1,
@rowcnt = 4,@URL = "http://www.microsoft.com",
@reftext = 'Microsoft Home Page'
GO

以下是结果集的第一个文件（名为 C:\Web\Srow1.htm）：

<HTML>

<HEAD>

<TITLE>Single row SQL Web Assistant</TITLE>

</HEAD>

<BODY>

<H1>One row per page results</H1>
<HR>

<PRE>Last updated: Jun 17 1997  9:14AM</PRE>

<P>
<P><TABLE BORDER=1>
<TR><TH ALIGN=LEFT>title</TH><TH ALIGN=LEFT>price</TH></TR>
<TR><TD>But Is It User Friendly?</TD><TD>22.9500</TD></TR>
</TABLE>
<HR>
<A HREF = "http://www.microsoft.com">Microsoft Home Page</A><P>
<TABLE BORDER=0 CELLPADDING=6>
<TR><TD>More results can be found in:</TD>
<TD><A HREF = "SROW2.HTM">Next</A></TD>
</TR></TABLE>

</BODY>

</HTML>

以下是结果集的第二个文件（名为 C:\Web\Srow2.htm）：

<HTML>

<HEAD>

<TITLE>Single row SQL Web Assistant</TITLE>

</HEAD>

<BODY>

<H1>One row per page results</H1>
<HR>

<PRE>Last updated: Jun 17 1997  9:14AM</PRE>

<P>
<P><TABLE BORDER=1>
<TR><TH ALIGN=LEFT>title</TH><TH ALIGN=LEFT>price</TH></TR>
<TR><TD>Computer Phobic AND Non-Phobic Individuals: Behavior Variations</TD><TD>21.5900</TD></TR>
</TABLE>
<HR>
<A HREF = "http://www.microsoft.com">Microsoft Home Page</A><P>
<TABLE BORDER=0 CELLPADDING=6>
<TR><TD>More results can be found in:</TD>
<TD><A HREF = "SROW1.HTM">First</A></TD>
<TD><A HREF = "SROW1.HTM">Previous</A></TD>
<TD><A HREF = "SROW3.HTM">Next</A></TD>
</TR></TABLE>

</BODY>

</HTML>
D.使用数据插入标记和模板执行多个查询

下面的示例通过模板用多个查询语句创建两个 HTML 文档，所使用的模板将每本书的书名和价格放在单独的 HTML 文档中。

以下是名为 C:\Web\Datains.tpl 的模板文档：

<HTML>

<HEAD>

<TITLE>SQL Server Multiple Queries, Data Insert Markers, & Template Web Sample</TITLE>

<BODY>

<H1>Books For Sale</H1>
<HR>

<P>
<TABLE BORDER>
<TR> <TH><I>Title</I></TH> <TH><B>Price</B></TH> </TR>
<%begindetail%>
<TR> <TD><I> <%insert_data_here%> </I> </TD>
    <TD ALIGN=RIGHT><B> $<%insert_data_here%></B></TD> </TR>
<%enddetail%>
</TABLE>
<P>

<HR>

<A HREF = "http://www.microsoft.com">Microsoft</A><P>
<A HREF = "http://msdn.microsoft.com">MSDN</A><P>

</BODY>

</HTML>

以下是查询语句：

USE pubs
GO
EXECUTE sp_makewebtask @outputfile = 'C:\WEB\DATAINS.HTM',
@query = 'SELECT title, price FROM titles',
@templatefile = 'C:\WEB\DATAINS.TPL', @dbname = 'pubs',
@rowcnt = 2, @whentype = 9, @singlerow = 1
GO

以下是结果集的第一个文件（名为 C:\Web\Datains1.htm）：

<HTML>

<HEAD>

<TITLE>SQL Server Multiple Queries, Data Insert Markers, & Template Web Sample</TITLE>

<BODY>

<H1>Books For Sale</H1>
<HR>

<P>
<TABLE BORDER>
<TR> <TH><I>Title</I></TH> <TH><B>Price</B></TH> </TR>

<TR> <TD><I> The Busy Executive's Database Guide </I> </TD>
    <TD ALIGN=RIGHT><B> $19.9900</B></TD> </TR>

</TABLE>
<P>

<HR>

<A HREF = "http://www.microsoft.com">Microsoft</A><P>
<A HREF = "http://msdn.microsoft.com">MSDN</A><P>

<TABLE BORDER=0 CELLPADDING=6>
<TR><TD>More results can be found in:</TD>
<TD><A HREF = "DATAINS2.HTM">Next</A></TD>
</TR></TABLE></BODY>

</HTML>

以下是结果集的第二个文件（名为 C:\Web\Datains2.htm）：

<HTML>

<HEAD>

<TITLE>SQL Server Multiple Queries, Data Insert Markers, & Template Web Sample</TITLE>

<BODY>

<H1>Books For Sale</H1>
<HR>

<P>
<TABLE BORDER>
<TR> <TH><I>Title</I></TH> <TH><B>Price</B></TH> </TR>

<TR> <TD><I> Cooking with Computers: Surreptitious Balance Sheets </I> </TD>
    <TD ALIGN=RIGHT><B> $11.9500</B></TD> </TR>

</TABLE>
<P>

<HR>

<A HREF = "http://www.microsoft.com">Microsoft</A><P>
<A HREF = "http://msdn.microsoft.com">MSDN</A><P>

<TABLE BORDER=0 CELLPADDING=6>
<TR><TD>More results can be found in:</TD>
<TD><A HREF = "DATAINS1.HTM">First</A></TD>
<TD><A HREF = "DATAINS1.HTM">Previous</A></TD>
</TR></TABLE></BODY>

</HTML>
E. 使用 @blobfmt 执行查询

下面的示例执行查询，并将信息放在 HTML 文档中。publishers 表与 pub_info 表链接，在 HTM 文档中提供公司徽标。

以下是名为 C:\Web\Blobsmp.tpl 的模板文件：

<HTML>

<HEAD>

<TITLE>Publishers PR Info</TITLE>

</HEAD>

<BODY>

<HR>

<PRE>

<%insert_data_here%>

</PRE>

</BODY>

</HTML>

以下是查询语句：

USE pubs
GO
EXECUTE sp_makewebtask @outputfile = 'C:\WEB\BLOBSMP.HTM',
@query = 'SELECT pr_info, pub_name, city, state, country, logo,
pub_info.pub_id FROM pub_info, publishers
WHERE pub_info.pub_id = publishers.pub_id',
@webpagetitle = 'Publishers Home Page',
@resultstitle = 'Premier Publishers and Their Home Page Links',
@whentype = 9, @blobfmt='%1% FILE=C:\WEB\BLOBSMP.HTM
TPLT=C:\WEB\BLOBSMP.TPL %6% FILE=C:\WEB\PUBLOGO.GIF', @rowcnt = 2
GO

以下是主 HTML 文档 Blobsmp.htm，其中包含徽标位图和出版商主页的超级链接：

<HTML>

<HEAD>

<TITLE>Publishers Home Page</TITLE>

<BODY>

<H1>Premier Publishers and Their Home Page Links</H1>
<HR>

<PRE><TT>Last updated: Jun 28 1996  3:15PM</TT></PRE>

<P>
<P><TABLE BORDER=1>
<TR><TH ALIGN=LEFT>pr_info</TH><TH ALIGN=LEFT>city</TH><TH ALIGN=LEFT>state</TH><TH ALIGN=LEFT>country</TH><TH ALIGN=LEFT>logo</TH></TR>
<TR><TD NOWRAP><A HREF = "file:///c:\web\blobfmt1.htm">New Moon Books</A></TD><TD NOWRAP><TT>Boston</TT></TD><TD NOWRAP><TT>MA</TT></TD><TD NOWRAP><TT>USA</TT></TD><TD NOWRAP><A HREF = "file:///c:\web\publogo1.gif">0736</A></TD></TR>
<TR><TD NOWRAP><A HREF = "file:///c:\web\blobfmt2.htm">Binnet & Hardley</A></TD><TD NOWRAP><TT>Washington</TT></TD><TD NOWRAP><TT>DC</TT></TD><TD NOWRAP><TT>USA</TT></TD><TD NOWRAP><A HREF = "file:///c:\web\publogo2.gif">0877</A></TD></TR>
</TABLE>
<HR>

</BODY>

</HTML>

以下是结果集中第一个文件（名为 C:\Web\Blobsmp1.htm）的开头几行：

说明 此处并未显示所有输出行。完整的输出显示在 C:\Web\Blobsmp1.htm 中。

<HTML>

<HEAD>

<TITLE>Publishers PR Info</TITLE>

</HEAD>

<BODY>

<HR>

<PRE>

This is sample text data for New Moon Books, publisher 0736 in the pubs database. New Moon Books is located in Boston, Massachusetts.

...

This is sample text data for New Moon Books, publisher 0736 in the pubs database. New Moon Books is located in Boston, Massachusetts.

</PRE>

</BODY>

</HTML>

以下是结果集的第二个文件（名为 C:\Web\Blobsmp2.htm）：

<HTML>

<HEAD>

<TITLE>Publishers PR Info</TITLE>

</HEAD>

<BODY>

<HR>

<PRE>

This is sample text data for Binnet & Hardley, publisher 0877 in the pubs database. Binnet & Hardley is located in Washington, D.C.

...

This is sample text data for Binnet & Hardley, publisher 0877 in the pubs database. Binnet & Hardley is located in Washington, D.C.

</PRE>

</BODY>

</HTML>

请参见

sp_enumcodepages

sp_runwebtask

系统存储过程


sp_manage_jobs_by_login

删除或重新指派属于指定的登录的作业。

语法

sp_manage_jobs_by_login [@action =] 'action'
[, [@current_owner_login_name =] 'current_owner_login_name']
[, [@new_owner_login_name =] 'new_owner_login_name']

参数

[@action = ] 'action'

要对指定登录进行的操作。action 的数据类型为 varchar(10)，没有默认值。action 为 DELETE 时，sp_manage_jobs_by_login 删除所有 current_owner_login_name 拥有的作业。action 为 REASSIGN 时，所有作业均指派给 new_owner_login_name。

[@current_owner_login_name =] 'current_owner_login_name'

当前作业所有者的登录名。current_owner_login_name 的数据类型为 sysname，没有默认值。

[@new_owner_login_name =] 'new_owner_login_name'

新作业所有者的登录名。只有当 action 为 REASSIGN 时才能使用此参数。new_owner_login_name 的数据类型为 sysname，默认值为 NULL。

返回代码值

0（成功）或 1（失败）

结果集

无

权限

只有 sysadmin 固定服务器角色的成员才能执行 sp_manage_jobs_by_login。

示例

下面的示例将所有作业从 janetl 重新指派给 stevenb。

USE msdb
EXEC sp_manage_jobs_by_login 'REASSIGN', 'janetl', 'stevenb'

请参见

sp_delete_job

系统存储过程


sp_monitor

显示关于 Microsoft® SQL Server™ 的统计。

语法

sp_monitor

返回代码值

0（成功）或 1（失败）

结果集
列名 | 描述
last_run | 上次运行 sp_monitor 的时间。
current_run | 本次运行 sp_monitor 的时间。
seconds | sp_monitor 自运行以来所经过的时间（按秒计）。
cpu_busy | 服务器计算机的 CPU 处理 SQL Server 工作所用的时间（按秒计）。
io_busy | SQL Server 在输入和输出操作上花费的时间（按秒计）。
idle | SQL Server 已空闲的时间（按秒计）。
packets_received | SQL Server 读取的输入数据包数。
packets_sent | SQL Server 写入的输出数据包数。
packet_errors | SQL Server 在读取和写入数据包时遇到的错误数。
total_read | SQL Server 读取的次数。
total_write | SQL Server 写入的次数。
total_errors | SQL Server 在读取和写入时遇到的错误数。
connections | 登录或尝试登录 SQL Server 的次数。

注释

SQL Server 通过一系列函数跟踪其完成的工作量。执行 sp_monitor 会显示这些函数返回的当前值，并显示自上次运行该过程以来有多大改变。

对于每一列，统计将以 number(number)-number% 或 number(number) 的格式输出。第一个数字是指重新启动 SQL Server 以来的秒数（对于 cpu_busy、io_busy 和 idle）或总数目（对于其它变量）。圆括号中的数字是指上次运行 sp_monitor 以来的秒数或总数目。百分比是自上次运行 sp_monitor 以来的时间百分比。例如，如果报告中 cpu_busy 显示为 4250(215)-68%，则自 SQL Server 上次启动以来，CPU 工作了 4250 秒；自上次运行 sp_monitor 以来，CPU 工作了 215 秒；自上次运行 sp_monitor 以来占总时间的 68%。

权限

执行权限默认赋予 sysadmin 固定服务器角色的成员。

示例

下面的示例报告有关 SQL Server 繁忙程度的信息。

USE master
EXEC sp_monitor

下面是结果集：

last_run | current_run | Seconds
------------------ | -------------------- | -------------
Mar 29 1998 11:55AM | Apr 4 1993 2:22 PM | 561

cpu_busy | io_busy | idle
----------------- | --------------- | -------------
190(0)-0% | 187(0)-0% | 148(556)-99%

packets_received | packets_sent | packet_errors
----------------- | ----------------- | -------------
16(1) | 20(2) | 0(0)

total_read | total_write | total_errors | connections
----------------- | ----------------- | ------------- | ------------
141(0) | 54920(127) | 0(0) | 4(0)

请参见

sp_who

系统存储过程

使用变量和参数


sp_MShasdbaccess

列出所有用户可以访问的数据库的名称和所有者。

语法

sp_MShasdbaccess

返回代码值

0（成功）或 1（失败）

权限

执行权限默认赋予 public 角色。


sp_msx_defect

从多服务器操作中删除当前服务器。

注意 sp_msx_defect 编辑注册表。建议不要人工编辑注册表，因为不适当或不正确的更改会导致严重的系统配置问题。因此，只有有经验的用户才可以使用注册表编辑器程序编辑注册表。有关更多信息，请参见 Microsoft® Windows NT® 或 Microsoft Windows® 95 文档。

语法

sp_msx_defect [@forced_defection =] forced_defection

参数

[@forced_defection =] forced_defection

指定如果因 msdb 数据库发生不可恢复损坏或没有 msdb 数据库备份而导致 Master SQLServerAgent 永久丢失，是否进行强制脱离。forced_defection 的数据类型为 bit，默认值为 0，表示不进行任何强制脱离。值为 1 代表强制进行脱离。

通过执行 sp_msx_defect 强制进行脱离后，Master SQLServerAgent 上的 sysadmin 固定服务器角色成员必须运行下面的命令才能完成此脱离：

EXECUTE msdb.dbo.sp_delete_targetserver @server_name = 'tsx-server', @post_defection =  0
返回代码值

0（成功）或 1（失败）

结果集

无

注释

sp_msx_defect 正常完成后，将返回一条消息：

Server defected from MSX ''. n Job(s) deleted.
权限

只有 sysadmin 固定服务器角色的成员才可以执行 sp_msx_defect。

请参见

sp_msx_enlist

系统存储过程


sp_msx_enlist

将当前服务器添加到可用于多服务器操作的目标服务器列表。只有在 Windows NT® 上运行的 Microsoft® SQL Server™ 7.0 版数据库服务器才可以登记。

注意 sp_msx_enlist 编辑注册表。建议不要人工编辑注册表，因为不适当或不正确的更改会导致严重的系统配置问题。因此，只有有经验的用户才可以使用注册表编辑器程序编辑注册表。有关更多信息，请参见 Microsoft® Windows NT® 或 Microsoft Windows® 95 文档。

语法

sp_msx_enlist [@msx_server_name =] 'msx_server'
[, [@location =] 'location']

参数

[@msx_server_name =] 'msx_server'

要添加的多服务器管理服务器（主服务器）的名称。msx_server 的数据类型为 nvarchar(30)，没有默认值。

[@location =] 'location'

要登记的目标服务器的位置。location 的数据类型为 nvarchar(100)，默认值为 NULL。

返回代码值

0（成功）或 1（失败）

结果集

无

权限

只有 sysadmin 固定服务器角色的成员才可以执行 sp_msx_enlist。

示例

下面的示例将当前服务器登记到 LONDON2 主服务器中。

USE msdb
EXEC sp_msx_enlist 'LONDON2',
   'Paris Subsidiary, Bldg 21, Room 309, Rack 5'

请参见

sp_msx_defect

系统存储过程

xp_cmdshell


sp_OACreate

在 Microsoft® SQL Server™ 实例上创建 OLE 对象实例。

语法

sp_OACreate progid, | clsid,
objecttoken OUTPUT
[ , context ]

参数

progid

是要创建的 OLE 对象的程序标识符 (ProgID)。此字符串描述该 OLE 对象的类，其形式如下：

'OLEComponent.Object'

OLEComponent 是 OLE 自动化服务器的组件名称，Object 是 OLE 对象名。指定的 OLE 对象必须有效并且必须支持 IDispatch 接口。

例如，SQLDMO.SQLServer 是 SQL-DMO SQLServer 对象的 ProgID。SQL-DMO 的组件名称为 SQLDMO，SQLServer 对象是有效的，并且同所有 SQL-DMO 对象一样，SQLServer 对象支持 Idispatch。

clsid

是要创建的 OLE 对象的类标识符 (CLSID)。此字符串描述该 OLE 对象的类，其形式如下：

'{nnnnnnnn-nnnn-nnnn-nnnn-nnnnnnnnnnnn}'

指定的 OLE 对象必须有效并且必须支持 IDispatch 接口。

例如，{00026BA1-0000-0000-C000-000000000046} 是 SQL-DMO SQLServer 对象的 CLSID。

objecttoken OUTPUT

是返回的对象令牌，并且必须是数据类型为 int 的局部变量。该对象令牌用于标识所创建的 OLE 对象，并将在调用其它 OLE 自动化存储过程时使用。

context

指定新创建的 OLE 对象要在其中运行的执行上下文。如果指定，那么此值必须为下列值之一：

1 = 仅为进程内 (.dll) OLE 服务器
4 = 仅为本地 (.exe) OLE 服务器
5 = 进程内 OLE 服务器和本地 OLE 服务器均可

如果未指定，其默认值为 5。此值将在调用 CoCreateInstance 时作为 dwClsContext 参数传递。

若允许使用进程内 OLE 服务器（通过使用上下文值 1 或 5 或者不指定上下文值），该服务器将可以访问 SQL Server 拥有的内存和其它资源。进程内 OLE 服务器可能会破坏 SQL Server 的内存或资源并导致不可预知的结果，如 SQL Server 访问违规。

当上下文值指定为 4 时，本地 OLE 服务器不能访问任何 SQL Server 资源，因而不能破坏 SQL Server 的内存或资源。

说明 此存储过程的参数按位置指定，而不是按名称指定。

返回代码值

0（成功）或非零数字（失败），是由 OLE 自动化对象返回的 HRESULT 的整数值。

有关 HRESULT 返回代码的更多信息，请参见 OLE 自动化返回代码和错误信息。

注释

已创建的 OLE 对象在 Transact-SQL 语句批处理结束时会自动释放。

权限

只有 sysadmin 固定服务器角色的成员才能执行 sp_OACreate。

示例
A. 使用 Prog ID

下面的示例通过使用 SQL-DMO SQLServer 对象的 ProgID 创建该对象。

DECLARE @object int
DECLARE @hr int
DECLARE @src varchar(255), @desc varchar(255)
EXEC @hr = sp_OACreate 'SQLDMO.SQLServer', @object OUT
IF @hr <> 0
BEGIN
   EXEC sp_OAGetErrorInfo @object, @src OUT, @desc OUT
   SELECT hr=convert(varbinary(4),@hr), Source=@src, Description=@desc
    RETURN
END
B. 使用 CLSID

下面的示例通过使用 SQL-DMO SQLServer 对象的 CLSID 创建该对象。

DECLARE @object int
DECLARE @hr int
DECLARE @src varchar(255), @desc varchar(255)
EXEC @hr = sp_OACreate '{00026BA1-0000-0000-C000-000000000046}',
    @object OUT
IF @hr <> 0
BEGIN
   EXEC sp_OAGetErrorInfo @object, @src OUT, @desc OUT
   SELECT hr=convert(varbinary(4),@hr), Source=@src, Description=@desc
    RETURN
END

请参见

使用 OLE 自动化存储过程进行数据类型转换

如何创建 OLE 自动化对象 (Transact-SQL)

如何调试自定义 OLE 自动化服务器 (Transact-SQL)

OLE 自动化脚本示例


sp_OADestroy

释放已创建的 OLE 对象。

语法

sp_OADestroy objecttoken

参数

objecttoken

是先前用 sp_OACreate 创建的 OLE 对象令牌。

返回代码值

0（成功）或非零数字（失败），是由 OLE 自动化对象返回的 HRESULT 的整数值。

有关 HRESULT 返回代码的更多信息，请参见 OLE 自动化返回代码和错误信息。

注释

若未调用 sp_OADestroy，已创建的 OLE 对象在批处理结束时会自动释放。

权限

只有 sysadmin 固定服务器角色的成员才能执行 sp_OADestroy。

示例

下面的示例释放先前创建的 SQLServer 对象。

EXEC @hr = sp_OADestroy @object
IF @hr <> 0
BEGIN
   EXEC sp_OAGetErrorInfo @object
    RETURN
END

请参见

使用 OLE 自动化存储过程进行数据类型转换

如何创建 OLE 自动化对象 (Transact-SQL)

如何调试自定义 OLE 自动化服务器 (Transact-SQL)

OLE 自动化脚本示例


sp_OAGetErrorInfo

获取 OLE 自动化错误信息。

语法

sp_OAGetErrorInfo [objecttoken ]
[, source OUTPUT]
[, description OUTPUT]
[, helpfile OUTPUT]
[, helpid OUTPUT ]

参数

objecttoken

是先前用 sp_OACreate 创建的 OLE 对象的对象令牌，或 NULL。若指定了 objecttoken，则返回该对象的错误信息。若指定为 NULL，则返回整个批处理的错误信息。

source OUTPUT

是错误信息的来源。如果指定，那么它必须是局部 char、nchar、varchar 或 nvarchar 变量。必要时会截断返回值以适合局部变量的要求。

description OUTPUT

是错误的描述。如果指定，那么它必须是局部 char、nchar、varchar 或 nvarchar 变量。必要时会截断返回值以适合局部变量的要求。

helpfile OUTPUT

是 OLE 对象的帮助文件。如果指定，那么它必须是局部 char、nchar、varchar 或 nvarchar 变量。必要时会截断返回值以适合局部变量的要求。

helpid OUTPUT

是帮助文件的上下文 ID。如果指定，那么它必须是局部 int 变量。

说明 此存储过程的参数按位置指定，而不是按名称。

返回代码值

0（成功）或非零数字（失败），是由 OLE 自动化对象返回的 HRESULT 的整数值。

有关 HRESULT 返回代码的更多信息，请参见 OLE 自动化返回代码和错误信息。

结果集

若未指定输出参数，错误信息将作为结果集返回给客户端。

列名 | 数据类型 | 描述
Error | binary(4) | 错误号的二进制表示。
Source | nvarchar(nn) | 错误的来源。
Description | nvarchar(nn) | 错误的描述。
Helpfile | nvarchar(nn) | 错误来源的帮助文件。
HelpID | Int | 错误来源帮助文件中的帮助上下文 ID。

注释

对每个 OLE 自动化存储过程（sp_OAGetErrorInfo 除外）的调用均会重新设置错误信息；因此，sp_OAGetErrorInfo 只能获取最近一次 OLE 自动化存储过程调用的错误信息。要注意，由于 sp_OAGetErrorInfo 不重新设置错误信息，因此可多次调用该过程以获取相同的错误信息。

下表中列出了 OLE 自动化错误及它们的一般原因。

错误及 HRESULT | 一般原因
变量类型错误 (0x80020008) | 作为方法参数传递的 Transact-SQL 值的数据类型与该方法参数的 Microsoft® Visual Basic® 数据类型不匹配，或者将 NULL 值作为方法参数进行了传递。
未知名称 (0x8002006) | 指定对象的指定属性名或方法名未找到。
类字符串无效 (0x800401f3) | 在 Microsoft SQL Server™ 实例上，指定的 ProgID 或 CLSID 没有注册为 OLE 对象。自定义 OLE 自动化服务器需要在可使用 sp_OACreate 将其实例化之前进行注册。这可通过进程中的 (.dll) 服务器的 regsvr32.exe 实用工具或本地 (.exe) 服务器的 /REGSERVER 命令行开关来实现。
服务器执行失败 (0x80080005) | 指定的 OLE 对象注册为本地 OLE 服务器（.exe 文件），但是该 .exe 文件找不到或不能启动。
未能找到指定的模块 (0x8007007e) | 指定的 OLE 对象被注册为进程内 OLE 服务器（.dll 文件），但是该 .dll 文件找不到或不能被装载。
类型不匹配 (0x80020005) | 用于存储返回的属性值或者方法返回值的 Transact-SQL 局部变量的数据类型与属性或方法返回值的 Visual Basic 数据类型不匹配。或者，要求属性或方法返回值，但该属性或方法未返回值。
sp_OACreate 的"context"参数的数据类型或值无效。(0x8004275B) | context 参数的值应为 1、4 或 5 中的一个。

有关处理 HRESULT 返回代码的更多信息，请参见 OLE 自动化返回代码和错误信息。

权限

只有 sysadmin 固定服务器角色的成员才能执行 sp_OAGetErrorInfo。

示例

下面的示例显示 OLE 自动化错误信息。

DECLARE @output varchar(255)
DECLARE @hr int
DECLARE @source varchar(255)
DECLARE @description varchar(255)
PRINT 'OLE Automation Error Information'
EXEC @hr = sp_OAGetErrorInfo @object, @source OUT, @description OUT
IF @hr = 0
BEGIN
    SELECT @output = '  Source: ' + @source
    PRINT @output
    SELECT @output = '  Description: ' + @description
    PRINT @output
END
ELSE
BEGIN
    PRINT '  sp_OAGetErrorInfo failed.'
    RETURN
END

请参见

使用 OLE 自动化存储过程进行数据类型转换

如何创建 OLE 自动化对象 (Transact-SQL)

如何调试自定义 OLE 自动化服务器 (Transact-SQL)

OLE 自动化脚本示例


sp_OAGetProperty

获取 OLE 对象的属性值。

语法

sp_OAGetProperty objecttoken,
propertyname
[, propertyvalue OUTPUT]
[, index...]

参数

objecttoken

是先前用 sp_OACreate 创建的 OLE 对象令牌。

propertyname

是要返回的 OLE 对象的属性名。

propertyvalue OUTPUT

是返回的属性值。如果指定，那么它必须是适当数据类型的局部变量。

如果属性返回 OLE 对象，那么 propertyvalue 必须是数据类型为 int 的局部变量。对象令牌将保存在该局部变量中，并且可由其它 OLE 自动化存储过程使用。

如果属性返回单个值，那么或者为 propertyvalue 指定一个局部变量，以在该局部变量中返回属性值，或者不指定 propertyvalue，以单列、单行结果集的形式将属性值返回给客户端。

当属性返回数组时，如果指定了 propertyvalue，那么该值将被设置为 NULL。

如果指定了 propertyvalue，但属性不返回值，那么将出现错误。如果属性返回二维以上的数组，也将出现错误。

索引

是索引参数。如果指定，那么它必须是适当数据类型的值。

一些属性带有参数。这些属性称为索引化属性，其参数被称为索引参数。一个属性可有多个索引参数。

说明 此存储过程的参数按位置指定，而不是按名称。

返回代码值

0（成功）或非零数字（失败），是由 OLE 自动化对象返回的 HRESULT 的整数值。

有关 HRESULT 返回代码的更多信息，请参见 OLE 自动化返回代码和错误信息。

结果集

如果属性返回一维或二维数组，那么该数组将作为结果集返回给客户端：

  • 一维数组作为单行结果集返回给客户端，其中的列数与数组中的元素数相等。换言之，该数组以列的形式返回。

  • 二维数组作为结果集返回给客户端，其中的列数与数组第一维中的元素数相同，行数与数组第二维中的元素数相同。换言之，该数组以（列、行）的形式返回。

当属性返回值或方法返回值是数组时，sp_OAGetProperty 或 sp_OAMethod 将向客户端返回结果集。（方法输出参数不能是数组。）这些过程扫描数组中的所有数据值，以便为该结果集的每一列确定正确的 Microsoft® SQL Server™ 数据类型和数据长度。对于某个特定的列，这些过程将使用表示该列中的所有数据值所需要的数据类型和长度。

当一列中的所有数据值都具有相同的数据类型时，此数据类型将用于整个列。当一列中的数据值使用不同的数据类型时，将按下面的图表选择整个列的数据类型。

 | int | float | money | datetime | varchar | nvarchar
int | int | float | money | varchar | varchar | nvarchar
float | float | float | money | varchar | varchar | nvarchar
money | money | money | money | varchar | varchar | nvarchar
datetime | varchar | varchar | varchar | datetime | varchar | nvarchar
varchar | varchar | varchar | varchar | varchar | varchar | nvarchar
nvarchar | nvarchar | nvarchar | nvarchar | nvarchar | nvarchar | nvarchar

注释

也可用 sp_OAMethod 来获取属性值。

权限

只有 sysadmin 固定服务器角色的成员才能执行 sp_OAGetProperty。

示例
A. 使用局部变量

下面的示例获取 HostName 属性（属于先前创建的 SQLServer 对象）并将其存储在局部变量中。

DECLARE @property varchar(255)
EXEC @hr = sp_OAGetProperty @object, 'HostName', @property OUT
IF @hr <> 0
BEGIN
   EXEC sp_OAGetErrorInfo @object
    RETURN
END
PRINT @property
B. 使用结果集

下面的示例获取 HostName 属性（属于先前创建的 SQLServer 对象）并将其作为结果集返回给客户端。

EXEC @hr = sp_OAGetProperty @object, 'HostName'
IF @hr <> 0
BEGIN
   EXEC sp_OAGetErrorInfo @object
    RETURN
END

请参见

使用 OLE 自动化存储过程进行数据类型转换

如何创建 OLE 自动化对象 (Transact-SQL)

如何调试自定义 OLE 自动化服务器 (Transact-SQL)

OLE 自动化脚本示例


sp_OAMethod

调用 OLE 对象的方法。

语法

sp_OAMethod objecttoken,
methodname
[, returnvalue OUTPUT]
[ , [ @parametername = ] parameter [ OUTPUT ]
[...n]]

参数

objecttoken

是先前用 sp_OACreate 创建的 OLE 对象令牌。

methodname

是要调用的 OLE 对象的方法名。

returnvalue OUTPUT

是该 OLE 对象的方法的返回值。如果指定，那么它必须是适当数据类型的局部变量。

如果方法返回单个值，那么或者为 returnvalue 指定一个局部变量，以便在该局部变量中返回方法的返回值，或者不指定 returnvalue，以单列、单行结果集的形式将方法返回值返回给客户端。

如果方法返回值是 OLE 对象，那么 returnvalue 必须是数据类型为 int 的局部变量。对象令牌将保存在该局部变量中，并且可由其它 OLE 自动化存储过程使用。

当方法返回值是数组时，如果指定了 returnvalue，那么该值将被设置为 NULL。

在下列情况下会出现错误：

  • 指定了 returnvalue，但是方法并不返回值。

  • 方法返回二维以上的数组。

  • 方法以输出参数的形式返回数组。

[@parametername =] parameter [OUTPUT]

是方法参数。如果指定，那么 parameter 必须是适当数据类型的值。

若要获取输出参数的返回值，parameter 必须是适当数据类型的局部变量，并且必须指定 OUTPUT。如果指定的是常量参数，或未指定 OUTPUT，那么输出参数的任何返回值均被忽略。

如果指定，则 parametername 必须是 Microsoft® Visual Basic® 命名参数的名称。要注意 @parametername 不并是 Transact-SQL 局部变量。将去掉符号 (@)，并将 parametername 作为参数名传递给 OLE 对象。指定所有位置参数后才能指定命名参数。

n

是表示可以指定多个参数的占位符。

说明 @parametername 可以是命名参数，因为它是指定方法的一部分，并将直接传递给对象。此存储过程的其它参数是按位置指定的，而不是按名称。

返回代码值

0（成功）或非零数字（失败），是由 OLE 自动化对象返回的 HRESULT 的整数值。

有关 HRESULT 返回代码的更多信息，请参见 OLE 自动化返回代码和错误信息。

结果集

如果方法返回值是一维或二维数组，那么该数组将作为结果集返回给客户端：

  • 一维数组作为单行结果集返回给客户端，其中的列数与数组中的元素数相等。换言之，该数组以（列）的形式返回。

  • 二维数组作为结果集返回给客户端，其中的列数与数组第一维中的元素数相同，行数与数组第二维中的元素数相同。换言之，该数组以（列、行）的形式返回。

当属性返回值或方法返回值是数组时，sp_OAGetProperty 或 sp_OAMethod 将向客户端返回结果集。（方法输出参数不能是数组。）这些过程扫描数组中的所有数据值，以便为该结果集的每一列确定正确的 Microsoft SQL Server™ 数据类型和数据长度。对于某个特定的列，这些过程将使用表示该列中的所有数据值所需要的数据类型和长度。

当一列中的所有数据值都具有相同的数据类型时，此数据类型将用于整个列。当一列中的数据值使用不同的数据类型时，将按下面的图表选择整个列的数据类型。

 | int | float | Money | datetime | varchar | nvarchar
int | int | float | Money | varchar | varchar | nvarchar
float | float | float | Money | varchar | varchar | nvarchar
money | money | money | Money | varchar | varchar | nvarchar
datetime | varchar | varchar | Varchar | datetime | varchar | nvarchar
varchar | varchar | varchar | Varchar | varchar | varchar | nvarchar
nvarchar | nvarchar | nvarchar | Nvarchar | nvarchar | nvarchar | nvarchar

注释

也可用 sp_OAMethod 来获取属性值。

权限

只有 sysadmin 固定服务器角色的成员才能执行 sp_OAMethod。

示例
A. 调用方法

下面的示例调用先前创建的 SQLServer 对象的 Connect 方法。

EXEC @hr = sp_OAMethod @object, 'Connect', NULL, 'my_server',
    'my_login', 'my_password'
IF @hr <> 0
BEGIN
   EXEC sp_OAGetErrorInfo @object
    RETURN
END
B. 获取属性

下面的示例获取 HostName 属性（属于先前创建的 SQLServer 对象）并将其存储在局部变量中。

DECLARE @property varchar(255)
EXEC @hr = sp_OAMethod @object, 'HostName', @property OUT
IF @hr <> 0
BEGIN
   EXEC sp_OAGetErrorInfo @object
    RETURN
END
PRINT @property

请参见

使用 OLE 自动化存储过程进行数据类型转换

如何创建 OLE 自动化对象 (Transact-SQL)

如何调试自定义 OLE 自动化服务器 (Transact-SQL)

OLE 自动化脚本示例


sp_OASetProperty

将 OLE 对象的属性设置为新值。

语法

sp_OASetProperty objecttoken,
propertyname,
newvalue
[ , index... ]

参数

objecttoken

是先前用 sp_OACreate 创建的 OLE 对象令牌。

propertyname

是要设置新值的 OLE 对象的属性名。

newvalue

是属性的新值，并且必须是适当数据类型的值。

index

是索引参数。如果指定，那么它必须是适当数据类型的值。

一些属性带有参数。这些属性称为索引化属性，其参数被称为索引参数。一个属性可有多个索引参数。

说明 此存储过程的参数按位置指定，而不是按名称。

返回代码值

0（成功）或非零数字（失败），是由 OLE 自动化对象返回的 HRESULT 的整数值。

有关 HRESULT 返回代码的更多信息，请参见 OLE 自动化返回代码和错误信息。

权限

只有 sysadmin 固定服务器角色的成员才能执行 sp_OASetProperty。

示例

下面的示例将 HostName 属性（属于先前创建的 SQLServer 对象）设置为新值。

EXEC @hr = sp_OASetProperty @object, 'HostName', 'Gizmo'
IF @hr <> 0
BEGIN
   EXEC sp_OAGetErrorInfo @object
    RETURN
END

请参见

使用 OLE 自动化存储过程进行数据类型转换

如何创建 OLE 自动化服务器 (Transact-SQL)

如何调试自定义 OLE 自动化服务器 (Transact-SQL)

OLE 自动化脚本示例


sp_OAStop

停止服务器范围内的 OLE 自动化存储过程执行环境。

语法

sp_OAStop

返回代码值

0（成功）或非零数字（失败），是由 OLE 自动化对象返回的 HRESULT 的整数值。

有关 HRESULT 返回代码的更多信息，请参见 OLE 自动化返回代码和错误信息。

注释

Microsoft® SQL Server™ 启动后，当客户端第一次调用 sp_OACreate 时，将自动启动共享的 OLE 自动化存储过程执行环境。所有使用 OLE 自动化存储过程的客户端都共享一个单独的执行环境。

调用 sp_OAStop 不是必须的。如果未调用 sp_OAStop，当 SQL Server 关闭时，执行环境会自动停止。执行环境停止后，任何对 sp_OACreate 的调用均会重新启动执行环境。

说明 如果某一个客户端调用 sp_OAStop 停止了执行环境，那么任何正在执行使用 OLE 自动化存储过程的语句批处理的客户端在调用任何 OLE 自动化存储过程（sp_OACreate 除外）时均会收到一条错误信息。

权限

只有 sysadmin 固定服务器角色的成员才能执行 sp_OAStop。

示例

下面的示例停止共享的 OLE 自动化执行环境。

EXEC sp_OAStop

请参见

使用 OLE 自动化存储过程进行数据类型转换

如何创建 OLE 自动化对象 (Transact-SQL)

如何调试自定义 OLE 自动化服务器 (Transact-SQL)

OLE 自动化脚本示例


sp_password

添加或更改 Microsoft® SQL Server™ 登录的密码。

语法

sp_password [ [ @old = ] 'old_password' , ]
{ [ @new =] 'new_password' }
[ , [ @loginame = ] 'login' ]

参数

[@old =] 'old_password'

是旧密码。old_password 为 sysname 类型，其默认值为 NULL。

[@new =] 'new_password'

是新密码。new_password 为 sysname 类型，无默认值。如果没有使用命名参数，就必须指定 old_password。

[@loginame =] 'login'

是受密码更改影响的登录名。login 为 sysname 类型，其默认值为 NULL。login 必须已经存在，并且只能由 sysadmin 固定服务器角色的成员指定。

返回代码值

0（成功）或 1（失败）

注释

SQL Server 密码可包含 1 到 128 个字符，其中可包括任何字母、符号和数字。

新密码以加密的形式更新和存储，因此，任何用户（甚至系统管理员）都不能查看密码。

当 sysadmin 或 securityadmin 固定服务器角色的成员使用带全部三个参数的 sp_password 重新设置他们自己的密码时，审核记录反映的却是他们正在更改别人的密码。

sp_password 不能用于 Microsoft Windows NT® 安全帐户。通过 Windows NT 网络帐户连接到 SQL Server 的用户是由 Windows NT 授权的，因此其密码只能在 Windows NT 中更改。

sp_password 不能在用户定义的事务中执行。

权限

执行权限默认地授予 public 角色，以供用户更改自己的登录密码。只有 sysadmin 角色的成员可更改其他用户的登录密码。

示例
A.无原密码的情况下更改登录密码

下面的示例将登录 Victoria 的密码更改为 ok。

EXEC sp_password NULL, 'ok', 'Victoria'
B.更改密码

下面的示例将登录 Victoria 的密码由 ok 改为 coffee。

EXEC sp_password 'ok', 'coffee'

请参见

sp_addlogin

sp_adduser

sp_grantlogin

sp_revokelogin

系统存储过程


sp_pkeys

返回当前环境中单个表的主键信息。

语法

sp_pkeys [ @table_name = ] 'name'
[ , [ @table_owner = ] 'owner' ]
    [ , [ @table_qualifier = ] 'qualifier' ]

参数

[@table_name =] 'name'

是要返回其信息的表。name 为 sysname 类型，无默认值。不支持通配符模式匹配。

[@table_owner =] 'owner'

表示指定表的所有者。owner 为 sysname 类型，其默认值为 NULL。不支持通配符模式匹配。如果未指定 owner，则应用基础 DBMS 的默认表可视性规则。

在 Microsoft® SQL Server™ 中，如果当前用户拥有的表具有指定名称，则返回该表的列。如果未指定 owner，且当前用户未拥有指定 name 的表，则该过程查找由数据库所有者拥有的具有指定 name 的表。如果有，则返回该表的列。

[@table_qualifier =] 'qualifier'

是表限定符。qualifier 为 sysname 类型，其默认值为 NULL。多种 DBMS 产品支持表的三部分命名方式 (qualifier.owner.name)。在 SQL Server 中，该列表示数据库名。在某些产品中，该列表示表所在数据库环境的服务器名。

返回代码值

无

结果集
列名 | 数据类型 | 描述
TABLE_QUALIFIER | sysname | 表限定符的名称。该字段可以为 NULL。
TABLE_OWNER | sysname | 表所有者的名称。该字段始终返回值。
TABLE_NAME | sysname | 表的名称。在 SQL Server 中，此列表示在 sysobjects 表中的列出的表名。该字段始终返回值。
COLUMN_NAME | sysname | 是所返回的 TABLE_NAME 中每一列的列名。在 SQL Server 中，此列表示在 syscolumns 表中列出的列名。该字段始终返回值。
KEY_SEQ | smallint | 多列主键中列的序列号。
PK_NAME | sysname | 主键标识符。如果对数据源不适用，则返回 NULL。

注释

sp_pkeys 返回显式定义了 PRIMARY KEY 约束的列的信息。由于不是所有的系统均支持显式命名的主键，因此由网关实现者决定主键的构成。要注意主键这一术语指的是表的逻辑主键。应在被列为逻辑主键的每个键上定义一个唯一索引。此唯一索引也会由 sp_statistics 返回。

存储过程 sp_pkeys 与 ODBC 中的 SQLPrimaryKeys 等价。返回的结果按 TABLE_QUALIFIER、TABLE_OWNER、TABLE_NAME 和 KEY_SEQ 排序。

权限

执行权限默认授予 public 角色。


sp_post_msx_operation

向系统表 sysdownloadlist 中插入操作（行），以供目标服务器下载和执行。

语法

sp_post_msx_operation [ @operation = ] 'operation'
[ , [ @object_type = ] 'object' ]
{ , [ @job_id = ] job_id }
[ , [ @specific_target_server = ] 'target_server' ]
[ , [ @value = ] value ]

参数

[@operation =] 'operation'

是被发布操作的操作类型。operation 的数据类型为 varchar(64)，无默认值。有效的操作取决于 object_type。

对象类型 | 操作
JOB | INSERT UPDATE DELETE START STOP
SERVER | RE-ENLIST DEFECT SYNC-TIME SET-POLL

[@object_type =] 'object'

是为之发布操作的对象的类型。有效的类型是 JOB 和 SERVER。object 是 varchar(64) 类型，其默认值为 JOB。

[@job_id =] job_id

是操作所要应用的作业的作业标识号。job_id 的数据类型为 uniqueidentifier，无默认值。0x00 表示"所有"作业。如果 object 是 SERVER，则不需要 job_id。

[@specific_target_server =] 'target_server'

是指定操作所要应用的目标服务器的名称。如果指定了 job_id，但未指定 target_server，那么此操作将向该作业的所有作业服务器发布。target_server 的数据类型为 nvarchar(30)，默认值为 NULL。

[@value =] value

是轮询间隔，以秒为单位。value 的数据类型为 int，默认值为 NULL。只有当 operation 为 SET-POLL 类型时，才指定此参数。

返回代码值

0（成功）或 1（失败）

结果集

无

注释

sp_post_msx_operation 必须从 msdb 数据库中运行。

sp_post_msx_operation 总可以安全地调用，因为它首先确定当前服务器是否为多服务器 SQL Server 代理，若是，再判断 object 是否为多服务器作业。

操作发布后，将记录在表 sysdownloadlist 中。创建并发布作业后，对该作业的后续更改也必须通知目标服务器 (TSX)。这也是用下载列表完成的。

建议最好用 SQL Server 企业管理器来管理下载列表。有关更多信息，请参见修改及查看作业。

权限

任何人均可执行此过程，但是只有 sysadmin 固定服务器角色的成员执行此过程才会有作用。

请参见

sp_add_jobserver

sp_delete_job

sp_delete_jobserver

sp_delete_targetserver

sp_resync_targetserver

sp_start_job

sp_stop_job

sp_update_job

sp_update_operator

系统存储过程


sp_primarykeys

返回指定远程表的主键列，每个键列占一行。

语法

sp_primarykeys [ @table_server = ] 'table_server'
[ , [ @table_name = ] 'table_name' ]
    [ , [ @table_schema = ] 'table_schema' ]
    [ , [ @table_catalog = ] 'table_catalog' ]

参数

[@table_server =] 'table_server'

是链接服务器名称，将从该服务器返回主键信息。table_server 为 sysname 类型，无默认值。

[@table_name =] 'table_name'

是提供其主键信息的表名。table_name 为 sysname 类型，其默认值为 NULL。

[@table_schema =] 'table_schema'

表架构。table_schema 的数据类型为 sysname，默认值为 NULL。在 Microsoft® SQL Server™ 环境中，这相当于表的所有者。

[@table_catalog =] 'table_catalog'

是指定的 table_name 所在的目录名。在 Microsoft SQL Server 环境中，这相当于数据库名称。table_catalog 为 sysname 类型，其默认值为 NULL。

返回代码值

无

结果集
列名 | 数据类型 | 描述
TABLE_CAT | sysname | 表目录。
TABLE_SCHEM | sysname | 表架构。
TABLE_NAME | sysname | 表的名称。
COLUMN_NAME | sysname | 列名。
KEY_SEQ | int | 多列主键中列的序列号。
PK_NAME | sysname | 主键标识符。如果对数据源不适用，则返回 NULL。

注释

sp_primarykeys 是通过查询 table_server 所对应的 OLE DB 提供程序的 IDBSchemaRowset 接口的 PRIMARY_KEYS 行集来执行的。table_name、table_schema、table_catalog 和 column 参数传递到此接口，用以限制返回的行。

若指定链接服务器的 OLE DB 提供程序不支持 IDBSchemaRowset 接口的 PRIMARY_KEYS 行集，sp_primarykeys 将返回空结果集。

权限

执行权限默认授予 public 角色。

示例

下面的示例返回服务器 LONDON1 上数据库 Northwind 中表 Customers 的主键列。

USE master
EXEC sp_primarykeys @table_server = N'LONDON1',
   @table_name = N'Customers',
   @table_catalog = N'Northwind',
   @table_schema = N'dbo'

请参见

sp_catalogs

sp_column_privileges

sp_foreignkeys

sp_indexes

sp_linkedservers

sp_tables_ex

sp_table_privileges

系统存储过程


sp_processmail

使用扩展存储过程（xp_findnextmsg、xp_readmail 和 xp_deletemail）处理 Microsoft® SQL Server™ 收件箱中收到的邮件（应只有单个查询）。SQL Server 用 xp_sendmail 扩展存储过程向邮件发送者返回结果集。

语法

sp_processmail [ [ @subject = ] 'subject' ]
[ , [ @filetype = ] 'filetype' ]
[ , [ @separator = ] 'separator' ]
    [ , [ @set_user = ] 'user' ]
    [ , [ @dbuse = ] 'dbname' ]

参数

[@subject =] 'subject'

是邮件的主题行，该行将解释为 SQL Server 查询。subject 为 varchar(255) 类型，其默认值为 NULL。若指定此参数，sp_processmail 将只处理有此主题的邮件。默认情况下，SQL Server 象处理查询一样处理所有邮件。

[@filetype =] 'filetype'

是将结果集文件发送回邮件发送者时使用的文件扩展名。filetype 为 varchar(3) 类型，其默认值为 txt。

[@separator =] 'separator'

是结果集中每列的列分隔符（字段终止符）。这一信息将传递给扩展存储过程 xp_sendmail 以向邮件发送者返回结果集。separator 为 varchar(3) 类型，其默认值为 tab，表示在各列之间使用制表符的特殊情况。

[@set_user =] 'user'

是应在其中运行查询的安全上下文。user 的数据类型为 sysname。如果没有指定 user，则安全上下文默认授予执行 xp_sendmail 的用户。

[@dbuse =] 'dbname'

是查询应运行于其中的数据库上下文。dbname 为 sysname 类型，其默认值为 master。

返回代码值

0（成功）或 1（失败）

结果集

无

注释

外来电子邮件应以一个单独的有效 SQL Server 查询作为其邮件正文。查询的结果将返回给邮件发件人，并抄送给抄送列表中的所有电子邮件用户。邮件经过处理后，将从收件箱中删除。如果时常有电子邮件发送给服务器，就应经常运行 sp_processmail。若要设置定期的电子邮件处理，可使用 SQL Server 代理程序来调度 sp_processmail 作业。这样，邮件将按指定的频率处理，并在作业历史记录中记录信息性消息，其中包含已处理的查询数目。

返回结果将作为附件文件发送。所发送文件的完整文件名由 Sql 后加随机数字字符串构成，然后是指定的扩展名（文件类型），例如 Sql356.txt。

重要 若要在邮件中附加适当的图标，需确保文件类型的关联正确。若要创建文件关联，请双击桌面上的"我的电脑"，然后选择"视图"菜单中的"选项"命令。在"选项"对话框中的"文件类型"选项卡上，指定用于打开文件的应用程序。

处理查询时收到的错误通过邮件正文返回给邮件发送者。将结果集返回给客户端时，会调用 xp_sendmail，并将其参数 @echo_error 设为 true。所发送的邮件还会包括查询的行数（影响到的行数）。

可为不同数据库中的查询设置不同的 sp_processmail 作业。例如，可采用这样的约定：对数据库 pubs 的查询的主题必须为 SQL:pubs。然后，可运行 sp_processmail，并使用参数 subject = SQL:pubs 及 dbname = pubs。其它数据库查询和分组可有其它格式化的结构。例如，分发任务可有 subject = SQL:distribution 和 dbname = distribution。任何这些任务均可以是 SQL Server 代理程序调度的作业。

也可以按许多方式自定义 sp_processmail 系统存储过程，方法是用 sp_helptext 系统存储过程检索该过程的正文，然后修改其 Transact-SQL 代码。可能的更改包括：

  • 使用参数 @type 调用 xp_readmail 扩展存储过程以只处理特定的自定义邮件类型。

  • 将邮件标记为 read，但处理后不删除邮件（第二次执行 xp_readmail 并将 peek 设为 false）。

  • 通过调用 xp_sendmail 并将其参数 attach_result 设置为 false，以在电子邮件正文中发送查询结果。

  • 设置安全上下文，以在基于邮件发送者的用户上下文中运行查询。如果电子邮件用户名与 SQL Server 用户名相同，那么此更改非常简单，只需在调用 xp_sendmail 时使用 set_user = @originator。如果邮件用户名不是有效的 SQL Server 用户名（例如，如果其中包含嵌入式空格），则可以通过使用对照表或字符替换来得到适当的 SQL Server 用户名以发送给 xp_sendmail。
权限

只有 sysadmin 固定服务器角色或 db_owner 固定数据库角色的成员可执行此过程。

示例

下面的示例处理 pubs 数据库中的所有邮件，并将结果集以 CSV（逗号分隔的值）格式返回给客户端。

sp_processmail @filetype = 'CSV', @separator = ',', @dbuse = 'pubs'

请参见

sp_addtask

系统存储过程

xp_deletemail

xp_findnextmsg

xp_readmail

xp_sendmail


sp_procoption

设置过程选项。

语法

sp_procoption [ @ProcName = ] 'procedure'
, [ @OptionName = ] 'option'
, [ @OptionValue = ] 'value'

参数

[@ProcName =] 'procedure'

是要为其设置或查看选项的过程名。procedure 为 nvarchar(776) 类型，无默认值。

[@OptionName =] 'option'

要设置的选项的名称。option 的唯一值是 startup，该值设置存储过程的自动执行状态。设置为自动执行的存储过程会在每次 Microsoft® SQL Server™ 启动时运行。

[ , [ @OptionValue = ] 'value' ]

表示选项是设置为开（true 或 on）还是关（false 或 off）。value 为 varchar(12) 类型，无默认值。

返回代码值

0（成功）或错误号（失败）

权限

执行权限默认授予 sysadmin 固定服务器角色的成员。启动过程必须属于 master 数据库的所有者。

请参见

OBJECTPROPERTY

系统存储过程


sp_purge_jobhistory

删除作业的历史记录。

语法

sp_purge_jobhistory [ @job_name = ] 'job_name' | [ @job_id = ] job_id

参数

[@job_name =] 'job_name'

是要删除其历史记录的作业名。job_name 为 sysname 类型，其默认值为 NULL。必须指定 job_id 或 job_name，但不能两个都指定。

[@job_id =] job_id

是要删除其记录的作业的作业标识号。job_id 为 uniqueidentifier 类型，其默认值为 NULL。必须指定 job_id 或 job_name，但不能两个都指定。

返回代码值

0（成功）或 1（失败）

结果集

无

权限

执行权限默认授予 public 角色。如果未提供参数，那么所有的历史记录都将删除；但是，只有 sysadmin 固定服务器角色的成员有进行这种操作的权限。

示例
A. 删除指定作业的历史记录

下面的示例删除名为 Table Archives 的作业的历史记录。

USE msdb
EXEC sp_purge_jobhistory @job_name = 'Table Archives'
B. 删除所有作业的历史记录

下面的示例不带参数执行此过程以删除所有的历史记录。

USE msdb
EXEC sp_purge_jobhistory

请参见

sp_help_job

sp_help_jobhistory

系统存储过程


sp_purgehistory

提供 sp_purgehistory 只是为了向后兼容性。有关 Microsoft® SQL Server™ 2000 替换过程的更多信息，请参见 SQL Server 向后兼容性详细信息。

从历史记录日志中删除信息。

重要 有关 SQL Server 早期版本中使用的语法的更多信息，请参见用于 6.x 版的《Microsoft SQL Server Transact-SQL 参考》。

注释

若要进行任务管理，请使用 SQL Server 企业管理器。

权限

执行权限默认授予 public 角色。

请参见

sp_addtask

sp_helphistory

系统存储过程


sp_reassigntask

提供此过程只是为了向后兼容。有关 Microsoft® SQL Server™ 7.0 版替换过程的更多信息，请参见 SQL Server 向后兼容性详细信息。

sp_reassigntask 更改指定登录所拥有的一个或所有作业（以前称为任务）的所有者。如果作业是用 sp_addtask 创建的，则删除该作业时必须使用 sp_droptask。

重要 有关 SQL Server 早期版本所用语法的信息，请参见《Microsoft® SQL Server™ 6.x 版 Transact-SQL 参考》。若要进行任务管理，请使用 SQL Server 企业管理器。

请参见

sp_update_job

系统存储过程


sp_recompile

使存储过程和触发器在下次运行时重新编译。

语法

sp_recompile [ @objname = ] 'object'

参数

[@objname =] 'object'

是当前数据库中的存储过程、触发器、表或视图的限定的或非限定的名称。object 是 nvarchar(776) 类型，无默认值。如果 object 是存储过程或触发器的名称，那么该存储过程或触发器将在下次运行时重新编译。如果 object 是表或视图的名称，那么所有引用该表或视图的存储过程都将在下次运行时重新编译。

返回代码值

0（成功）或非零数字（失败）

注释

sp_recompile 只在当前数据库中寻找对象。

存储过程和触发器所用的查询只在编译时进行优化。对数据库进行了索引或其它会影响数据库统计的更改后，已编译的存储过程和触发器可能会失去效率。通过对作用于表上的存储过程和触发器进行重新编译，可以重新优化查询。

说明 Microsoft® SQL Server™ 会在便利时自动对存储过程和触发器进行重新编译。

权限

执行权限默认授予 public 角色。不是 sysadmin 固定服务器角色成员或 db_owner 固定数据库角色成员的用户只能对自己的表进行操作。

示例

下例将导致使用 titles 表的触发器和存储过程在下次运行时重新编译。

EXEC sp_recompile titles

请参见

系统存储过程


sp_refreshview

刷新指定视图的元数据。由于视图所依赖的基础对象的更改，视图的持久元数据会过期。

语法

sp_refreshview [ @viewname = ] 'viewname'

参数

[@viewname =] 'viewname'

是视图的名称。viewname 是 nvarchar 类型，可以是由多部分组成的标识符，无默认值。

返回代码值

0（成功）或非零数字（失败）

权限

sysadmin 固定服务器角色成员、db_owner 和 db_ddladmin 固定数据库角色成员以及视图的所有者可以在视图上执行 sp_refreshview。

示例

下例刷新视图 titleview 的元数据。

exec sp_refreshview titleview

请参见

系统存储过程


sp_releaseapplock

为应用程序资源解锁。

语法

sp_releaseapplock [ @Resource = ] 'resource_name'
[ , [ @LockOwner = ] 'lock_owner' ]

参数

[@Resource =] 'resource_name'

是客户端应用程序在要求加锁时指定的锁资源名称。resource name 为 nvarchar(255) 类型，无默认值。

[@LockOwner =] 'lock_owner'

是锁所有者，并且必须与请求加锁时指定的 lock_owner 值匹配。lock_owner 的数据类型为 nvarchar(32)，可以是 Transaction（默认值）或 Session。

返回代码值

>= 0（成功）或 <= 0（失败）

值 | 结果
0 | 成功解锁。
-999 | 参数验证或其它调用错误。

注释

如果应用程序对同一锁资源多次调用 sp_getapplock，那么也必须对 sp_releaseapplock 调用同样次数以解锁。

服务器因任何原因而关闭时，都将释放锁。

权限

执行权限默认授予 public 角色。

示例

下例为 Northwind 数据库中资源 Form1 的当前事务解锁。

USE Northwind
EXEC sp_releaseapplock @Resource = 'Form1'

请参见

sp_getapplock


sp_remoteoption

显示或更改在运行 Microsoft® SQL Server™ 的本地服务器上定义的远程登录的选项。

语法

sp_remoteoption [ [ @remoteserver = ] 'remoteserver' ]
[ , [ @loginame = ] 'loginame' ]
[ , [ @remotename = ] 'remotename' ]
[ , [ @optname = ] 'optname' ]
[ , [ @optvalue = ] 'optvalue' ]

参数

[@remoteserver =] 'remoteserver'

是远程登录所应用的远程服务器的名称。remoteserver 为 sysname 类型，其默认值为 NULL。该服务器必须为本地服务器所知（用 sp_addserver 添加）。remoteserver 是启动对本地服务器的远程过程调用的服务器。

[@loginame =] 'loginame'

本地 SQL Server 上的用户的登录 ID。login 的数据类型为 sysname，默认值为 NULL。login 必须已经存在于本地 SQL Server 上。

[@remotename =] 'remotename'

是 remoteserver 上用户的登录ID。remote_name 为 sysname 类型，其默认值为 NULL。remotename 必须存在于 remoteserver 上。

[@optname =] 'optname'

是要设置或关闭的选项。optname 为 varchar(35) 类型，其默认值为 NULL。trusted 是唯一选项。设置该选项后，本地服务器在接受来自远程服务器的远程登录时，不对特定的远程登录验证用户访问权限。默认设置为 untrusted（trusted 设为 FALSE），即当从远程服务器连接本地 SQL Server 时，对远程登录进行密码验证。

[@optvalue =] 'optvalue'

是 optname 的值。optvalue 为 varchar(10) 类型，其默认值为 NULL。设置为 TRUE 时即打开 optname，设置为 FALSE 时即关闭。

返回代码值

0（成功）或 1（失败）

结果集
列名 | 数据类型 | 描述
remotelogin_option | sysname | 远程登录选项。只有 trusted 有效。

注释

若要显示远程登录选项的列表，请执行不带参数的 sp_remoteoption。

sp_remoteoption 不能在用户自定义事务内部执行。

权限

只有 sysadmin 和 securityadmin 固定服务器角色成员才能执行带参数的 sp_remoteoption。所有用户都可以执行 sp_remoteoption（不带参数）以显示远程登录选项的列表。

示例
A. 列出选项

下例列出远程登录选项。

EXEC sp_remoteoption
go

Settable remotelogin options.
remotelogin_option
--------------------------------------------
trusted
B. 接受 trusted 登录

下例定义远程登录 chris，映射到本地登录 salesmgr，该远程登录来自远程服务器 ACCOUNTS，而该服务器将设置为 trusted（不检查密码）。

EXEC sp_remoteoption 'ACCOUNTS', 'salesmgr', 'chris', 'trusted', 'TRUE'
C. 验证 untrusted 登录

下例定义远程登录 chris，映射到本地登录 salesmgr，该远程登录来自远程服务器 ACCOUNTS，而该服务器将设置为 untrusted（将检查密码）。

EXEC sp_remoteoption 'ACCOUNTS', 'salesmgr', 'chris', 'trusted', 'FALSE'

请参见

配置远程服务器

sp_addremotelogin

sp_helpremotelogin

系统存储过程


sp_remove_job_from_targets

从指定的目标服务器或目标服务器组中删除指定的作业。

语法

sp_remove_job_from_targets [ @job_id = ] job_id
| [ @job_name = ] 'job_name'
[ , [ @target_server_groups = ] 'target_server_groups' ]
[ , [ @target_servers = ] 'target_servers' ]

参数

[@job_id =] job_id

是要删除指定目标服务器或目标服务器组的作业的作业标识号。必须指定 job_id 或 job_name 两者之一，但不能同时指定两者。job_id 为 uniqueidentifier 类型，其默认值为 NULL。

[@job_name =] 'job_name'

是要删除指定目标服务器或目标服务器组的作业的名称。必须指定 job_id 或 job_name 两者之一，但不能同时指定两者。job_name 为 sysname 类型，其默认值为 NULL。

[@target_server_groups =] 'target_server_groups'

是要从指定作业中删除的目标服务器组中以逗号分隔的列表。target_server_groups 为 nvarchar(1024) 类型，其默认值为 NULL。

[@target_servers =] 'target_servers'

是要从指定作业中删除的目标服务器中以逗号分隔的列表。target_servers 为 nvarchar(1024) 类型，其默认值为 NULL。

返回代码值

0（成功）或 1（失败）

权限

只有 sysadmin 固定服务器角色的成员才能执行 sp_remove_job_from_targets。

示例

下例从 Sales Server 目标服务器组及 SEATTLE1 和 SEATTLE2 服务器中删除先前创建的 Weekly Sales Data Backup 作业。

USE msdb
EXEC sp_remove_job_from_targets @job_name = 'Weekly Sales Data Backup',
   @target_servers = 'Sales Servers',
   @target_server_groups = 'SEATTLE2,SEATTLE1'

请参见

sp_apply_job_to_targets

sp_delete_jobserver

系统存储过程


sp_remove_log_shipping_monitor

从 log_shipping_monitor 表中删除日志传送监视器的信息。

语法

sp_remove_log_shipping_monitor

返回代码值

0（成功）或 1（失败）

注释

该存储过程从主要服务器或辅助服务器中删除监视器。sp_remove_log_shipping_monitor 应在从 log_shipping_databases 和 log_shipping_plans 中删除所有行后再执行。否则，此存储过程将失败。

权限

只有 sysadmin 固定服务器角色的成员才能执行 sp_remove_log_shipping_monitor。

示例
EXEC   msdb.dbo.sp_remove_log_shipping_monitor


sp_rename

更改当前数据库中用户创建对象（如表、列或用户定义数据类型）的名称。

语法

sp_rename [ @objname = ] 'object_name' ,
[ @newname = ] 'new_name'
[ , [ @objtype = ] 'object_type' ]

参数

[@objname =] 'object_name'

是用户对象（表、视图、列、存储过程、触发器、默认值、数据库、对象或规则）或数据类型的当前名称。如果要重命名的对象是表中的一列，那么 object_name 必须为 table.column 形式。如果要重命名的是索引，那么 object_name 必须为 table.index 形式。object_name 为 nvarchar(776) 类型，无默认值。

[@newname =] 'new_name'

是指定对象的新名称。new_name 必须是名称的一部分，并且要遵循标识符的规则。newname 是 sysname 类型，无默认值。

[@objtype =] 'object_type'

是要重命名的对象的类型。object_type 为 varchar(13) 类型，其默认值为 NULL，可取下列值。

值 | 描述
COLUMN | 要重命名的列。
DATABASE | 用户定义的数据库。要重命名数据库时需用此选项。
INDEX | 用户定义的索引。
OBJECT | 在 sysobjects 中跟踪的类型的项目。例如，OBJECT 可用来重命名约束（CHECK、FOREIGN KEY、PRIMARY/UNIQUE KEY）、用户表、视图、存储过程、触发器和规则等对象。
USERDATATYPE | 通过执行 sp_addtype 而添加的用户定义数据类型。

返回代码值

0（成功）或非零数字（失败）

注释

只能更改当前数据库中的对象名称或数据类型名称。大多数系统数据类型和系统对象的名称不能更改。

重命名视图时，sysobjects 表中有关该视图的信息将得到更新。重命名存储过程时，sysobjects 表中有关该过程的信息将得到更新。

每当重命名 PRIMARY KEY 或 UNIQUE 约束时，sp_rename 都会自动为相关联的索引重命名。如果重命名的索引与 PRIMARY KEY 约束相关联，那么 sp_rename 也会自动重命名主键。

重要 重命名存储过程和视图后，请清空过程高速缓存以确保所有相关的存储过程和视图都重新编译。

由于存储过程和视图都不存储数据，所以这两种对象均可快速删除和重建。重命名文本对象时，要获得最佳结果，应删除并使用其新名称重新创建对象。

权限

sysadmin 固定服务器角色成员、db_owner 和 db_ddladmin 固定数据库角色成员或对象所有者可以执行 sp_rename。只有 sysadmin 和 dbcreator 固定服务器角色成员才能将"database"作为 object_type 来执行 sp_rename。

示例
A. 重命名表

下例将表 customers 重命名为 custs。

EXEC sp_rename 'customers', 'custs'
B. 重命名列

下例将表 customers 中的列 contact title 重命名为 title。

EXEC sp_rename 'customers.[contact title]', 'title', 'COLUMN'

请参见

ALTER TABLE

CREATE DEFAULT

CREATE PROCEDURE

CREATE RULE

CREATE TABLE

CREATE TRIGGER

CREATE VIEW

数据类型

SETUSER

sp_addtype

sp_depends

sp_renamedb

系统存储过程


sp_renamedb

更改数据库的名称。

语法

sp_renamedb [ @dbname = ] 'old_name' ,
[ @newname = ] 'new_name'

参数

[@dbname =] 'old_name'

是数据库的当前名称。old_name 为 sysname 类型，无默认值。

[@newname =] 'new_name'

是数据库的新名称。new_name 必须遵循标识符规则。new_name 为 sysname 类型，无默认值。

返回代码值

0（成功）或非零数字（失败）

权限

只有 sysadmin 和 dbcreator 固定服务器角色的成员才能执行 sp_renamedb。

示例

下例将数据库 accounting 改名为 financial。

EXEC sp_renamedb 'accounting', 'financial'

请参见

CREATE DATABASE

sp_changedbowner

sp_dboption

sp_depends

sp_helpdb

sp_rename

系统存储过程


sp_resetstatus

重置置疑数据库的状态。

语法

sp_resetstatus [ @DBName = ] 'database'

参数

[@DBName =] 'database'

是要重置的数据库名。database 的数据类型为 sysname，无默认值。

返回代码值

0（成功）或 1（失败）

注释

sp_resetstatus 关闭数据库上的置疑标记。此过程更新 sysdatabases 中的命名数据库的模式和状态列。在运行此过程之前，应参考 SQL Server 错误日志并解决所有问题。执行 sp_resetstatus 后停止并重新启动 SQL Server。

由于某些原因，数据库可能成为置疑状态。可能的原因包括操作系统拒绝对数据库资源的访问，以及一个或多个数据库文件不可用性或已损坏。

权限

只有 sysadmin 固定服务器角色成员才能执行 sp_resetstatus。

示例

下例重置 PUBS 数据库的状态。

EXEC sp_resetstatus 'PUBS'

请参见

磁盘空间不足

重置置疑状态

排除恢复故障


sp_resolve_logins

根据来自以前的主服务器中的登录解析新的主服务器上的登录。

语法

sp_resolve_logins [ @dest_db = ] 'dest_db'
, [ @dest_path = ] 'dest_path'
 , [ @filename = ] 'filename'

参数

[@dest_db =] 'dest_db'

是新的主数据库名称。dest_db 的数据类型为 sysname，无默认值。

[@dest_path =] dest_path

是存储 filename 的目录路径。dest_path 为 nvarchar(255) 类型，无默认值。

[@filename =] filename

是包含以前的主数据库中大容量复制 syslogins 表的文件名。filename 为 nvarchar(255) 类型，无默认值。

返回代码值

0（成功）或 1（失败）

结果集

无

注释

sp_resolve_logins 必须在标记为新的主服务器（以前的辅助服务器）的 SQL Server 实例上运行。必须从目标数据库运行此存储过程。

为完成日志传送角色更改，除运行此过程外，还必须执行某些步骤。有关更多信息，请参见如何设置和执行日志传送角色转变 (Transact-SQL)。

权限

只有 sysadmin 固定服务器角色成员才能执行 sp_resolve_logins。

示例

下例显示如何根据来自以前的主服务器的登录解析新的主服务器上的登录。"db2"是新的主数据库的名称。"syslogins.dat"包含来自以前主数据库的大容量复制 syslogins 表并存储在 'c:\bulkoutput\' 目录中。

EXEC sp_resolve_logins @dest_db = 'db2',
   @dest_path = 'c:\bulkoutput\',
   @dest_filename = 'syslogins.dat'

请参见

sp_change_monitor_role

sp_change_primary_role

sp_change_secondary_role


sp_resync_targetserver

重新同步处理指定目标服务器中的所有多服务器作业。

语法

sp_resync_targetserver [ @server_name = ] 'server'

参数

[@server_name =] 'server'

是要重新同步处理的服务器的名称。server 为 nvarchar(30) 类型，无默认值。如果指定 ALL，那么所有目标服务器都将重新同步处理。

返回代码值

0（成功）或 1（失败）

结果集

报告 sp_post_msx_operation 操作的结果。

注释

sp_resync_targetserver 为目标服务器删除当前指令集，并发布新指令集以供目标服务器下载。新指令集中包括一条删除所有多服务器作业的指令，随后是当前以该服务器为目标服务器的每个作业的插入指令。

权限

只有 sysadmin 固定服务器角色的成员可执行 sp_resync_targetserver。

示例

下例将重新同步处理目标服务器 LONDON1。

USE msdb
EXEC sp_resync_targetserver 'LONDON1'

请参见

sp_help_downloadlist

sp_post_msx_operation

系统存储过程


sp_revokedbaccess

从当前数据库中删除安全帐户。

语法

sp_revokedbaccess [ @name_in_db = ] 'name'

参数

[@name_in_db =] 'name'

是要删除的帐户名。name 的数据类型为 sysname，无默认值。name 可以是 Microsoft® SQL Server™ 用户名或 Microsoft Windows NT® 用户名或组名，而且必须存在于当前数据库中。当指定 Windows NT 用户或组时，请指定该 Windows NT 用户或组在数据库中可被识别的名称（即用 sp_grantdbaccess 添加的名称）。

返回代码值

0（成功）或 1（失败）

注释

删除帐户时，依赖于该帐户的权限和别名将自动删除。

只能用 sp_revokedbaccess 删除当前数据库中的帐户。若要向数据库中添加帐户，请使用 sp_grantdbaccess。若要删除 SQL Server 角色，请使用 sp_droprole。从当前数据库中删除拥有对象的帐户时，必须先删除对象或用 sp_changeobjectowner 更改对象所有者后，再执行 sp_revokedbaccess。

sp_revokedbaccess 存储过程不能删除：

  • public 角色、dbo 或 INFORMATION_SCHEMA 用户。

  • 数据库中的固定角色。

  • master 和 tempdb 数据库中的 guest 用户帐户。

  • Windows NT 组中的 Windows NT 用户。

在用户定义事务内部不能执行 sp_revokedbaccess。

权限

只有 sysadmin 固定服务器角色成员及 db_accessadmin 和 db_owner 固定数据库角色成员才能执行 sp_revokedbaccess。

示例

下例从当前数据库中删除帐户 Corporate\GeorgeW。

EXEC sp_revokedbaccess 'Corporate\GeorgeW'

请参见

sp_changeobjectowner

sp_droprole

sp_grantdbaccess

系统存储过程


sp_revokelogin

从 Microsoft® SQL Server™ 中删除用 sp_grantlogin 或 sp_denylogin 创建的 Microsoft Windows NT® 用户或组的登录项。

语法

sp_revokelogin [ @loginame = ] 'login'

参数

[@loginame =] 'login'

是 Windows NT 用户或组的名称。login 为 sysname 类型，无默认值。login 可以是 Domain\User 形式的任何现有 Windows NT 用户名或组。

返回代码值

0（成功）或 1（失败）

注释

sp_revokelogin 并不显式禁止 Windows NT 用户连接到 SQL Server，但禁止 Windows NT 用户通过其 Windows NT 用户帐户进行连接。但是，如果他们是 Windows NT 组的成员，且该组由 sp_grantlogin 存储过程授予了对 SQL Server 的访问权限，则该 Windows NT 用户仍然可以连接 SQL Server。例如，如果 Windows NT 用户 REDMOND\john 是 Windows NT 组 REDMOND\Admins 的成员，且用以下命令废除了 REDMOND\john 的访问权：

sp_revokelogin [REDMOND\john]

如果授权 REDMOND\Admins 访问，那么 REDMOND\john 仍可连接。同样，如果废除了 REDMOND\Admins 访问权但授权 REDMOND\john 访问，那么 REDMOND\john 仍可连接。

使用 sp_denylogin 可显式禁止用户连接到 SQL Server，而不论其 Windows NT 组成员资格如何。

使用 sp_droplogin 可删除用 sp_addlogin 添加的 SQL Server 登录。

在用户定义事务内部不能执行 sp_revokelogin。

权限

只有 sysadmin 或 securityadmin 固定服务器角色的成员才能执行 sp_revokelogin。

示例

下例删除 Windows NT 用户 Corporate\MollyA 的登录条目。

EXEC sp_revokelogin 'Corporate\MollyA'

或

EXEC sp_revokelogin [Corporate\MollyA]

请参见

sp_denylogin

sp_droplogin

sp_grantlogin

系统存储过程


sp_runwebtask

执行先前定义的 Web 作业并生成 HTML 文档。要运行的任务由输出文件名或过程名标识，或者由两个参数同时标识。

说明 所有 Web 作业在企业管理器的"作业分类"对话框中都被归为 Web 助手。有关更多信息，请参见定义作业。

语法

sp_runwebtask [ [ @procname = ] 'procname' ]
[ , [ @outputfile = ] 'outputfile'

参数

[@procname =] 'procname'

是要运行的 Web 作业过程的名称。指定的过程定义了 Web 作业的查询。procname 为 nvarchar(128) 类型，无默认值。

[@outputfile =] 'outputfile'

是指定 Web 作业的输出文件名。outputfile 为 nvarchar(255) 类型，无默认值。

返回代码值

0（成功）或非零数字（失败）

注释

sp_runwebtask 必须在 sp_makewebtask 的 dbname 所指定的同一数据库中执行。

系统管理员不应使用 SETUSER 测试 sp_runwebtask。扩展过程并不理会新用户的安全上下文。要测试适当的安全授权，请创建临时用户 ID 和密码。使用这一临时帐户登录并测试 sp_runwebtask。测试完成后删除临时帐户。

由 sp_runwebtask 生成的输出是真正的 HTML 源代码。可使用大多数文字处理应用程序查看源文档。

重要 sp_dropwebtask、sp_makewebtask 和 sp_runwebtask 只能在 Microsoft® SQL Server™ 6.5 版及其更高版本的数据库上运行。在以前版本的数据库中运行这些过程会返回错误。

当某作业定期调度运行时，SQL Server 代理必须处于运行状态。否则将不能生成 .htm 页。

所有 Microsoft Windows® 95/98 Web 助手的用户都必须在正使用的数据库中有用户帐户。使用 sp_adduser 向每个用户可能访问的数据库添加帐户。当运行 Windows 95/98 操作系统时，按需分配任务只能由作业所有者或系统管理员运行。

权限

用户要运行由 Web 作业使用的指定查询，就必须具有 SELECT 权限。

示例

下例使用 @outputfile 参数 C:\Web\Myfile.html 和 @procname 参数 MYHTML 运行 Web 作业。

sp_runwebtask @procname = 'MYHTML', @outputfile = 'C:\WEB\MYFILE.HTML'

请参见

sp_dropwebtask

sp_makewebtask

系统存储过程


sp_scriptsubconflicttable

为给定的排队订阅项目生成用于在订阅服务器上创建冲突表的脚本。生成的脚本在订阅服务器的订阅数据库上执行。该存储过程在发布服务器的发布数据库上执行。

语法

sp_scriptsubconflicttable [@publication =] 'publication'
, [@article =] 'article'

参数

[@publication =] 'publication'

是包含项目的发布名。该名称在数据库内必须唯一。publication 的数据类型为 sysname，没有默认设置。

[@article =] 'article'

是订阅项目名。article 的数据类型为 sysname，没有默认设置。

返回代码值

0（成功）或 1（失败）

结果集
列名 | 数据类型 | 描述
cmdtext | nvarchar(4000) | 为排队订阅项目返回用于在订阅服务器上创建冲突表的 Transact-SQL 脚本。该脚本在订阅服务器的订阅数据库上执行。

注释

sp_scriptsubconflicttable 用于含有手工应用初始快照的订阅的订阅服务器。冲突表为订阅服务器上的可选表。

权限

只有 sysadmin 固定服务器角色成员或 db_owner 固定数据库角色成员才能执行 sp_scriptsubconflicttable。

请参见

排队更新的工作机制

系统存储过程

排队更新冲突检测和解决


sp_server_info

返回 Microsoft® SQL Server™、数据库网关或基础数据源的特性名和匹配值的列表。

语法

sp_server_info [[@attribute_id =] 'attribute_id']

参数

[@attribute_id =] 'attribute_id'

是特性的整型 ID。attribute_id 的数据类型是 int，默认设置为 NULL。

返回代码值

无

结果集
列名 | 数据类型 | 描述
ATTRIBUTE_ID | int | 特性的 ID 号。
ATTRIBUTE_NAME | varchar(60) | 特性的名称。
ATTRIBUTE_VALUE | varchar(255) | 特性的当前设置。

下面这些是特性。Microsoft DB-Library 和 ODBC 客户端库目前在连接时使用特性 1、2、18、22 和 500。

ATTRIBUTE_ID | ATTRIBUTE_NAME 描述 | ATTRIBUTE_VALUE
1 | DBMS_NAME | Microsoft SQL Server
2 | DBMS_VER | Microsoft SQL Server 2000 - 8.00.xxx (Intel X86) May 31 2000 00:54:06 Copyright (c) 1988-2000 Microsoft Corporation
10 | OWNER_TERM | 所有者
11 | TABLE_TERM | 表
12 | MAX_OWNER_NAME_LENGTH | 128
13 | TABLE_LENGTH 指定表名的最大字符数。 | 128
14 | MAX_QUAL_LENGTH 指定表标识符（由三部分组成的表名的第一部分）名称的最大长度。 | 128
15 | COLUMN_LENGTH 指定列名的最大字符数。 | 128
16 | IDENTIFIER_CASE 在数据库（系统目录中对象的事例）中指定用户定义的名称（表名、列名、存储过程名）。 | SENSITIVE
17 | TX_ISOLATION 指定服务器所采用的初始事务隔离级别，此级别与 SQL-92 中定义的隔离级别相对应。 | 2
18 | COLLATION_SEQ 指定该服务器的字符集排序。 | charset=iso_1 sort_order=dictionary_iso charset_num=1 sort_order_num=51
19 | SAVEPOINT_SUPPORT 指定基础 DBMS 是否支持命名保存点。 | Y
20 | MULTI_RESULT_SETS 指定基础数据库或网关本身是否支持多个结果集（通过网关可以将多个语句与返回给客户端的多个结果集一起发送）。 | Y
22 | ACCESSIBLE_TABLES 指定网关是否在 sp_tables 中只返回可由当前用户（即对表至少有 SELECT 权限的用户）访问的表、视图等。 | Y
100 | USERID_LENGTH 指定用户名的最大字符数。 | 128
101 | QUALIFIER_TERM 指定表限定符（由三部分组成的名称的第一部分）的 DBMS 供应商术语。 | 数据库
102 | NAMED_TRANSACTIONS 指定基础 DBMS 是否支持命名事务。 | Y
103 | SPROC_AS_LANGUAGE 指定能否将存储过程作为语言事件执行。 | Y
104 | ACCESSIBLE_SPROC 指定网关是否在 sp_stored_procedures 中只返回可由当前用户执行的存储过程。 | Y
105 | MAX_INDEX_COLS 指定 DBMS 索引中的最大列数。 | 16
106 | RENAME_TABLE 指定是否可以重命名表。 | Y
107 | RENAME_COLUMN 指定是否可以重命名列。 | Y
108 | DROP_COLUMN 指定是否可以除去列。 | 如果运行的是 SQL Server 2000，则返回 Y，如果运行的是 SQL Server 2000 以前的版本，则返回 N。
109 | INCREASE_COLUMN_LENGTH 指定是否可以增大列的大小。 | 如果运行的是 SQL Server 2000，则返回 Y，如果运行的是 SQL Server 2000 以前的版本，则返回 N。
110 | DDL_IN_TRANSACTION 指定 DDL 语句是否可以出现在事务中。 | 如果运行的是 SQL Server 6.5 或更高版本，则返回 Y，如果运行的是 6.5 以前的版本，则返回 N。
111 | DESCENDING_INDEXES 指定是否支持降序索引。 | 如果运行的是 SQL Server 2000，则返回 Y，如果运行的是 SQL Server 2000 以前的版本，则返回 N。
112 | SP_RENAME 指定是否可以重命名存储过程。 | Y
113 | REMOTE_SPROC 指定能否通过 DB-Library 中的远程存储过程函数执行存储过程。 | Y
500 | SYS_SPROC_VERSION 指定当前实现的目录存储过程的版本。 | 当前的版本号

注释

sp_server_info 返回 ODBC 中的 SQLGetInfo 所提供信息的子集。

权限

执行权限默认授予 public 角色。

请参见

系统存储过程


sp_serveroption

为远程服务器和链接服务器设置服务器选项。

在此次发布的版本中，使用 use remote collation 和 collation name 这两个新选项增强了 sp_serveroption 选项，使其支持链接服务器中的排序规则。

语法

sp_serveroption [@server =] 'server'
,[@optname =] 'option_name'
,[@optvalue =] 'option_value'

参数

[@server =] 'server'

是要为其设置选项的服务器的名称。server 的数据类型为 sysname，无默认值。

[@optname =] 'option_name'

是为指定的服务器设置的选项。option_name 的数据类型为 varchar(35)，无默认值。option_name 可以是下列值中的任何一个。

值 | 描述
collation compatible | 影响分布式查询在链接服务器上的执行。如果该选项设置为 true，则 Microsoft® SQL Server™ 假定链接服务器中的所有字符在字符集和排序规则序列（或排序次序）上与本地服务器兼容。这使 SQL Server 得以将字符列上的比较运算发送给提供程序去执行。如果没有设置此选项，SQL Server 将总是在本地执行字符列上的比较运算。 只有在确信链接服务器所对应的数据源与本地服务器有相同的字符集和排序次序时，才应当设置此选项。
collation name | 如果 use remote collation 是 true，而数据源不是 SQL Server 数据源，则指定远程数据源使用的排序规则名称。此名称必须是 SQL Server 支持的排序规则之一。 如果访问的是 SQL Server 以外的 OLE DB 数据源，但该数据源的排序规则与 SQL Server 的某个排序规则匹配，则使用该选项。 链接服务器必须支持该服务器中所有列使用的单个排序规则。如果链接服务器支持单个数据源内的多个排序规则，或者如果无法确定链接服务器的排列规则是否与 SQL Server 的某个排序规则匹配，则不要设置该选项。
connect timeout | 连接到链接服务器时的超时值。 如果为 0，则使用 sp_configure 的默认值。
data access | 启用和禁用分布式查询访问的链接服务器。仅用于通过sp_addlinkedserver 添加的 sysserver 项。
dist | 分发服务器。
dpub | 到该分发服务器的远程发布服务器。
lazy schema validation | 确定是否检查远程表的架构。 如果为 ture，则在查询开始时跳过远程表的架构检查。
pub | 发布服务器。
query timeout | 链接服务器上的查询超时值。 如果为 0，则使用 sp_configure 的默认值。
rpc | 从给定的服务器启用 RPC。
rpc out | 对给定的服务器启用 RPC。
sub | 订阅服务器。
system | 仅限内部使用。
use remote collation | 确定是使用远程列的排序规则还是本地服务器的排序规则。 如果为 true，则 SQL Server 数据源使用远程列的排序规则，非 SQL Server 数据源使用 collation name 中指定的排序规则。 如果为 false，则分布式查询将总是使用本地服务器的默认排序规则，而 collation name 和远程列的排序规则将被忽略。默认设置为 false。（false 值符合与 SQL Server 7.0 中使用的排序规则语义。)

[@optvalue =] 'option_value'

指定是启用（TRUE 或 on）还是禁用（FALSE 或 off）option_name。option_value 的数据类型为 varchar(10)，无默认值。

option_value 可以是用于 connect timeout 和 query timeout 选项的非负整数。对于 collation name 选项，option_value 可以是排序规则名称或 NULL。

返回代码值

0（成功）或 1（失败）

注释

如果 collation compatible 选项设置为 TURE，则 collation name 将自动设置为 NULL。如果 collation name 设置为非 NULL 值，则 collation compatible 将自动设置为 FAISE。

权限

只有 sysadmin 和 setupadmin 固定服务器角色的成员才能执行 sp_serveroption。

示例
A. 启用发布服务器/订阅服务器

下例将服务器设置为发布服务器/订阅服务器的组合。

USE master
EXEC sp_serveroption 'ACCOUNTS', 'dpub', 'TRUE'
B. 禁用分发服务器

下例关闭 SEATTLE2 服务器的 dist 选项。

USE master
EXEC sp_serveroption 'SEATTLE2', 'dist', 'off'
C. 使链接服务器的排序规则与本地 SQL Server 兼容

下例配置与另外一台 SQL Server（即 SEATTLE3）相对应的链接服务器，使其排序规则与本地 SQL Server 兼容。

USE master
EXEC sp_serveroption 'SEATTLE3', 'collation compatible', 'true'

请参见

sp_adddistpublisher

sp_addlinkedserver

sp_dropdistpublisher

sp_helpserver

系统存储过程


sp_setapprole

激活与当前数据库中的应用程序角色关联的权限。

语法

sp_setapprole [@rolename =] 'role' ,
[@password =] {Encrypt N 'password'} | 'password'
[,[@encrypt =] 'encrypt_style']

参数

[@rolename =] 'role'

是在当前数据库中定义的应用程序角色名。role 的数据类型是 sysname，没有默认设置。role 必须存在于当前数据库中。

[@password =] {Encrypt N 'password'} | 'password'

是激活应用程序角色所需的密码。password 的数据类型是 sysname，没有默认设置。可以使用 ODBC 规范 Encrypt 函数对 password 加密。使用 Encrypt 函数时，必须在密码的前面加上 N 以将密码转换成 Unicode 字符串。

[@encrypt =] 'encrypt_style'

指定 password 使用的加密样式。encrypt_style 的数据类型为 varchar(10)，可以是下列值之一。

值 | 描述
None | 该密码不加密并以明文形式传递给 Microsoft® SQL Server™。这是默认设置。
Odbc | 将密码发送到 SQL Server 之前，使用 ODBC 规范 Encrypt 函数对密码加密。这只能通过 ODBC 客户端或用于 SQL Server 的 OLE DB 提供程序指定。DB-Library 客户端不能使用该选项。

返回代码值

0（成功）或 1（失败）

注释

应用程序角色没有成员，因此不必将用户添加到应用程序角色。未激活应用程序角色时，sp_setapprole 对用户在当前数据库内其它角色或组中的成员资格无效。

激活应用程序角色时，将忽略通常与激活应用程序角色的用户连接关联的权限。用户连接获得与（应用程序角色在其中定义的）数据库的应用程序角色关联的权限。用户连接只能通过授予另一个数据库的 guest 用户帐户的权限来获得对该数据库的访问。因此，如果数据库中没有 guest 用户帐户，则连接无法获得对该数据库的访问。

使用 sp_setapprole 激活某个应用程序角色后，在用户与 SQL Server 断开连接之前不能在当前数据库内停用该角色。

若要保护应用程序角色密码，请使用 ODBC Encrypt 函数对密码加密并将 odbc 指定为加密方法。

sp_setapprole 存储过程只能由直接 Transact-SQL 语句执行，不能在另一个存储过程内或从用户定义事务内执行。

权限

任何用户都可以通过为角色提供正确的密码来执行 sp_setapprole。

示例
A. 激活应用程序角色但不对密码加密

下例使用明文密码 AsDeFXX 激活名为 SalesAppRole 的应用程序角色，AsDeFXX 是使用特别为当前用户使用的应用程序设计的权限创建的。

EXEC sp_setapprole 'SalesApprole', 'AsDeFXX'
B. 激活应用程序角色并对密码加密

下例用密码 pswd 激活 Test 应用程序角色，并且在将此密码发送到 SQL Server 之前对其加密。

EXEC sp_setapprole 'Test', {Encrypt N 'pswd'}, 'odbc'

请参见

建立应用程序安全和应用程序角色

sp_addapprole

sp_dropapprole

系统存储过程


sp_setnetname

将 sysservers 中的网络名称设置为用于远程 Microsoft® SQL Server™ 实例的实际网络计算机名。该过程可用于启用对计算机（其网络名称中包含无效的 SQL Server 标识符）的远程存储过程调用执行。

语法

sp_setnetname @server = 'server',
@netname = 'network_name'

参数

@server = 'server'

是在用户编码的远程存储过程调用语法中引用的远程服务器名。sysservers 中必须正好已有一行要使用该 server。server 的数据类型是 sysname，没有默认设置。

@netname = 'network_name'

是对其执行远程存储过程调用的计算机网络名称。network_name 的数据类型是 sysname，没有默认设置。

该名称必须与 Microsoft Windows NT® 计算机名匹配，并且可以包含 SQL Server 标识符中不允许的字符。

如果 SQL Server 计算机中定义了与 network_name 匹配的 DB-Library 别名，则该别名中的连接字符串信息用于连接到远程 SQL Server。

返回代码值

0（成功）或 1（失败）

结果集

无

注释

如果计算机名包含无效的标识符，对 Windows NT 计算机的一些远程存储过程调用则可能遇到问题。使用该过程区别 sysservers.srvname 和 sysservers.srvnetname 之间的值。

因为链接服务器和远程服务器驻留在相同的命名空间内，所以它们的名称不能相同。不过，通过指派不同的名称并使用 sp_setnetname 将其中一台服务器的网络名称设置为基础服务器的网络名称，则可以在给定的服务器上同时定义链接服务器和远程服务器。

--Assume sqlserv2 is actual name of SQL Server
--database server
EXEC sp_addlinkedserver 'sqlserv2'
GO
EXEC sp_addserver 'rpcserv2'
GO
EXEC sp_setnetname 'rpcserv2', 'sqlserv2'

说明 不支持使用 sp_setnetname 将链接服务器指回本地服务器。以这种方式引用的服务器不能参与分布式事务。

权限

只有 sysadmin 和 setupadmin 固定服务器角色的成员才能执行此过程。

示例

下例显示在 SQL Server 上发出远程存储过程调用所使用的典型管理序列。

USE master
EXEC sp_addserver 'Win_NT1'
EXEC sp_setnetname 'Win_NT1','Win-NT1'
EXEC Win_NT1.master.dbo.sp_who

请参见

sp_addlinkedserver

sp_addserver

系统存储过程


sp_settriggerorder

指定第一个或最后一个激发的、与表关联的 AFTER 触发器。在第一个和最后一个触发器之间激发的 AFTER 触发器将按未定义的顺序执行。

语法

sp_settriggerorder[@triggername = ] 'triggername'
, [@order = ] 'value'
, [@stmttype = ] 'statement_type'

参数

[@triggername =] 'triggername'

是将要设置或更改顺序的触发器的名称。triggername 的数据类型为 sysname。如果此名称与触发器不对应或此名称对应于 INSTEAD OF 触发器，该过程将返回错误。

[@order =] 'value'

是新触发器顺序的设置。value 的数据类型为 varchar(10)，可以是下列值中的任何一个。

重要 First 和 Last 触发器必须是两个不同的触发器。

值 | 描述
First | 最先激发的触发器。
Last | 最后激发的触发器。
None | 以未定义的顺序激发的触发器。

[@stmttype = ] 'statement_type'

指定哪条 SQL 语句激发触发器。statement_type 的数据类型为 varchar(10)，可以是 INSERT、UPDATE 或 DELETE。只有在触发器已经定义为某种语句类型的触发器后，才能将其指派为该语句类型的 First 或 Last 触发器。例如，如果 TR1 定义为 INSERT 触发器，则可以将表 T1 上的 INSERT 触发器 TR1 指派为 First 触发器。如果将只定义为 INSERT 触发器的 TR1 设置为 UPDATE 语句的 First（或 Last）触发器，则 SQL Server 将返回错误信息。有关更多信息，请参见注释部分。

返回代码值

0（成功）或 1（失败）

注释

单个表上的每个 INSERT、UPDATE 或 DELETE 语句只能有一个 First 和一个 Last 触发器。

如果在表上已定义了 First 触发器，则不能指派新触发器作为同一操作（INSERT、UPDATE 或 DELETE）的同一表的 First 触发器。此限制也适用于 Last 触发器。

作为 SQL Server 复制的一部分，可在已发布表上指派 First 触发器；然而，如果与用户定义的触发器存在冲突，则必须在表发布之前将用户定义触发器的指派更改为 None。

如果 ALTER TRIGGER 语句更改第一个或最后一个触发器，则除去最初在触发器上设置的 First 或 Last 特性，并且替换为 None。顺序值必须用 sp_settriggerorder 重新设置。

如果必须将同一触发器指派为多个语句类型的第一个或最后一个顺序，则必须为每个语句类型执行 sp_settriggerorder。而且，在可以将触发器指派为某个语句类型激发的 First 或 Last 触发器之前，必须先将其定义为该语句类型。

权限

触发器所有者以及在其上定义触发器的表所有者拥有 sp_settriggerorder 的执行许可权限。当前数据库中的 db_owner 和 db_ddladmin 角色成员以及 sysadmin 服务器角色成员可以执行该存储过程。

示例
sp_settriggerorder @triggername= 'MyTrigger', @order='first', @stmttype = 'UPDATE'


sp_spaceused

显示行数、保留的磁盘空间以及当前数据库中的表所使用的磁盘空间，或显示由整个数据库保留和使用的磁盘空间。

语法

sp_spaceused [[@objname =] 'objname']
[,[@updateusage =] 'updateusage']

参数

[@objname =] 'objname'

是为其请求空间使用信息（保留和已分配的空间）的表名。objname 的数据类型是 nvarchar(776)，默认设置为 NULL。

[@updateusage =] 'updateusage'

表示应在数据库内（未指定 objname 时）还是在特定的对象上（指定 objname 时）运行 DBCC UPDATEUSAGE。值可以是 true 或 false。updateusage 的数据类型是 varchar(5)，默认设置为 FALSE。

返回代码值

0（成功）或 1（失败）

结果集

如果省略 objname，则返回两个结果集。

列名 | 数据类型 | 描述
database_name | varchar(18) | 当前数据库的名称。
database_size | varchar(18) | 当前数据库的大小。
unallocated space | varchar(18) | 数据库的未分配空间。

列名 | 数据类型 | 描述
reserved | varchar(18) | 保留的空间总量。
Data | varchar(18) | 数据使用的空间总量。
index_size | varchar(18) | 索引使用的空间。
Unused | varchar(18) | 未用的空间量。

如果指定参数，则返回下面的结果集。

列名 | 数据类型 | 描述
Name | nvarchar(20) | 为其请求空间使用信息的表名。
Rows | char(11) | objname 表中现有的行数。
reserved | varchar(18) | 为 objname 表保留的空间总量。
Data | varchar(18) | objname 表中的数据所使用的空间量。
index_size | varchar(18) | objname 表中的索引所使用的空间量。
Unused | varchar(18) | objname 表中未用的空间量。

注释

sp_spaceused 计算数据和索引使用的磁盘空间量以及当前数据库中的表所使用的磁盘空间量。如果没有给定 objname，sp_spaceused 则报告整个当前数据库所使用的空间。

当指定 updateusage 时，Microsoft® SQL Server™ 扫描数据库中的数据页，并就每个表使用的存储空间对 sysindexes 表作出任何必要的纠正。例如会出现这样一些情况：当除去索引后，表的 sysindexes 信息可能不是当前的。该进程在大表或数据库上可能要花一些时间运行。只有当怀疑所返回的值不正确，而且该进程对数据库中的其它用户或进程没有负面影响时，才应使用该进程。如果首选该进程，则可以单独运行 DBCC UPDATEUSAGE。

权限

执行权限默认授予 public 角色。

示例
A. 有关表的空间信息

下例报告为 titles 表分配（保留）的空间量、数据使用的空间量、索引使用的空间量以及由数据库对象保留的未用空间量。

USE pubs
EXEC sp_spaceused 'titles'
B. 有关整个数据库的已更新空间信息

下例概括当前数据库使用的空间并使用可选参数 @updateusage。

USE pubs
sp_spaceused @updateusage = 'TRUE'
权限

执行权限默认授予 public 角色。

请参见

CREATE INDEX

CREATE TABLE

DBCC SQLPERF

DROP INDEX

DROP TABLE

sp_help

sp_helpindex

系统存储过程


sp_special_columns

返回唯一标识表中某行的优化列集。当事务更新行中的全部值时，还返回自动更新的列。

语法

sp_special_columns [@name =] 'name'
[,[owner =] 'owner']
[,[@qualifier =] 'qualifier']
    [,[@col_type =] 'col_type']
[,[@scope =] 'scope']
[,[@nullable =] 'nullable']
[,[@ODBCVer =] 'ODBCVer']

参数

[@name =] 'name'

是用于返回目录信息的表名。name 的数据类型是 sysname，没有默认设置。不支持通配符模式匹配。

[owner =] 'owner'

是用于返回目录信息的表所有者。owner 的数据类型是 sysname，默认设置为 NULL。不支持通配符模式匹配。如果未指定 owner，则应用基础 DBMS 的默认表可视性规则。

在 Microsoft® SQL Server™ 中，如果当前用户拥有的表具有指定名称，则返回该表的列。如果未指定 owner 且当前用户不拥有带指定 name 的表，则该过程查找由数据库所有者拥有的带指定 name 的表。如果存在该表，则返回该表的列。

[@qualifier =] 'qualifier'

是表限定符的名称。qualifier 的数据类型为 sysname，默认设置为 NULL。多种 DBMS 产品支持表的三部分命名方式 (qualifier.owner.name)。在 SQL Server 中，该列表示数据库名。在某些产品中，该列表示表所在数据库环境的服务器名。

[@col_type =] 'col_type'

是列类型。col_type 的数据类型是 char(1)，默认设置为 R。类型 R 返回优化列或列集，该列或列集通过检索列中的值，使得指定表中的任何行可以被唯一标识。列可以是专门为此目的设计的伪列，也可以是表的任何唯一索引的列。类型 V 返回指定表中的列（若有），当行中的值由任何事务更新时，该列由数据源自动更新。

[@scope =] 'scope'

是 ROWID 必需的最小作用域。scope 的数据类型是 char(1)，默认设置为 T。作用域 C 指定只有当 ROWID 位于该行上时才有效。作用域 T 指定 ROWID 对事务有效。

[@nullable =] 'nullable'

表示特殊列能否接受空值。nullable 的数据类型是 char(1)，默认设置为 U。O 指定特殊列不允许空值。U 指定列中可以部分为空。

[@ODBCVer =] 'ODBCVer'

是当前所使用的 ODBC 版本。ODBCVer 的数据类型是 int(4)，默认设置为 2，表示 ODBC 2.0 版。有关 ODBC 2.0 版和 ODBC 3.0 版之间的差异的更多信息，请参见 ODBC 3.0 版的 ODBC SQLSpecialColumns 规范。

返回代码值

无

结果集
列名 | 数据类型 | 描述
SCOPE | smallint | 行 ID 的实际作用域。可以是 0、1 或 2。SQL Server 始终返回 0。该字段始终返回值。 0 = SQL_SCOPE_CURROW。行 ID 只有位于该行上时才能保证有效。如果某行由另一个事务更新或删除，则后来使用该行 ID 重新选择时可能无法返回该行。 1 = SQL_SCOPE_TRANSACTION。行 ID 在当前事务的持续时间内保证有效。 2 = SQL_SCOPE_SESSION。行 ID 在会话（跨事务边界）的持续时间内保证有效。
COLUMN_NAME | sysname | 返回的 table 中每列的列名。该字段始终返回值。
DATA_TYPE | smallint | ODBC SQL 数据类型。
TYPE_NAME | sysname | 数据源相关的数据类型名称，如 char、varchar、money或 text。
PRECISION | Int | 数据源上的列精度。该字段始终返回值。
LENGTH | Int | 数据源中以二进制形式存在的数据类型要求的长度（以字节为单位），例如，10 代表 char(10)，4 代表 integer，2 代表 smallint。
SCALE | smallint | 数据源上列的小数位数。对于小数位数不适用的数据类型返回NULL。
PSEUDO_COLUMN | smallint | 表示列是否是伪列。SQL Server 始终返回 2： 0 = SQL_PC_UNKNOWN 1 = SQL_PC_PSEUDO 2 = SQL_PC_NOT_PSEUDO

注释

在 ODBC 中，sp_special_columns 与 SQLSpecialColumns 等效。返回的结果按 SCOPE 排序。

权限

执行权限默认授予 public 角色。

请参见

系统存储过程


sp_sproc_columns

为当前环境中的单个存储过程或用户定义函数返回列信息。

语法

sp_sproc_columns [[@procedure_name =] 'name']
[,[@procedure_owner =] 'owner']
[,[@procedure_qualifier =] 'qualifier']
[,[@column_name =] 'column_name']
[,[@ODBCVer =] 'ODBCVer']

参数

[@procedure_name =] 'name'

是用于返回目录信息的过程名。name 的数据类型是 nvarchar(390)，默认设置为 %，表示当前数据库中的所有表。不支持通配符模式匹配。

[@procedure_owner =] 'owner'

是过程所有者的名称。owner 的数据类型为 nvarchar(384)，默认设置为 NULL。不支持通配符模式匹配。如果未指定 owner，则应用基础 DBMS 的默认过程可视性规则。

在 Microsoft® SQL Server™ 中，如果当前用户拥有带指定名称的过程，则返回有关该过程的信息。如果未指定 owner 且当前用户不拥有带指定名称的过程，则 sp_sproc_columns 查找由数据库所有者拥有的带指定名称的过程。如果存在该过程，则返回有关该过程的列信息。

[@procedure_qualifier =] 'qualifier'

是过程限定符的名称。qualifier 的数据类型是 sysname，默认设置为 NULL。多种 DBMS 产品支持表的三部分命名方式 (qualifier.owner.name)。在 SQL Server 中，该参数表示数据库名。在某些产品中，该列表示表所在数据库环境的服务器名。

[@column_name =] 'column_name'

是单列并且当只需要目录信息的一列时才使用。column_name 的数据类型是 nvarchar(384)，默认设置为 NULL。如果省略 column_name，则返回所有列。指定的值可以包含使用基础 DBMS 通配符匹配模式的通配符。为获得最大的互操作性，网关客户端应只采用 SQL-92 标准模式匹配（% 和 _ 通配符）。

[@ODBCVer =] 'ODBCVer'

是当前所使用的 ODBC 版本。ODBCVer 的数据类型是 int，默认设置为 2，表示 ODBC 2.0 版。有关 ODBC 2.0 版和 ODBC 3.0 版之间差别的更多信息，请参见 ODBC 3.0 版的 ODBC SQLProcedureColumns 规范。

返回代码值

无

结果集
列名 | 数据类型 | 描述
PROCEDURE_QUALIFIER | sysname | 过程限定符名称。该列可以为 NULL。
PROCEDURE_OWNER | sysname | 过程所有者名称。该列始终返回值。
PROCEDURE_NAME | nvarchar(134) | 过程名。该列始终返回值。
COLUMN_NAME | sysname | 返回的 TABLE_NAME 中每列的列名。该列始终返回值。
COLUMN_TYPE | smallint | 该字段始终返回值： 0 = SQL_PARAM_TYPE_UNKNOWN 1 = SQL_PARAM_TYPE_INPUT 2 = SQL_PARAM_TYPE_OUTPUT 3 = SQL_RESULT_COL 4 = SQL_PARAM_OUTPUT 5 = SQL_RETURN_VALUE
DATA_TYPE | smallint | ODBC 数据类型的整型代码。如果该数据类型不能映射到 SQL-92 类型，则该值为 NULL。本机数据类型名称在 TYPE_NAME 列中返回。
TYPE_NAME | sysname | 数据类型的字符串表示法。这是由基础 DBMS 表示的数据类型名称。
PRECISION | int | 有效数字个数。PRECISION 列的返回值以 10 为基数。
LENGTH | int | 数据的传输大小。
SCALE | smallint | 小数点右边的数字个数。
RADIX | smallint | 是数字类型的基数。
NULLABLE | smallint | 指定为空性： 1 = 可创建允许空值的数据类型 0 = 不允许空值
REMARKS | varchar(254) | 对过程列的描述。SQL Server 不为该列返回值。
COLUMN_DEF | nvarchar(4000) | 列的默认值。
SQL_DATA_TYPE | smallint | SQL 数据类型出现在描述符的 TYPE 字段时的值。该列与 DATA_TYPE 列相同，datetime 和 SQL-92 interval 数据类型除外。该列始终返回值。
SQL_DATETIME_SUB | smallint | 如果 SQL_DATA_TYPE 的值是 SQL_DATETIME 或 SQL_INTERVAL，则为 datetime SQL-92 interval 子代码。对于 datetime 和 SQL-92 interval 以外的数据类型，该字段为 NULL。
CHAR_OCTET_LENGTH | int | character 或 binary 数据类型列的最大长度（以字节为单位）。对于所有其它数据类型，该列返回 NULL。
ORDINAL_POSITION | int | 列在表中的顺序位置。表中的第一列为 1。该列始终返回值。
IS_NULLABLE | varchar(254) | 表中的列是否可以为空。根据 ISO 规则决定是否可以为空。遵从 ISO SQL 标准的 DBMS 无法返回空字符串。 如果列可包含 NULL 则显示 YES，如果列不能包含 NULL 则显示 NO。 如果不知道是否可以为空，该列则返回零长度字符串。 该列返回的值与 NULLABLE 列返回的值不同。
SS_DATA_TYPE | tinyint | 由开放式数据服务扩展存储过程使用的 SQL Server 数据类型。有关更多信息，请参见数据类型。

注释

返回的列属于存储过程的参数或结果集。如果 sp_stored_procedures 为某个存储过程返回的 SP_NUM_PARAMETERS 和 SP_NUM_RESULT_SETS 列为 –1（不确定），则 sp_sproc_columns 不为该存储过程返回行。在 SQL Server 中，只返回有关存储过程的输入和输出参数的列信息。

在 ODBC 中，sp_sproc_columns 与 SQLProcedureColumns 等效。返回的结果按 PROCEDURE_QUALIFIER、PROCEDURE_OWNER、PROCEDURE_NAME 和参数在过程定义内出现的次序排序。

权限

执行权限默认授予 public 角色。

请参见

系统存储过程


sp_srvrolepermission

返回应用于固定服务器角色的权限。

语法

sp_srvrolepermission [[@srvrolename =] 'role']

参数

[@srvrolename =] 'role'

是为其返回权限的固定服务器角色名。role 的数据类型是 sysname，默认设置为 NULL。如果未指定，则返回所有固定服务器角色的权限。role 可以是下列值之一。

值 | 描述
Sysadmin | 系统管理员
Securityadmin | 安全管理员
Serveradmin | 服务器管理员
Setupadmin | 设置管理员
Processadmin | 进程管理员
Diskadmin | 磁盘管理员
Dbcreator | 数据库创建者
Bulkadmin | 可执行 BULK INSERT 语句

返回代码值

0（成功）或 1（失败）

结果集
列名 | 数据类型 | 描述
ServerRole | sysname | 固定服务器角色的名称
Permission | sysname | 与 ServerRole 关联的权限

注释

在内部对应用于固定服务器角色成员的权限进行管理，并且这些权限不是用于管理其它安全帐户类型权限的安全系统的一部分。

列出的权限包括可以执行的 Transact-SQL 语句和固定服务器角色成员执行的其它特殊活动。若要显示固定服务器角色列表，请执行 sp_helpsrvrole。

sysadmin 固定服务器角色具有所有其它固定服务器角色的权限。

权限

执行权限默认授予 public 角色。

示例

下例显示与 sysadmin 固定服务器角色关联的权限。

EXEC sp_srvrolepermission 'sysadmin'

请参见

sp_addsrvrolemember

sp_dropsrvrolemember

sp_helpsrvrole

系统存储过程


sp_start_job

指示 SQL Server 代理程序立即执行作业。

语法

sp_start_job [@job_name =] 'job_name' | [@job_id =] job_id
[,[@error_flag =] error_flag]
[,[@server_name =] 'server_name']
[,[@step_name =] 'step_name']
[,[@output_flag =] output_flag]

参数

[@job_name =] 'job_name'

是要启动的作业名。必须指定 job_id 或 job_name 两者之一，但不能同时指定两者。job_name 的数据类型为 sysname，默认设置为 NULL。

[@job_id =] job_id

是要启动的作业标识号。必须指定 job_id 或 job_name 两者之一，但不能同时指定两者。job_id 的数据类型为 uniqueidentifier，默认设置为 NULL。

[@error_flag =] error_flag

保留。

[@server_name =] 'server_name'

是要启动作业的目标服务器。server_name 的数据类型是 nvarchar(30)，默认设置为 NULL。server_name 必须是作业当前的目标服务器之一。

[@step_name =] 'step_name'

是开始执行作业的步骤名。只适用于本地作业。step_name 的数据类型是 sysname，默认设置为 NULL。

[@output_flag =] output_flag

保留。

返回代码值

0（成功）或 1（失败）

结果集

无

权限

执行权限默认授予 msdb 数据库中的 public 角色。可执行此存储过程而且是 sysadmin 固定角色成员的用户可以启动任何作业。不是 sysadmin 角色成员的用户使用 sp_start_job 只能启动他/她所拥有的作业。

当 sysadmin 固定服务器角色成员的用户唤醒调用 sp_start_job 时，sp_start_job 将在 SQL Server 服务正在其中运行的安全上下文中执行。当用户不是 sysadmin 固定服务器角色的成员时，sp_start_job 将模拟 SQL Server 代理代理帐户，而该帐户是通过 xp_sqlagent_proxy_account 指定的。如果代理帐户不可用，则 sp_start_job 将失败。只有 Microsoft® Windows NT® 4.0 和 Windows 2000 有上述情况。在 Windows 9.x 上没有模拟，而且 sp_start_job 总是在启动 SQL Server 的 Windows 9.x 用户的安全上下文中执行。

示例

下例启动名为 Nightly Backup 的作业。

USE msdb
EXEC sp_start_job @job_name = 'Nightly Backup'

请参见

sp_delete_job

sp_help_job

sp_stop_job

sp_update_job

系统存储过程


sp_statistics

返回指定的表或索引视图上的所有索引以及统计的列表。

语法

sp_statistics [@table_name =] 'table_name'
[,[@table_owner =] 'owner']
[,[@table_qualifier =] 'qualifier']
[,[@index_name =] 'index_name']
[,[@is_unique =] 'is_unique']
[,[@accuracy =] 'accuracy']

参数

[@table_name =] 'name'

指定用于返回目录信息的表。table_name 的数据类型是 sysname，没有默认设置。不支持通配符模式匹配。

[@table_owner =] 'owner'

是用于返回目录信息的表所有者名称。table_owner 的数据类型是 sysname，默认设置为 NULL。不支持通配符模式匹配。如果未指定 owner，则应用基础 DBMS 的默认表可视性规则。

在 Microsoft® SQL Server™ 中，如果当前用户拥有带指定名称的表，则返回该表的索引。如果未指定 owner 且当前用户不拥有带指定 name 的表，则该过程查找由数据库所有者拥有的带指定 name 的表。如果存在这样的表，则返回该表的索引。

[@table_qualifier =] 'qualifier'

是表限定符的名称。qualifier 的数据类型为 sysname，默认设置为 NULL。多种 DBMS 产品支持表的三部分命名方式 (qualifier.owner.name)。在 SQL Server 中，该参数表示数据库名。在某些产品中，该列表示表所在数据库环境的服务器名。

[@index_name =] 'index_name'

是索引名。index_name 的数据类型是 sysname，默认设置为 %。

[@is_unique =] 'is_unique'

表示是否只返回唯一索引（如果是 Y）。is_unique 的数据类型是 char(1)，默认设置为 N。

[@accuracy =] 'accuracy'

是统计的基数和页准确度级别。accuracy 的数据类型为 char(1)，默认设置为 Q。指定 E 可确保更新统计以使基数和页都是准确的。

结果集
列名 | 数据类型 | 描述
TABLE_QUALIFIER | sysname | 表限定符名称。该字段可以为 NULL。
TABLE_OWNER | sysname | 表所有者名称。该字段始终返回值。
TABLE_NAME | sysname | 表名。该字段始终返回值。
NON_UNIQUE | smallint | NOT NULL。 0 = 唯一 1 = 不唯一
INDEX_QUALIFIER | sysname | 索引所有者名称。某些 DBMS 产品允许表所有者以外的用户创建索引。在 SQL Server 中，该列始终和 TABLE_NAME 相同。
INDEX_NAME | sysname | 是索引名。该字段始终返回值。
TYPE | smallint | 该字段始终返回值。SQL Server 返回 0、1、2 或 3： 0 = 表的统计 1 = 聚集 2 = 哈希 3 = 其它
SEQ_IN_INDEX | smallint | 列在索引内的位置。
COLUMN_NAME | sysname | 返回的 TABLE_NAME 中每列的列名。该字段始终返回值。
COLLATION | char(1) | 用于排序规则的次序。SQL Server 始终返回 A。可以是： A = 升序 D = 降序 NULL = 不适用
CARDINALITY | int | 表内的行数或索引内的唯一值个数。
PAGES | int | 存储索引或表的页数。
FILTER_CONDITION | varchar(128) | SQL Server 不返回值。

返回代码值

无

注释

结果集内的索引按 NON_UNIQUE、TYPE、INDEX_NAME 和 SEQ_IN_INDEX 列排序的升序出现。

聚集索引类型引用按该索引的次序存储表数据的索引。这相当于 SQL Server 聚集索引。

哈希索引类型接受完全匹配或范围搜索，但模式匹配搜索不使用索引。

在 ODBC 中，sp_statistics 与 SQLStatistics 等效。返回的结果按 NON_UNIQUE、TYPE、INDEX_QUALIFIER、INDEX_NAME 和 SEQ_IN_INDEX 排序。

权限

执行权限默认授予 public 角色。

请参见

系统存储过程


sp_stop_job

命令 SQLServerAgent 停止执行作业。

语法

sp_stop_job [@job_name =] 'job_name'
| [@job_id =] job_id
| [@originating_server =] 'master_server'
| [@server_name =] 'target_server'

参数

[@job_name =] 'job_name'

是要停止的作业名。job_name 的数据类型是 sysname，默认设置为 NULL。

[@job_id =] job_id

是要停止的作业标识号。job_id 的数据类型是 uniqueidentifier，默认设置为 NULL。

[@originating_server =] 'master_server'

是主服务器名。如果指定，则停止所有的多服务器作业。master_server 的数据类型是 nvarchar(30)，默认设置为 NULL。只有在目标服务器上调用 sp_stop_job 时才指定该参数。

说明 只能指定前三个参数之一。

[@server_name =] 'target_server'

是要停止多服务器作业的特定目标服务器名。target_server 的数据类型是 nvarchar(30)，默认设置为 NULL。只有在主服务器上对多服务器作业调用 sp_stop_job 时才指定该参数。

返回代码值

0（成功）或 1（失败）

结果集

无

注释

如果作业当前正在执行 CmdExec 类型的步骤，则将强行过早结束正在运行的进程（如 MyProgram.exe）。过早结束会导致不可预知的行为，如进程正在使用的文件保持打开。因此，如果作业包含 CmdExec 类型的步骤，应该只在没有办法的情况下才使用 sp_stop_job。

权限

执行权限默认授予 msdb 数据库中的 public 角色。可执行此存储过程而且是 sysadmin 固定角色成员的用户可以停止任何作业。不是 sysadmin 角色成员的用户使用 sp_stop_job 只能停止他/她所拥有的作业。

当 sysadmin 固定服务器角色成员的用户唤醒调用 sp_stop_job 时，sp_stop_job 将在 SQL Server 服务正在其中运行的安全上下文中执行。当用户不是 sysadmin 组的成员时，sp_stop_job 将模拟 SQL Server 代理代理帐户，而该帐户是通过 xp_sqlagent_proxy_account 指定的。如果代理帐户不可用，则 sp_stop_job 将失败。只有 Microsoft® Windows NT® 4.0 和 Windows 2000 有上述情况。在 Windows 9.x 上没有模拟，而且 sp_stop_job 总是在启动 SQL Server 的 Windows 9.x 用户的安全上下文中执行。

示例

下例停止名为 Archive Tables 的作业。

USE msdb
EXEC sp_stop_job @job_name = 'Archive Tables'

请参见

sp_delete_job

sp_help_job

sp_start_job

sp_update_job

系统存储过程


sp_stored_procedures

返回当前环境中的存储过程列表。

语法

sp_stored_procedures [[@sp_name =] 'name']
[,[@sp_owner =] 'owner']
[,[@sp_qualifier =] 'qualifier']

参数

[@sp_name =] 'name'

是用于返回目录信息的过程名。name 的数据类型是 nvarchar(390)，默认设置为 NULL。支持通配符模式匹配。

[@sp_owner =] 'owner'

是过程所有者的名称。owner 的数据类型为 nvarchar(384)，默认设置为 NULL。支持通配符模式匹配。如果未指定 owner，则应用基础 DBMS 的默认过程可视性规则。

在 Microsoft® SQL Server™ 中，如果当前用户拥有带指定名称的过程，则返回该过程。如果未指定 owner 且当前用户不拥有带指定 name 的过程，则该过程查找由数据库所有者拥有的带指定 name 的过程。如果存在这样的过程，则返回该过程。

[@qualifier =] 'qualifier'

是过程限定符的名称。qualifier 的数据类型是 sysname，默认设置为 NULL。多种 DBMS 产品支持表的三部分命名方式 (qualifier.owner.name)。在 SQL Server 中，该列表示数据库名。在某些产品中，该列表示表所在数据库环境的服务器名。

返回代码值

无

结果集
列名 | 数据类型 | 描述
PROCEDURE_QUALIFIER | sysname | 过程限定符名称。该字段可以为 NULL。
PROCEDURE_OWNER | sysname | 过程所有者名称。该字段始终返回值。
PROCEDURE_NAME | nvarchar(134) | 过程名。该字段始终返回值。
NUM_INPUT_PARAMS | int | 留作以后使用。
NUM_OUTPUT_PARAMS | int | 留作以后使用。
NUM_RESULT_SETS | int | 留作以后使用。
REMARKS | varchar(254) | 对过程的描述。SQL Server 不为该列返回值。
PROCEDURE_TYPE | smallint | 过程类型。SQL Server 始终返回 2.0。可以是： 0 = SQL_PT_UNKNOWN 1 = SQL_PT_PROCEDURE 2 = SQL_PT_FUNCTION

注释

为获得最大的互操作性，网关客户端应只采用 SQL-92 标准模式匹配（% 和 _ 通配符）。

由于不就当前用户对特定存储过程执行访问的特权信息进行必要的检查，因此访问得不到保障。注意只使用三部分命名方式，因此在 SQL Server 上执行该过程时，只返回本地存储过程，不返回远程存储过程（这类过程需要四部分命名方式）。如果 sp_server_info 的结果集中的服务器特性 ACCESSIBLE_SPROC 为 Y，则只返回可由当前用户执行的存储过程。

在 ODBC 中，sp_stored_procedures 与 SQLProcedures 等效。返回的结果按 PROCEDURE_QUALIFIER、PROCEDURE_OWNER 和 PROCEDURE_NAME 排序。

权限

执行权限默认授予 public 角色。

请参见

系统存储过程


sp_table_privileges

为指定表返回表权限（如 INSERT、DELETE、UPDATE、SELECT、REFERENCES）的列表。

语法

sp_table_privileges [ @table_name_pattern = ] 'table_name_pattern'
[ , [ @table_owner_pattern = ] 'table_owner_pattern' ]
[ , [ @table_qualifier = ] 'table_qualifier' ]

参数

[@table_name =] 'table_name'

用来返回目录信息的表。table_name_pattern 的数据类型为 nvarchar(384)，没有默认值。支持通配符模式匹配。

[@table_owner_pattern =] 'table_owner_pattern'

用来返回目录信息的表的所有者。table_owner_pattern 的数据类型为 nvarchar(384)，默认值为 NULL。支持通配符模式匹配。如果没有指定 owner，则采用基础 DBMS 默认的表可视性规则。

在 Microsoft® SQL Server™ 中，如果当前用户拥有的表具有指定名称，则返回该表的列。如果没有指定 owner，且当前用户未拥有具有指定 name 的表，该程序将寻找数据库所有者拥有的具有指定 table_name_pattern 的表。如果有，则返回该表的列。

[@table_qualifier =] 'table_qualifier'

表限定符的名称。table_qualifier 的数据类型为 sysname，默认值为 NULL。多种 DBMS 产品支持表的三部分命名方式 (qualifier.owner.name)。在 SQL Server 中，该列表示数据库名。在某些产品中，该列表示表所在数据库环境的服务器名。

返回代码值

无

结果集
列名 | 数据类型 | 描述
TABLE_QUALIFIER | sysname | 表限定符名称。在 SQL Server 中，该列表示数据库名。该字段可以为 NULL。
TABLE_OWNER | sysname | 表所有者名称。该字段始终返回值。
TABLE_NAME | sysname | 表名。该字段始终返回值。
GRANTOR | sysname | 已向所列的 GRANTEE 授予对 TABLE_NAME 的权限的数据库用户名。在 SQL Server 中，该列总是和 TABLE_OWNER 相同。该字段始终返回值。同样，GRANTOR 列可能是数据库所有者 (TABLE_OWNER)，或由数据库所有者使用 GRANT 语句的 WITH GRANT OPTION 子句授权的用户。
GRANTEE | sysname | 由所列的 GRANTOR 授予了对 TABLE_NAME 的权限的数据库用户名在 SQL Server 中，该列总是包括来自 sysusers 表的数据库用户。该字段始终返回值。
PRIVILEGE | sysname | 一个可用的表权限。表权限可以是下列值之一（或在定义了执行之后数据源所支持的其它值）：SELECT = GRANTEE 可为一列或多列检索数据。 INSERT = GRANTEE 可为一列或多列的新行提供数据。 UPDATE = GRANTEE 可为一列或多列修改现有数据。 DELETE = GRANTEE 可从表中删除行。 REFERENCES = GRANTEE 可以引用主键/外键关系中外表中的列。在 SQL Server 中，主键/外键关系由表约束定义。 由特定表特权给予 GRANTEE 的作用域是由数据源决定的。例如，UPDATE 特权可能允许 GRANTEE 更新一个数据源的表中的所有列，而只允许 GRANTOR 更新另一数据源中它具有 UPDATE 特权的特定列。
IS_GRANTABLE | sysname | 说明 GRANTEE 是否可以对其他用户授予权限（经常称为"获权后授权"(grant with grant) 权限）。可以是 YES、NO 或 NULL。未知的（或 NULL）值引用不能使用"授予再授予 (grant with grant)"的数据源。

注释

sp_table_privileges 存储程序与 ODBC 中的 SQLTablePrivileges 等同。返回结果按 TABLE_QUALIFIER、TABLE_OWNER、TABLE_NAME 和 PRIVILEGE 顺序排列。

权限

执行权限默认授予 public 角色。

示例

下例返回所有这样的表的特权信息：表名以单词 sales 开头，由所有者名称以 janet 开头的用户拥有，来自名称以 LONDON 开头的所有服务器。

USE master
EXEC sp_table_privileges 'LONDON%', 'janet%', 'sales%'

请参见

系统存储过程


sp_table_privileges_ex

返回来自指定链接服务器的指定表的特权信息。

语法

sp_table_privileges_ex [ @table_server = ] 'table_server'
[ , [ @table_name = ] 'table_name' ]
    [ , [ @table_schema = ] 'table_schema' ]
    [ , [ @table_catalog = ] 'table_catalog' ]

参数

[@table_server =] 'table_server'

要返回其信息的链接服务器的名称。table_server 的数据类型为 sysname，没有默认值。

[@table_name =] 'table_name'

表的名称，将提供该表的特权信息。table_name 的数据类型为 sysname，默认值为 NULL。

[@table_schema =] 'table_schema'

是表架构，在某些 DBMS 环境下是表所有者。table_schema 的数据类型为 sysname，默认值为 NULL。

[@table_catalog =] 'table_catalog'

指定 table_name 所在数据库的名称。table_catalog 的数据类型为 sysname，默认值为 NULL。

返回代码值

无

结果集
列名 | 数据类型 | 描述
TABLE_CAT | sysname | 表限定符名称。多种 DBMS 产品支持表的三部分命名方式 (qualifier.owner.name)。在 SQL Server 中，该列表示数据库名。在某些产品中，该列表示表所在数据库环境的服务器名。该字段可以为 NULL。
TABLE_SCHEM | sysname | 表所有者名称。在 SQL Server 中，该列表示创建表的数据库用户的姓名。该字段始终返回值。
TABLE_NAME | sysname | 表名。该字段始终返回值。
GRANTOR | sysname | 已向所列的 GRANTEE 授予对 TABLE_NAME 的权限的数据库用户名。在 SQL Server 中，该列总是和 TABLE_OWNER 相同。该字段始终返回值。同样，GRANTOR 列可能是数据库所有者(TABLE_OWNER)，或由数据库所有者使用 GRANT 命令的 WITH GRANT OPTION 子句授权的用户。
GRANTEE | sysname | 由所列的 GRANTOR 授予了对 TABLE_NAME 的权限的数据库用户名该字段始终返回值。
PRIVILEGE | varchar(32) | 一个可用的表权限。表权限可以是下列值之一（或在定义了执行之后数据源所支持的其它值）： SELECT = GRANTEE 可为一列或多列检索数据。 INSERT = GRANTEE 可为一列或多列的新行提供数据。 UPDATE = GRANTEE 可为一列或多列修改现有数据。 DELETE = GRANTEE 可从表中删除行。 REFERENCES = GRANTEE 可以引用主键/外键关系中外表中的列。在 SQL Server 中，主键/外键关系由表约束定义。 由特定表特权给予 GRANTEE 的作用域是由数据源决定的。例如，UPDATE 特权可能允许 GRANTEE 更新一个数据源的表中的所有列，而只允许 GRANTOR 更新另一数据源中它具有 UPDATE 特权的特定列。
IS_GRANTABLE | varchar(3) | 说明 GRANTEE 是否可以对其他用户授予权限（经常称为"获权后授权"(grant with grant) 权限）。可以是 YES、NO 或 NULL。未知的（或 NULL）值指向不适用"获权后授权"的数据源。

注释

返回结果按 TABLE_QUALIFIER、TABLE_OWNER、TABLE_NAME 和 PRIVILEGE 顺序排列。

权限

执行权限默认授予 public 角色。

示例

该例返回表 Customers 的特权信息，该表由 dbo 所有，来自指定链接服务器（以 SQL Server 为链接服务器）中的 Northwind 数据库。

EXEC sp_table_privileges_ex London1, Customers, dbo, Northwind

请参见

sp_column_privileges_ex


sp_tableoption

为用户定义表设置选项值。sp_tableoption 可以用来在具有 text、ntext 或 image 列的表上启用 text in row 功能。

语法

sp_tableoption [ @TableNamePattern = ] 'table'
, [ @OptionName = ] 'option_name'
, [ @OptionValue = ] 'value'

参数

[@TableNamePattern =] 'table'

是限定的或非限定的用户定义数据库表的名称。如果提供了一个完全限定的表名，包括数据库名，那么该数据库名必须是当前数据库的名称。多个表的表选项的设置不能一次完成。table_pattern 的数据类型为 nvarchar(776)，没有默认设置。

[@OptionName =] 'option_name'

是表选项名。option_name 的数据类型为 varchar(35)，默认设置不是 NULL。option_name 可以有下列值。

值 | 描述
pintable | 当禁用时（默认值），它将表标记为不再驻留内存。启用时，将表标记为驻留内存。
table lock on bulk load | 禁用时（默认值），用户定义表的大容量处理获得行锁。启用时，用户定义表的大容量处理获得大容量更新锁。
insert row lock | Microsoft® SQL Server™ 2000 中不支持该值。 对于 SQL Server 6.5 版而言，在指定表上启用或禁用插入行锁定 (IRL) 操作。在 SQL Server 7.0 中，行级锁定默认为启用。SQL Server 的锁定策略为行锁定，并可能提升为页或表锁定。这个选项并不改变 SQL Server 的加锁行为（它没有影响），包含它只是为了与现有脚本和过程兼容。
text in row | 当为 OFF 或 0（禁用，默认值）时，它不更改当前行为，且在行中不存在 BLOB。 指定该值且 @OptionValue 为 ON（已启用）或从 24 到 7000 的整数值时，直接在数据行中存储新的 text、ntext 或 image 字符串。更新 BLOB 值时，所有现有的 BLOB（text、ntext 或 image 数据）都将更改成 text in row 格式。有关更多信息，请参见注释部分。

[ , [ @OptionValue = ] 'value' ]

表示是启用 option_name（true、on 或 1）还是禁用 option_name（false、off 或 0）。value 的数据类型为 varchar(12)，没有默认设置。value 不区分大小写。

对于 text in row 选项，有效选项值是 0、on、off，或从 24 到 7000 的整数。当 value 为 on 时，默认的限制为 256 字节。

返回代码值

0（成功）或错误号（失败）

注释

sp_tableoption 仅可用于设置用户定义表的选项值。若要显示表属性，请使用 OBJECTPROPERTY。

sp_tableoption 的 text in row 选项只能在含有文本列的表中启用或禁用。若表不含文本列，SQL Server 将产生错误。

当启用 text in row 选项时，@OptionValue 参数使用户得以指定存储在行中的 BLOB（二进制大对象：text、ntext 或 image 数据）的最大值。默认设置是 256 字节，但是行中的值可以在 24 到 7000 字节范围内变化。

如果应用下列条件，则将 text、ntext 或 image 字符串存储在数据行中：

  1. 启用 text in row。

  2. 字符串的长度比 @OptionValue 所指定的限制短

  3. 数据行中有足够的可用空间。

当 BLOB 字符串存储在数据行中时，读取和写入 text、ntext 或 image 字符串可以与读取或写入字符串和二进制字符串一样快。SQL Server 不必访问单独的页以读取或写入 BLOB 字符串。

如果 text、ntext 或 image 字符串比行中所指定的限制或可用空间大，则将指针存储在该行中。在行中存储 BLOB 字符串的条件仍然适用，但是：数据行中必须有足够的空间容纳指针。

将存储在表行中的 BLOB 字符串和指针视为类似于可变长度的字符串。SQL Server 仅使用存储字符串或指针所需的字节数。

首先启用 text in row 时，不立即转换现有的 BLOB 字符串。仅当更新字符串时才转换它们。同样，text in row 选项限制增加时，将不转换已在数据行中的 text、ntext 或 image 字符串以遵从新限制，直到更新它们。

说明 禁用 text in row 选项或减小该选项的限制将需要转换所有的 BLOB，因此进程可能较长，这取决于必须转换的 BLOB 字符串数。在执行转换进程的过程中锁定表。

一个 table 变量，包括返回 table 变量的函数，自动启用 text in row 选项，并具备 256 字节的 inline limit 默认值。这一选项不可更改。

text in row 支持 TEXTPTR、WRITETEXT、UPDATETEXT 和 READTEXT 函数。用户可以使用 SUBSTRING() 函数读取 BLOB 的部分，但是必须记住，行内文本指针与其它文本指针相比有不同的有效期和个数限制。有关更多信息，请参见管理 ntext、text 和 image 数据。

权限

只有 sysadmin 固定服务器角色的成员可以修改表选项 pintable。

sysadmin 固定服务器角色成员，db_owner 和 db_ddladmin 固定数据库角色成员以及表所有者，都可以修改任何用户定义表的 table lock on bulk load 和 text in row 选项。其他用户只能修改自己拥有的表的选项。

示例
A. 启用 Northwind 数据库中表 'orders' 的 'text in row' 选项。
EXEC sp_tableoption 'orders', 'text in row', 'ON'
B. 启用 Northwind 数据库中表 'orders' 的 'text in row' 选项，并将 inline limit 设置为 1000。
EXEC sp_tableoption 'orders', 'text in row', '1000'
C. 启用 Northwind 数据库中表 'orders' 的 'text in row' 选项，并将 inline limit 设置为 23，这已超出允许范围。
sp_tableoption 'orders', 'text in row', '23'

会产生错误信息，提示参数超出范围。

D. 禁用 Northwind 数据库中表 'orders' 的 'text in row' 选项。
EXEC sp_tableoption 'orders', 'text in row', 'off'

-或-

EXEC sp_tableoption 'orders', 'text in row', '0'

请参见

DBCC PINTABLE

DBCC UNPINTABLE

OBJECTPROPERTY

系统存储过程


sp_tables

返回当前环境下可查询的对象的列表（任何可出现在 FROM 子句中的对象）。

语法

sp_tables [ [ @table_name = ] 'name' ]
    [ , [ @table_owner = ] 'owner' ]
    [ , [ @table_qualifier = ] 'qualifier' ]
    [ , [ @table_type = ] "type" ]

参数

[@table_name =] 'name'

用来返回目录信息的表。name 的数据类型为 nvarchar(384)，默认值为 NULL。支持通配符模式匹配。

[@table_owner =] 'owner'

用来返回目录信息的表的所有者。owner 的数据类型为 nvarchar(384)，默认值为 NULL。支持通配符模式匹配。如果没有指定 owner，则采用基础 DBMS 默认的表可视性规则。

在 Microsoft® SQL Server™ 中，如果当前用户拥有的表具有指定名称，则返回该表的列。如果未指定所有者，且当前用户未拥有指定名称的表，则该过程查找由数据库所有者拥有的具有指定名称的表。如果有，则返回该表的列。

[@table_qualifier =] 'qualifier'

是表限定符的名称。qualifier 的数据类型为 sysname，默认设置为 NULL。多种 DBMS 产品支持表的三部分命名方式 (qualifier.owner.name)。在 SQL Server 中，该列表示数据库名。在某些产品中，该列表示表所在数据库环境的服务器名。

[,[@table_type =] "'type'"]

值的列表，由逗号分隔，它给出指定表类型的所有表的有关信息，包括 TABLE、SYSTEM TABLE 和 VIEW。type 的数据类型为 varchar(100)，默认值为 NULL。

说明 每个表类型都必须用单引号括起来，整个参数必须用双引号括起来。表类型必须大写。如果 SET QUOTED_IDENTIFIER 为 ON，那么每个单引号必须换成双引号，整个参数必须用单引号括起来。

返回代码值

无

结果集
列名 | 数据类型 | 描述
TABLE_QUALIFIER | sysname | 表限定符名称。在 SQL Server 中，该列表示数据库名。该字段可以为 NULL。
TABLE_OWNER | sysname | 表所有者名称。在 SQL Server 中，该列表示创建表的数据库用户的姓名。该字段始终返回值。
TABLE_NAME | sysname | 表名。该字段始终返回值。
TABLE_TYPE | varchar(32) | 表、系统表或视图。
REMARKS | varchar(254) | SQL Server 不为该列返回值。

注释

为达到最大互操作性，网关客户应假定只有 SQL-92 标准的 SQL 模式匹配（% 和 _ 通配符）。

并不总是检验有关当前用户对特定表的读写特权信息，因此不能确保访问。这个结果集不仅包含表和视图，还包含网关的同名和别名，这些网关通往支持这些类型的 DBMS 产品。如果在 sp_server_info 的结果集中，服务器特性 ACCESSIBLE_TABLES 是 Y，则只返回当前用户可访问的表。

sp_tables 与 ODBC 中的 SQLTables 等同。返回结果按 TABLE_TYPE、TABLE_QUALIFIER、TABLE_OWNER 和 TABLE_NAME 顺序排列。

权限

执行权限默认授予 public 角色。

示例
A. 返回可在当前环境中查询的对象的列表
EXEC sp_tables
B. 返回 Company 数据库中表 syscolumns 的有关信息
EXEC sp_tables syscolumns, dbo, Company, "'SYSTEM TABLE'"


sp_tables_ex

返回有关指定链接服务器中表的表信息。

语法

[@table_server =] 'table_server'
[ , [ @table_name = ] 'table_name' ]
    [ , [ @table_schema = ] 'table_schema' ]
[ , [ @table_catalog = ] 'table_catalog' ]
[ , [ @table_type = ] 'table_type' ]

参数

[@table_server =] 'table_server'

链接服务器的名称，将为该服务器返回表信息。table_server 的数据类型为 sysname，无默认值。

[ , [ @table_name = ] 'table_name' ]

表的名称，将返回该表的数据类型信息。table_name 的数据类型为 sysname，默认值为 NULL。

[@table_schema =] 'table_schema'

表架构。table_schema 的数据类型为 sysname，默认值为 NULL。

[@table_catalog =] 'table_catalog'

指定 table_name 所在数据库的名称。table_catalog 的数据类型为 sysname，默认值为 NULL。

[@table_type =] 'table_type'

返回的表的类型。table_type 的数据类型为 sysname，默认值为 NULL，并可取下列某一个值。

值 | 描述
ALIAS | 别名。
GLOBAL TEMPORARY | 系统范围内可用的临时表名。
LOCAL TEMPORARY | 只限当前任务可用的临时表名。
SYNONYM | 同义词名。
SYSTEM TABLE | 系统表名。
TABLE | 用户表名。
VIEW | 视图名。

返回代码值

无

结果集
列名 | 数据类型 | 描述
TABLE_CAT | sysname | 表限定符名称。多种 DBMS 产品支持表的三部分命名方式 (qualifier.owner.name)。在 SQL Server 中，该列表示数据库名。在某些产品中，该列表示表所在数据库环境的服务器名。该字段可以为 NULL。
TABLE_SCHEM | sysname | 表所有者名称。在 SQL Server 中，该列表示创建表的数据库用户的姓名。该字段始终返回值。
TABLE_NAME | sysname | 表名。该字段始终返回值。
TABLE_TYPE | varchar(32) | 表、系统表或视图。
REMARKS | varchar(254) | SQL Server 不为该列返回值。

注释

执行 sp_tables_ex 时，将查询与 table_server 对应的 OLE DB 提供程序的 IDBSchemaRowset 接口的 TABLES 行集。table_name、table_schema、table_catalog 和 column 参数传递到此接口，用以限制返回的行。

如果指定的链接服务器的 OLE DB 提供程序不支持 IDBSchemaRowset 接口的 TABLES 行集，则 sp_tables_ex 返回一个空的结果集。

权限

执行权限默认授予 public 角色。

示例

下例返回链接服务器 LONDON2 上 pubs 数据库中的 titles 表的表信息。

USE master
EXEC sp_tables_ex 'LONDON2', 'titles', 'dbo', 'pubs', NULL

请参见

sp_catalogs

sp_columns_ex

sp_column_privileges

sp_foreignkeys

sp_indexes

sp_linkedservers

sp_table_privileges

系统存储过程


sp_trace_create

创建跟踪定义。新的跟踪将处于停止状态。

语法

sp_trace_create [ @traceid = ] trace_id OUTPUT
, [ @options = ] option_value
, [ @tracefile = ] 'trace_file'
[ , [ @maxfilesize = ] max_file_size ]
[ , [ @stoptime = ] 'stop_time' ]

参数

[ @traceid = ] trace_id

是 Microsoft® SQL Server™ 2000 分配给新跟踪的编号。将忽略任何用户提供的输入。trace_id 的数据类型为 int，默认设置为 NULL。用户使用 trace_id 值识别、修改并控制存储过程所定义的跟踪。

[ @options = ] option_value

指定为跟踪设置的选项。option_value 的数据类型为 int，没有默认设置。用户可以通过指定所选出的选项的和值选择这些选项的组合。例如，若要打开 TRACE_FILE_ROLLOVER 和 SHUTDOWN_ON_ERROR 选项，请指定 option_value 为 6。

下表列出了选项、说明和选项值。

选项名 | 选项值 | 描述
TRACE_PRODUCE_ROWSET | 1 | 指定跟踪将生成行集。
TRACE_FILE_ROLLOVER | 2 | 指定当达到 max_file_size 时，将关闭当前跟踪文件并创建新文件。所有新记录都将写入新文件。新文件将与前一个文件同名，但是在文件名后将附加一个整数以表示其序列。例如，如果命名原始跟踪文件为 filename.trc，则命名下个跟踪文件为 filename_1.trc，命名再下一个跟踪文件为 filename_2.trc，等等。 随着创建了更多的翻转跟踪文件，附加到文件名的整数值继续增加。 如果指定该选项时未指定 max_file_size 的值，则 SQL Server 使用 max_file_size 的默认值 (5 MB)。
SHUTDOWN_ON_ERROR | 4 | 指定无论任何原因，如果不能将跟踪写入文件，则 SQL Server 将关闭。执行安全审核跟踪时，该选项很有用。
TRACE_PRODUCE_BLACKBOX | 8 | 指定服务器产生的最后 5 MB 跟踪信息记录将由服务器保存。TRACE_PRODUCE_BLACKBOX 与所有其它选项不兼容。

[ @tracefile = ] 'trace_file'

指定跟踪将写入的位置和文件名。trace_file 的数据类型为 nvarchar (245)，没有默认设置。trace_file 可以是本地目录（如 N 'C:\MSSQL\Trace\trace.trc'），也可以是到共享或路径 (N'\\Servername\Sharename\Directory\trace.trc') 的 UNC。

SQL Server 会将 .trc 扩展名附加到所有的跟踪文件名。如果已指定 TRACE_FILE_ROLLOVER 选项和 max_file_size，则当原始跟踪文件增长到其最大值时，SQL Server 将创建新的跟踪文件。新文件与原始文件同名，但是在其后附加 _n 以表示它的序列，序列从 1 开始。例如，如果第一个跟踪文件名为 filename.trc，则命名第二个跟踪文件为 filename_1.trc。

在使用 TRACE_PRODUCE_BLACKBOX 选项时无法指定 trace_file。

[ @maxfilesize = ] max_file_size

指定跟踪文件可以增长到的最大文件大小（以 MB 为单位）。max_file_size 的数据类型为 bigint，默认设置为 5。

如果指定该参数时未带有 TRACE_FILE_ROLLOVER 选项，则当使用的磁盘空间超过 max_file_size 所指定的空间量时跟踪停止对文件的记录。

[ @stoptime = ] 'stop_time'

指定将停止跟踪文件的日期和时间。stop_time 的数据类型为 datetime，默认设置为 NULL。如果为 NULL，则跟踪将一直运行，直到手动地停止它或服务器关闭。

如果同时指定 stop_time 和 max_file_size，但不指定 TRACE_FILE_ROLLOVER，则当达到指定停止时间或最大文件大小时跟踪将停止。如果同时指定了 stop_time、max_file_size 和 TRACE_FILE_ROLLOVER，并假设跟踪未填满驱动器，则跟踪将在指定停止时间停止。

返回代码值

下表描述在存储过程完成之后用户可能获得的代码值。

返回代码 | 描述
0 | 没有错误。
1 | 未知错误。
10 | 无效选项。指定的选项不兼容时返回。
12 | 文件未创建。
13 | 内存不足。在没有足够内存执行指定的操作时返回此代码。
14 | 无效停止时间。在指定的停止时间已发生时返回此代码。
15 | 参数无效。在用户已提供不兼容的参数时返回此代码。

注释

sp_trace_create 是一个 Microsoft SQL Server 2000 存储过程，它执行以前由 SQL Server 早期版本中使用的 xp_trace_* 扩展存储过程执行的许多操作。使用 sp_trace_create，而不使用：

  • xp_trace_addnewqueue

  • xp_trace_setqueuecreateinfo

  • xp_trace_setqueuedestination

sp_trace_create 只创建跟踪定义。该存储过程不能用于启动或更改跟踪。

严格地键入所有 SQL 跟踪存储过程 (sp_trace_xx) 的参数。如果没有用正确的输入参数数据类型（与在参数说明中指定的相同）调用这些参数，则存储过程将返回错误。

权限

只有 sysadmin 固定服务器角色成员才能执行 sp_trace_create。

示例

请参见

sp_trace_generateevent

sp_trace_setevent

sp_trace_setfilter

sp_trace_setstatus


sp_trace_generateevent

创建用户定义事件。

语法

sp_trace_generateevent [ @eventid = ] event_id
 [ , [ @userinfo = ] 'user_info' ]
 [ , [ @userdata = ] user_data ]

参数

[ @eventid = ] event_id

是要打开的事件 ID。event_id 的数据类型为 int，没有默认设置。此 ID 必须是事件号 82 至 91 中的一个，它表示用 sp_trace_setevent 设置的用户定义事件。

[ @userinfo = ] 'user_info'

是识别事件原因的可选的用户定义字符串。user_info 的数据类型为 nvarchar(128)，默认设置为 NULL。

[ @userdata = ] user_data

是用于事件的可选的用户指定数据。user_data 的数据类型为 varbinary(8000)，默认设置为 NULL。

返回代码值

下表描述在存储过程完成之后用户可能获得的代码值。

返回代码 | 描述
0 | 没有错误。
1 | 未知错误。
3 | 指定的事件无效。该事件可能不存在或者它不适用于此存储过程。
13 | 内存不足。在没有足够内存执行指定的操作时返回此代码。

注释

sp_trace_generateevent 是一个 Microsoft SQL Server 2000 存储过程，它执行以前由 SQL Server 早期版本中使用的 xp_trace_* 扩展存储过程执行的许多操作。使用 sp_trace_generateevent 而不使用 xp_trace_generate_event。

只有用户定义事件的 ID 号可用于 sp_trace_generateevent中。如果使用其它事件 ID 号，则 SQL Server 将产生错误。

严格地键入所有 SQL 跟踪存储过程 (sp_trace_xx) 的参数。如果没有用正确的输入参数数据类型（与在参数说明中指定的相同）调用这些参数，则存储过程将返回错误。

权限

只有 sysadmin 固定服务器角色成员才能执行 sp_trace_generateevent。

示例

请参见

fn_trace_geteventinfo

sp_trace_setevent


sp_trace_setevent

针对某个跟踪添加或删除一个事件或事件列。只有在已停止的现有跟踪（status 为 0）上才能执行 sp_trace_setevent。如果在不存在或其 status 不为 0 的跟踪上执行该存储过程，则 Microsoft® SQL Server™ 2000 将返回错误。

语法

sp_trace_setevent [ @traceid = ] trace_id
 , [ @eventid = ] event_id
 , [ @columnid = ] column_id
, [ @on = ] on

参数

[ @traceid = ] trace_id

是要修改的跟踪 ID。trace_id 的数据类型为 int，没有默认设置。用户使用 trace_id 值识别、修改和控制跟踪。

[ @eventid = ] event_id

是要打开的事件 ID。event_id 的数据类型为 int，没有默认设置。

下表列出了可以添加到跟踪或从跟踪中删除的事件。

事件号 | 事件名称 | 描述
0-9 | 保留 |
10 | RPC:Completed | 在已完成远程过程调用 (RPC) 后发生。
11 | RPC:Starting | 在 RPC 已启动后发生。
12 | SQL:BatchCompleted | 在已完成 Transact-SQL 批处理后发生。
13 | SQL:BatchStarting | 在 Transact-SQL 批处理已启动后发生。
14 | Login | 在用户成功登录到 SQL Server 时发生。
15 | Logout | 在用户注销 SQL Server 时发生。
16 | Attention | 在提示事件（如客户端中断请求或客户端连接中断）发生时发生。
17 | ExistingConnection | 在检测所有用户在启动跟踪前连接到 SQL Server 的活动。
18 | ServiceControl | 在修改过 SQL Server 服务状态时发生。
19 | DTCTransaction | 跟踪 Microsoft 分布式事务处理协调器 (MS DTC) 在两个或更多的数据库之间协调的事务。
20 | Login Failed | 表明试图从客户机登录到 SQL Server 失败。
21 | EventLog | 表示已将事件记录到 Microsoft Windows NT® 应用程序日志中。
22 | ErrorLog | 表示已将错误事件记录到 SQL Server 错误日志中。
23 | Lock:Released | 表示已释放一个资源锁（如页）。
24 | Lock:Acquired | 表示获取了像数据页这样的资源锁。
25 | Lock:Deadlock | 表明由于两个并发事务都试图获得另一事务所拥有的不兼容的资源锁而已互相锁死。
26 | Lock:Cancel | 表示获取的资源锁已被取消（例如，由于死锁的原因）。
27 | Lock:Timeout | 表示由于其它事务控制着所需资源的分块锁而使对资源锁（如页）的请求超时。超时由 @@LOCK_TIMEOUT 函数确定，并可用 SET LOCK_TIMEOUT 语句设置。
28 | DOP Event | 在执行 SELECT、INSERT 或 UPDATE 语句之前发生。
29-31 | 保留 | 改为使用事件 28。
32 | 保留 |
33 | Exception | 表明 SQL Server 中发生一个异常错误。
34 | SP:CacheMiss | 表明未在过程高速缓存中找到某存储过程的时间。
35 | SP:CacheInsert | 表明将某项目插入到过程高速缓存中的时间。
36 | SP:CacheRemove | 表明将某项目从过程高速缓存中删除的时间。
37 | SP:Recompile | 表示已重新编译某个存储过程。
38 | SP:CacheHit | 表示在过程高速缓存中找到某存储过程的时间。
39 | SP:ExecContextHit | 表示已在过程高速缓存内找到某存储过程的执行版本。
40 | SQL:StmtStarting | 在已启动 Transact-SQL 语句时发生。
41 | SQL:StmtCompleted | 在已完成 Transact-SQL 语句后发生。
42 | SP:Starting | 表明存储过程已被启动的时间。
43 | SP:Completed | 表明存储过程已完成的时间。
44 | 保留 | 改为使用事件 40。
45 | 保留 | 改为使用事件 41。
46 | Object: Created | 表示已经创建一个对象，如 CREATE INDEX、CREATE TABLE 和 CREATE DATABASE 这样的语句。
47 | Object: Deleted | 表示已经删除一个对象，如在 DROP INDEX 和 DROP TABLE 语句中。
48 | 保留 |
49 | 保留 |
50 | SQL Transaction | 跟踪 Transact-SQL BEGIN、COMMIT、SAVE 和 ROLLBACK TRANSACTION 语句。
51 | Scan:Started | 表明已启动扫描一个表或索引的时间。
52 | Scan:Stopped | 表明已停止扫描一个表或索引的时间。
53 | CursorOpen | 表示 ODBC、OLE DB 或 DB-Library 在 Transact-SQL 语句上打开游标的时间。
54 | Transaction Log | 在事务被写入事务日志时进行跟踪。
55 | Hash Warning | 表示未在缓冲分区进行的某一哈希操作（例如，哈希联接、哈希聚合、哈希 union 运算、哈希非重复）已回复为替换计划。这可由于递归深度、数据扭曲、跟踪标记或位计数而发生。
56-57 | 保留 |
58 | Auto Update Stats | 表示已自动更新索引统计。
59 | Lock:Deadlock Chain | 为每个导致死锁的事件而产生。
60 | Lock:Escalation | 表示较细粒度的锁已转换为较粗粒度的锁（如由行锁升级或转换为页锁）。
61 | OLE DB Errors | 表明发生了一个 OLE DB 错误。
62-66 | 保留 |
67 | Execution Warnings | 表明在执行 SQL Server 语句或存储过程期间发生的所有警告。
68 | Execution Plan | 显示正在执行的 Transact-SQL 语句的计划树。
69 | Sort Warnings | 表示不符合内存要求的排序操作。不包括与创建索引有关的排序操作；只包括某查询内的排序操作（如 SELECT 语句中使用的 ORDER BY 子句）。
70 | CursorPrepare | 表示 ODBC、OLE DB 或 DB-Library 准备好 Transact-SQL 语句中的游标以便使用的时间。
71 | Prepare SQL | ODBC、OLE DB 或 DB-Library 已准备一个或多个 Transact-SQL 语句供使用。
72 | Exec Prepared SQL | ODBC、OLE DB 或 DB-Library 已执行一个或多个准备的 Transact-SQL 语句。
73 | Unprepare SQL | ODBC、OLE DB 或 DB-Library 已撤消准备（删除）准备好的 Transact-SQL 语句。
74 | CursorExecute | 执行先前由 ODBC、OLE DB 或 DB-Library 在 Transact-SQL 语句上准备的游标。
75 | CursorRecompile | 由 ODBC 或 DB-Library 在 Transact-SQL 语句上打开的游标已直接重新编译或由于架构更改而重新编译。 为 ANSI 和非 ANSI 游标触发。
76 | CursorImplicitConversion | Transact-SQL 语句上的游标由 SQL Server 从一种类型转换到另一种类型。 为 ANSI 和非 ANSI 游标触发。
77 | CursorUnprepare | ODBC、OLE DB 或 DB-Library 撤消准备（删除）在 Transact-SQL 上准备好的游标。
78 | CursorClose | 关闭先前由 ODBC、OLE DB 或 DB-Library 在 Transact-SQL 语句上打开的游标。
79 | Missing Column Statistics | 在优化器中可能会有用的列统计不可用。
80 | Missing Join Predicate | 正在执行没有联接谓词的查询。这可能会导致查询长时间运行。
81 | Server Memory Change | Microsoft SQL Server 内存的使用已增加或减少 1 MB 或最大服务器内存的 5%（两者中较大的）。
82-91 | User Configurable (0 -9) | 用户定义的事件数据。
92 | Data File Auto Grow | 表示服务器已自动扩展某日志文件。
93 | Log File Auto Grow | 表示服务器已自动扩展某日志文件。
94 | Data File Auto Shrink | 表示服务器已自动收缩某数据文件。
95 | Log File Auto Shrink | 表示服务器已自动收缩某日志文件。
96 | Show Plan Text | 在查询优化器中显示 SQL 语句的查询计划树。
97 | Show Plan ALL | 用已执行的 SQL 语句的完整的编译时细节显示查询计划。
98 | Show Plan Statistics | 执行 SQL 语句的完整的编译时细节来显示查询计划用已执行的 SQL 语句的完整的运行时细节显示查询计划。
99 | 保留 |
100 | RPC Output Parameter | 生成每个 RPC 的参数输出值。
101 | 保留 |
102 | Audit Statement GDR | SQL Server 中的任何用户每次发出用于语句权限的 GRANT、DENY、REVOKE 时都发生。
103 | Audit Object GDR | 在 SQL Server 中的任何用户每次发出用于对象权限的 GRANT、DENY、REVOKE 时都发生。
104 | Audit Add/Drop Login | 在添加或删除 SQL Server 登录时发生；用于 sp_addlogin 和 sp_droplogin。
105 | Audit Login GDR | 在添加或删除 Microsoft Windows® 登录权限时发生；用于 sp_grantlogin、sp_revokelogin 和 sp_denylogin。
106 | Audit Login Change Property | 在修改除密码之外的登录属性时发生；用于 sp_defaultdb 和 sp_defaultlanguage。
107 | Audit Login Change Password | 在更改 SQL Server 登录密码时发生。 不记录密码。
108 | Audit Add Login to Server Role | 在从固定服务器角色添加或删除登录时发生；用于 sp_addsrvrolemember 和 sp_dropsrvrolemember。
109 | Audit Add DB User | 在添加或删除作为某个数据库的数据库用户（Windows 或 SQL Server）的登录时发生；用于 sp_grantdbaccess、sp_revokedbaccess、sp_adduser 和 sp_dropuser。
110 | Audit Add Member to DB | 在将某登录作为数据库的固定数据库用户或用户定义数据库用户进行添加或删除时发生；用于 sp_addrolemember、sp_droprolemember 和 sp_changegroup。
111 | Audit Add/Drop Role | 在将某登录作为数据库的数据库用户进行添加或删除时发生；用于 sp_addrole 和 sp_droprole。
112 | App Role Pass Change | 在更改应用程序角色的密码时发生。
113 | Audit Statement Permission | 在使用语句权限（如 CREATE TABLE）时发生。
114 | Audit Object Permission | 在成功地或不成功地使用对象权限（如 SELECT）时发生。
115 | Audit Backup/Restore | 在发出 BACKUP 或 RESTORE 命令时发生。
116 | Audit DBCC | 在发出 DBCC 命令时发生。
117 | Audit Change Audit | 在进行审核跟踪修改时发生。
118 | Audit Object Derived Permission | 在发出 CREATE、ALTER 和 DROP 对象命令时发生。

[ @columnid = ] column_id

是要为事件添加的列 ID。column_id 的数据类型为 int，没有默认设置。

下表列出了可以为事件添加的列。

列号 | 列名 | 描述
1 | TextData | 与跟踪内捕获的事件类相关的文本值。
2 | BinaryData | 与在跟踪中捕获的事件类相关的二进制值。
3 | DatabaseID | USE database 语句所指定的数据库 ID，如果没有对给定的连接发出 USE database 语句，则是默认数据库 ID。 可以使用 DB_ID 函数确定数据库的值。
4 | TransactionID | 系统分配的事务 ID。
5 | 保留 |
6 | NTUserName | Microsoft Windows NT® 用户名。
7 | NTDomainName | 用户所属的 Windows NT 域。
8 | ClientHostName | 发起请求的客户计算机名称。
9 | ClientProcessID | 客户端计算机分配给进程的 ID，而客户端应用程序正在该进程中运行。
10 | ApplicationName | 创建与 SQL Server 实例的连接的客户端应用程序名。该列由应用程序传递的值填充，而不是由所显示的程序名填充。
11 | SQLSecurityLoginName | 客户端的 SQL Server 登录名称。
12 | SPID | SQL Server 指派的与客户端相关的服务器进程 ID。
13 | Duration | 事件所花费的实耗时间总计（以毫秒为单位）。Hash Warning 事件不填充该数据列。
14 | StartTime | 启动事件的时间（可用时）。
15 | EndTime | 事件结束时的时间。启动事件类（如 SQL:BatchStarting 或 SP:Starting）的该列不填充。Hash Warning 事件也不填充该列。
16 | Reads | 服务器代表事件执行的逻辑磁盘读取数。Lock:Released 事件不填充该列。
17 | Writes | 服务器代表事件执行的物理磁盘写入数。
18 | CPU | 事件所使用的 CPU 时间总计（以毫秒为单位）。
19 | Permissions | 代表权限的位图；由安全审核使用。
20 | Severity | 异常错误的严重级别。
21 | EventSubClass | 事件子类类型。所有事件类的该数据列均不填充。
22 | ObjectID | 系统分配的对象 ID。
23 | Success | 尝试使用权限成功；由审核使用。 1 = 成功 0 = 失败
24 | IndexID | 受事件影响的对象上的索引 ID。若要确定对象的索引 ID，请使用 sysindexes 系统表的 indid 列。
25 | IntegerData | 与在跟踪中捕获的事件类相关的整型值。
26 | ServerName | 正跟踪的 SQL Server 实例名（servername 或 servername\instancename）。
27 | EventClass | 正记录的事件类类型。
28 | ObjectType | 对象类型（如表、函数或存储过程）。
29 | NestLevel | 存储过程正在其上执行的嵌套级。请参见 @@NESTLEVEL。
30 | State | 发生错误时的服务器状态。
31 | Error | 错误号。
32 | Mode | 获取锁的锁模式。Lock:Released 事件不填充该列。
33 | Handle | 在事件中引用的对象句柄。
34 | ObjectName | 被访问的对象名称。
35 | DatabaseName | USE database 语句中指定的数据库名称。
36 | Filename | 被修改的文件名的逻辑名。
37 | ObjectOwner | 被引用对象的所有者 ID。
38 | TargetRoleName | 语句作为目标的数据库范围角色或服务器范围角色的名称。
39 | TargetUserName | 某个操作目标的用户名。
40 | DatabaseUserName | 客户端的 SQL Server 数据库用户名。
41 | LoginSID | 登录用户的安全标识号 (SID)。
42 | TargetLoginName | 某个操作目标的登录名称。
43 | TargetLoginSID | 是某个操作目标的登录 SID。
44 | ColumnPermissionsSet | 列级权限状态；由安全审核使用。

[ @on = ] on

指定是打开事件 (ON (1)) 还是关闭事件 (OFF (0))。@on 的数据类型为 bit，没有默认设置。

如果 on 设置为 1，且 column_id 是 NULL，则将事件设置为 ON 并清除所有列。如果 column_id 不为空，则为该事件将列设置为 ON。

如果 on 设置为 0，且 column_id 是 NULL，则关闭事件 (OFF) 且清除所有列。如果 column_id 不为空，则关闭列 (OFF)。

下表说明 @on 和 @columnid 之间的交互操作。

@on | @columnid | 结果
ON (1) | NULL | 打开事件 (ON)。 清除所有列。
 | NOT NULL | 为指定的事件打开列 (ON)。
OFF (0) | NULL | 关闭事件 (OFF)。 清除所有列。
 | NOT NULL | 为指定的事件关闭列 (OFF)。

返回代码值

下表描述在存储过程完成之后用户可能获得的代码值。

返回代码 | 描述
0 | 没有错误。
1 | 未知错误。
2 | 本跟踪当前正在运行。此时更改跟踪将导致错误。
3 | 指定的事件无效。该事件可能不存在或者它不适用于此存储过程。
4 | 指定的列无效。
9 | 指定的跟踪句柄无效。
11 | 指定的列在内部使用并且不能删除。
13 | 内存不足。在没有足够内存执行指定的操作时返回此代码。
16 | 该函数对此跟踪无效。

注释

sp_trace_setevent 是 Microsoft SQL Server 2000 存储过程，它执行以前由 SQL Server 早期版本使用的扩展存储过程执行的很多操作。使用 sp_trace_setevent 而不使用：

  • xp_trace_addnewqueue

  • xp_trace_eventclassrequired

  • xp_trace_seteventclassrequired

对于为每个事件添加的每列，用户都必须执行 sp_trace_setevent。在每次执行过程中，如果将 @on 设置为 1，则 sp_trace_setevent 将指定的事件添加到跟踪事件的列表。如果将 @on 设置为 0，则 sp_trace_setevent 将从列表中删除指定的事件。

严格地键入所有 SQL 跟踪存储过程 (sp_trace_xx) 的参数。如果没有用正确的输入参数数据类型（与在参数说明中指定的相同）调用这些参数，则存储过程将返回错误。

权限

只有 sysadmin 固定服务器角色成员才能执行 sp_trace_setevent。

请参见

fn_trace_geteventinfo

fn_trace_getinfo

sp_trace_setevent


sp_trace_setfilter

将筛选应用到跟踪。只有在现有的已停止跟踪（status 为 0）上才能执行 sp_trace_setfilter。如果在不存在或其 status 不为 0 的跟踪上执行该存储过程，则 SQL Server 2000 将返回错误。

语法

sp_trace_setfilter [ @traceid = ] trace_id
 , [ @columnid = ] column_id
, [ @logical_operator = ] logical_operator
 , [ @comparison_operator = ] comparison_operator
 , [ @value = ] value

参数

[ @traceid = ] trace_id

是要为其设置筛选的跟踪 ID。trace_id 的数据类型为 int，没有默认设置。用户使用 trace_id 值识别、修改和控制跟踪。

[ @columnid = ] column_id

是将在其上应用筛选的列 ID。column_id 的数据类型为 int，没有默认设置。如果 column_id 为 NULL，则 SQL Server 为指定的跟踪清除所有筛选。

[ @logical_operator = ] logical_operator

指定将应用 AND (0) 运算符还是应用 OR (1) 运算符。logical_operator 的数据类型为 int，没有默认设置。

[ @comparison_operator = ] comparison_operator

指定要进行比较的类型。comparison_operator 的数据类型为 int，没有默认设置。下表包含比较运算符及其代表值。

值 | 比较运算符
0 | =（等于）
1 | <>（不等于）
2 | >（大于）
3 | <（小于）
4 | >=（大于或等于）
5 | <=（小于或等于）
6 | LIKE
7 | NOT LIKE

[ @value = ] value

指定要在其上筛选的值。value 的数据类型必须匹配要筛选的列的数据类型。因此，如果将筛选设置在数据类型为 int 的对象 ID 列上，则 value 必须是 int。不允许 NULL 值和空字符串；当事件的列值为空时，SQL Server 将传递在该列上定义的任何筛选。如果 value 的数据类型为 nvarchar 或 varbinary，则的最大长度可以是 8000。

比较运算符为 LIKE 或 NOT LIKE 时，逻辑运算符可以包括"%"或其它适合 LIKE 操作的筛选。

若要在列值范围内应用筛选，则必须执行 sp_trace_setfilter 两次：一次用 '>=' 比较运算符，一次用 '<=' 运算符。

返回代码值

下表描述在存储过程完成之后用户可能获得的代码值。

返回代码 | 描述
0 | 没有错误。
1 | 未知错误。
2 | 本跟踪当前正在运行。此时更改跟踪将导致错误。
4 | 指定的列无效。
5 | 不允许筛选指定的列。只有 sp_trace_setfilter 才能返回该值。
6 | 指定的比较运算符无效。
7 | 指定的逻辑运算符无效。
9 | 指定的跟踪句柄无效。
13 | 内存不足。在没有足够内存执行指定的操作时返回此代码。
16 | 该函数对此跟踪无效。

注释

sp_trace_setfilter 是 Microsoft® SQL Server™ 2000 存储过程，它执行以前由 SQL Server 早期版本使用的扩展存储过程所执行的很多操作。使用 sp_trace_setfilter 存储过程而不使用 xp_trace_set*filter 扩展存储过程以在跟踪上创建、应用、删除或操作筛选。有关更多信息，请参见创建和管理模板。

在 sp_trace_setfilter 的一次执行过程中必须一起启用特定列的所有筛选。例如，如果用户要在应用程序名列上应用两个筛选并在用户名列上应用一个筛选，则用户必须按顺序指定应用程序名上的筛选。如果用户试图在调用一个存储过程时指定以应用程序名筛选，其后以用户名筛选，然后以应用程序名筛选，则 SQL Server 将返回错误。

严格地键入所有 SQL 跟踪存储过程 (sp_trace_xx) 的参数。如果没有用正确的输入参数数据类型（与在参数说明中指定的相同）调用这些参数，则存储过程将返回错误。

权限

只有 sysadmin 固定服务器角色成员才能执行 sp_trace_setfilter。

示例

下例在 Trace 1 上设置 3 个筛选。筛选 N'SQLT%' 和 N'MS%' 使用"LIKE"比较运算符对一个列（AppName，其值为 10）进行操作。筛选 N'joe' 使用"EQUAL"比较运算符对另一个列（UserName，其值为 11）进行操作。

sp_trace_setfilter  1, 10, 0, 6, N'SQLT%'
sp_trace_setfilter  1, 10, 0, 6, N'MS%'
sp_trace_setfilter  1, 11, 0, 0, N'joe'

请参见

fn_trace_getfilterinfo

fn_trace_getinfo


sp_trace_setstatus

修改指定的跟踪的当前状态。

语法

sp_trace_setstatus [ @traceid = ] trace_id
 , [ @status = ] status

参数

[ @traceid = ] trace_id

是要修改的跟踪 ID。trace_id 的数据类型为 int，没有默认设置。用户使用 trace_id 值识别、修改和控制跟踪。

[ @status = ] status

指定要在跟踪上执行的操作。status 的数据类型为 int，没有默认设置。

下表列出了可以指定的状态。

状态 | 描述
0 | 停止指定的跟踪。
1 | 启动指定的跟踪。
2 | 关闭指定的跟踪并从服务器中删除其定义。

说明 在关闭跟踪前首先必须先停止它。

返回代码值

下表描述在存储过程完成之后用户可能获得的代码值。

返回代码 | 描述
0 | 没有错误。
1 | 未知错误。
8 | 指定的状态无效。
9 | 指定的跟踪句柄无效。
13 | 内存不足。在没有足够内存执行指定的操作时返回此代码。

如果跟踪已经处于指定的状态，则 SQL Server 将返回 0。

注释

sp_trace_setstatus 是 Microsoft SQL Server 2000 存储过程，它执行以前由 SQL Server 早期版本中使用的 xp_trace_* 扩展存储过程执行的许多操作。使用 sp_trace_setstatus 而不使用：

  • xp_trace_destroyqueue

  • xp_trace_pausequeue

  • xp_trace_restartqueue

  • xp_trace_startconsumer

严格地键入所有 SQL 跟踪存储过程 (sp_trace_xx) 的参数。如果没有用正确的输入参数数据类型（与在参数说明中指定的相同）调用这些参数，则存储过程将返回错误。

权限

只有 sysadmin 固定服务器角色成员才能执行 sp_trace_setstatus。

示例

请参见

fn_trace_geteventinfo

fn_trace_getfilterinfo

fn_trace_getinfo

sp_trace_generateevent

sp_trace_setevent

sp_trace_setfilter


sp_unbindefault

在当前数据库中为列或者用户定义数据类型解除（删除）默认值绑定。

语法

sp_unbindefault [@objname =] 'object_name'
[, [@futureonly =] 'futureonly_flag']

参数

[@objname =] 'object_name'

是要解除默认值绑定的表和列或者用户定义数据类型的名称。object_name 的数据类型为 nvarchar(776)，无默认值。如果参数不是 table.column 的形式，则假定 object_name 为用户定义数据类型。当为用户定义数据类型解除默认值绑定时，所有属于该数据类型并具有相同默认值的列也同时解除默认值绑定。对属于该数据类型的列，如果其默认值直接绑定到列上，则该列不受影响。

说明 object_name 中可以含有 [ and ] 字符作为分隔标识符。有关更多信息，请参见分隔标识符。

[@futureonly =] 'futureonly_flag'

仅用于解除用户定义数据类型默认值的绑定。futureonly_flag 的数据类型为 varchar(15)，其默认值为 NULL。当参数 futureonly_flag 为 futureonly 时，现有的属于该数据类型的列不会失去指定默认值。

返回代码值

0（成功）或 1（失败）

注释

若要显示默认值的文本，请以该默认值的名称为参数执行存储过程 sp_helptext。

解除默认值绑定时，如果默认值绑定到列，则绑定信息从表 syscolumns 中删除。如果默认值绑定到用户定义数据类型，则绑定信息从表 systypes 中删除。

权限

只有 sysadmin 固定服务器角色、db_owner 和 db_ddladmin 固定数据库角色的成员以及表所有者才能执行 sp_unbindefault。

示例
A. 为列解除默认值绑定

下例为表 employees 的 hiredate 列解除默认值绑定。

EXEC sp_unbindefault 'employees.hiredate'
B. 为用户定义数据类型解除默认值绑定

下例为用户定义数据类型 ssn 解除默认值绑定。这将为该数据类型的现有列和将来的列解除绑定。

EXEC sp_unbindefault 'ssn'
C. 使用 futureonly_flag

下例为用户定义数据类型 ssn 解除默认值绑定，现有的 ssn 列不受影响。

EXEC sp_unbindefault 'ssn', 'futureonly'
D. 使用分隔标识符

此示例显示了在 object_name 中分隔标识符的使用。

CREATE TABLE [t.3] (c1 int) -- Notice the period as part of the table
-- name.
CREATE DEFAULT default2 AS 0
GO
EXEC sp_bindefault 'default2', '[t.3].c1'
-- The object contains two periods;
-- the first is part of the table name and the second
-- distinguishes the table name from the column name.
EXEC sp_unbindefault '[t.3].c1'

请参见

CREATE DEFAULT

DROP DEFAULT

sp_bindefault

sp_helptext

系统存储过程


sp_unbindrule

在当前数据库中为列或用户定义数据类型解除规则绑定。

语法

sp_unbindrule [@objname =] 'object_name'
 [, [@futureonly =] 'futureonly_flag']

参数

[@objname =] 'object_name'

是要解除规则绑定的表和列或者用户定义数据类型的名称。object_name 的数据类型为 nvarchar(776)，无默认值。如果参数不是 table.column 的形式，则假定 object_name 为用户定义数据类型。当为用户定义数据类型解除规则绑定时，所有属于该数据类型并具有相同规则的列也同时解除规则绑定。对属于该数据类型的列，如果其规则直接绑定到列上，则该列不受影响。

说明 object_name 中可以含有 [ and ] 字符作为分隔标识符。有关更多信息，请参见分隔标识符。

[@futureonly =] 'futureonly_flag'

仅用于解除用户定义数据类型规则的绑定。futureonly_flag 的数据类型为 varchar(15)，其默认值为 NULL。当参数 futureonly_flag 为 futureonly 时，现有的属于该数据类型的列不会失去指定规则。

返回代码值

0（成功）或 1（失败）

注释

若要显示某条规则的文本，请以该规则的名称作为参数来执行存储过程 sp_helptext。

解除规则绑定时，如果规则绑定到列，则绑定信息从表 syscolumns 中删除。如果规则绑定到用户定义数据类型，则绑定信息从表 systypes 中删除。

当从用户定义数据类型解除规则绑定时，任何具有该用户定义数据类型的列也同时解除该规则的绑定。对于后来用 ALTER TABLE 语句的 ALTER COLUMN 子句更改了数据类型的列，该规则仍可能绑定在该列上，必须使用存储过程 sp_unbindrule（并指定列名）明确地从这些列中解除规则绑定。

权限

只有 sysadmin 固定服务器角色、db_owner 和 db_ddladmin 固定数据库角色的成员以及表所有者才能执行 sp_unbindrule。

示例
A. 为列解除规则绑定

下例为表 employees 的 startdate 列解除规则绑定。

EXEC sp_unbindrule 'employees.startdate'
B. 为用户定义数据类型解除规则绑定

下例为用户定义数据类型 ssn 解除规则绑定。这将为该数据类型的现有列和将来的列解除规则绑定。

EXEC sp_unbindrule ssn
C. 使用 futureonly_flag

下例为用户定义数据类型 ssn 的解除规则绑定，现有的 ssn 列不受影响。

EXEC sp_unbindrule 'ssn', 'futureonly'
D. 使用分隔标识符

下例显示了在 object_name 中定界标识符的使用。

CREATE TABLE [t.4] (c1 int) -- Notice the period as part of the table
-- name.
GO
CREATE RULE rule2 AS @value > 100
GO
EXEC sp_bindrule rule2, '[t.4].c1' -- The object contains two
-- periods; the first is part of the table name and the second
-- distinguishes the table name from the column name.
GO
EXEC sp_unbindrule '[t.4].c1'

请参见

CREATE RULE

DROP RULE

sp_bindrule

sp_helptext

系统存储过程


sp_update_alert

更新现有警报的设置。

语法

sp_updatealert [@name =] 'name'
[, [@new_name =] 'new_name']
    [, [@enabled =] enabled]
    [, [@message_id =] message_id]
[, [@severity =] severity]
[, [@delay_between_responses =] delay_between_responses]
[, [@notification_message =] 'notification_message']
[, [@include_event_description_in =] include_event_description_in]
[, [@database_name =] 'database_name']
[, [@event_description_keyword =] 'event_description_keyword']
[, [@job_id =] job_id | [@job_name =] 'job_name']
[, [@occurrence_count = ] occurrence_count]
[, [@count_reset_date =] count_reset_date]
[, [@count_reset_time =] count_reset_time]
[, [@last_occurrence_date =] last_occurrence_date]
[, [@last_occurrence_time =] last_occurrence_time]
[, [@last_response_date =] last_response_date]
[, [@last_response_time =] last_response _time]
[, [@raise_snmp_trap =] raise_snmp_trap]
[, [@performance_condition =] 'performance_condition']
[, [@category_name =] 'category']

参数

[@name =] 'name'

是要更新的警报的名称。name 的数据类型为 sysname，无默认值。

[@new_name =] 'new_name'

是警报的新名称。该名称必须是唯一的。new_name 的数据类型为 sysname，其默认值为 NULL。

[@enabled =] enabled

指定警报启用 (1) 或不启用 (0)。enabled 的数据类型为 tinyint，其默认值为 NULL。警报必须启用后才能激发。

[@message_id =] message_id

是警报定义的新消息编号或错误号。message_id 通常对应于表 sysmessages 中的某一错误号。message_id 的数据类型为 int，其默认值为 NULL。仅当该警报的严重级别设置为 0 时才能使用消息 ID。

[@severity =] severity

是警报定义的新严重级别（从 1 至 25）。任何以指定严重度发送到 Windows NT® 应用程序日志的 Microsoft® SQL Server™ 消息都将激活该警报。severity 的数据类型为 int，默认设置为 NULL。仅当该警报的消息 ID 设置为 0 时，才能使用严重级别。

[@delay_between_responses =] delay_between_responses

是对警报的各响应之间的新等待时间（以秒计）。delay_between_responses 的数据类型为 int，其默认值为 NULL。

[@notification_message =] 'notification_message'

是修正过的附加消息文本，而该消息作为电子邮件、net send（网络发送）或呼叫提示的一部分发送给操作员。notification_message 的数据类型为 nvarchar(512)，默认设置为 NULL。

[@include_event_description_in =] include_event_description_in

确定来自 Windows NT 应用程序日志的 SQL Server 错误的描述是否应包含在提示消息中。include_event_description_in 的数据类型为 tinyint，其默认值为 NULL，并可以取下列值中的一个或多个值。

值 | 描述
0 | 无
1 | 电子邮件
2 | 呼叫程序
4 | net send

[@database_name =] 'database_name'

是数据库名。只有在该数据库中发生错误时，才能激发警报。database_name 的数据类型为 sysname，其默认值为 NULL。

[@event_description_keyword =] 'event_description_keyword'

是错误信息日志的错误描述中必须包含的字符序列。可以使用 Transact-SQL LIKE 表达式的模式匹配字符。event_description_keyword 的数据类型为 nvarchar(100)，其默认值为 NULL。该参数在筛选对象名称（例如，%customer_table%）时很有用。

[@job_id =] job_id

作业标识号。job_id 的数据类型为 uniqueidentifier，默认值为 NULL。如果指定了 job_id，就必须省略 job_name。

[@job_name =] 'job_name'

是响应该警报而执行的作业的名称。job_name 的数据类型为 sysname，其默认值为 NULL。如果指定了 job_name，就必须省略 job_id。

[@occurrence_count = ] occurrence_count

重置警报发生的次数。occurrence_count 的数据类型为 int，其默认值为 NULL，且只能设置为 0。

[@count_reset_date =] count_reset_date

重置发生计数的上一次重置日期。count_reset_date 的数据类型为 int，其默认值为 NULL。

[@count_reset_time =] count_reset_time

重置发生计数的上一次重置时间。count_reset_time 的数据类型为 int，其默认值为 NULL。

[@last_occurrence_date =] last_occurrence_date

重置警报的上一次发生日期。last_occurrence_date 的数据类型为 int，其默认值为 NULL，且只能设置为 0。

[@last_occurrence_time =] last_occurrence_time

重置警报的上一次发生时间。last_occurrence_time 的数据类型为 int，其默认值为 NULL，且只能设置为 0。

[@last_response_date =] last_response_date

重置 SQLServerAgent 服务上一次响应警报的日期。last_response_date 的数据类型为 int，其默认值为 NULL，且只能设置为 0。

[@last_response_time =] last_response_time

重置 SQLServerAgent 服务上一次响应警报的时间。last_response_time 的数据类型为 int，其默认值为 NULL，且只能设置为 0。

[@raise_snmp_trap =] raise_snmp_trap

保留。

[@performance_condition =] 'performance_condition'

是以 'item comparator value' 格式表示的值。performance_condition 的数据类型为 nvarchar(512)，其默认值为 NULL，并含有以下元素。

格式元素 | 描述
item | 性能对象，性能计数器或计数器的命名实例
Comparator | 下列运算符之一： >, <, =
Value | 计数器的数值

[@category_name =] 'category'

警报分类的名称。category 的数据类型为 sysname，默认值为 NULL。

返回代码值

0（成功）或 1（失败）

注释

sp_update_alert 必须从 msdb 数据库中执行。

只有写入 Microsoft® Windows NT® 应用程序日志的 sysmessages 才能激发警报。

sp_update_alert 只更改提供了参数值的警报设置。如果省略某一参数，则保留其当前设置。

权限

只有 sysadmin 固定服务器角色的成员才能执行 sp_update_alert。

示例

下例将 Test Alert 的 enabled 设置更改为 0。

sp_updatealert @name = 'Test Alert', @enabled = 0

请参见

sp_add_alert

sp_help_alert

系统存储过程


sp_update_category

更改分类的名称。

语法

sp_update_category [@class =] 'class',
[@name =] 'old_name',
[@new_name =] 'new_name'

参数

[@class =] 'class'

是要更新的分类的种类。class 的数据类型为 varchar(8)，无默认值，并可以取下表所示的值之一。

值 | 描述
ALERT | 更新警报分类。
JOB | 更新作业分类。
OPERATOR | 更新操作员分类。

[@name =] 'old_name'

是分类的当前名称。article 的数据类型为 sysname，无默认值。

[@new_name =] 'new_name'

是分类的新名称。new_name 的数据类型为 sysname，无默认值。

返回代码值

0（成功）或 1（失败）

注释

sp_update_category 必须从 msdb 数据库中运行。

权限

只有 sysadmin 固定服务器角色或 db_owner 固定数据库角色的成员才能执行 sp_update_category。

示例

下例将作业分类从 Table Archixes 更名为 Table Archives。

USE msdb
EXEC sp_update_category 'JOB', 'Table Archixes', 'Table Archives'

请参见

sp_add_category

sp_delete_category

sp_help_category

系统存储过程


sp_update_job

更改作业的特性。

语法

sp_update_job [@job_id =] job_id | [@job_name =] 'job_name'
[, [@new_name =] 'new_name']
[, [@enabled =] enabled]
    [, [@description =] 'description']
[, [@start_step_id =] step_id]
[, [@category_name =] 'category']
[, [@owner_login_name =] 'login']
[, [@notify_level_eventlog =] eventlog_level]
[, [@notify_level_email =] email_level]
[, [@notify_level_netsend =] netsend_level]
[, [@notify_level_page =] page_level]
[, [@notify_email_operator_name =] 'email_name']
[, [@notify_netsend_operator_name =] 'netsend_operator']
[, [@notify_page_operator_name =] 'page_operator']
[, [@delete_level =] delete_level]
[, [@automatic_post =] automatic_post]

参数

[@job_id =] job_id

是要更新的作业的标识号。job_id 的数据类型为 uniqueidentifier 类型，其默认值为 NULL。

[@job_name =] 'job_name'

是作业的名称。job_name 的数据类型为 sysname，其默认值为 NULL。

说明 必须或者指定 job_id 或者指定 job_name，但不能两个都指定。

[@new_name =] 'new_name'

是作业的新名称。new_name 的数据类型为 sysname，其默认值为 NULL。

[@enabled =] enabled

指定启用 (1) 或不启用 (0) 作业。enabled 的数据类型为 tinyint，其默认值为 NULL。

[@description =] 'description'

是作业描述。description 的数据类型为 nvarchar(512)，其默认值为 NULL。

[@start_step_id =] step_id

是作业执行的第一个步骤的标识号。step_id 的数据类型为 int，其默认值为 NULL。

[@category_name =] 'category'

是作业分类。category 的数据类型为 sysname，其默认值为 NULL。

[@owner_login_name =] 'login'

是拥有该作业的登录的名称。login 的数据类型为 sysname，其默认值为 NULL。只有 sysadmin 固定服务器角色的成员才能更改作业所有权。

[@notify_level_eventlog =] eventlog_level

指定何时在 Microsoft® Windows NT® 应用程序日志中为该作业添加一项。eventlog_level 的数据类型为 int，其默认值为 NULL，且可以是下列值之一。

值 | 描述（操作）
0 | 从不
1 | 成功后
2 | 失败后
3 | 始终

[@notify_level_email =] email_level

指定作业完成后何种情况下应发送电子邮件。email_level 的数据类型为 int，其默认值为 NULL。email_level 使用与 eventlog_level 相同的值。

[@notify_level_netsend =] netsend_level

指定作业完成后何种情况下应发送网络消息。netsend_level 的数据类型为 int，其默认值为 NULL。netsend_level 使用与 eventlog_level 相同的值。

[@notify_level_page =] page_level

指定作业完成后何种情况下应发送呼叫。page_level 的数据类型为 int，其默认值为 NULL。page_level 使用与 eventlog_level 相同的值。

[@notify_email_operator_name =] 'email_name'

是当达到 email_level 时向其发送电子邮件的接收人的电子邮件名。email_name 的数据类型为 sysname，其默认值为 NULL。

[@notify_netsend_operator_name =] 'netsend_operator'

是向其发送网络消息的操作员的名称。netsend_operator 的数据类型为 sysname，其默认值为 NULL。

[@notify_page_operator_name =] 'page_operator'

是向其发送呼叫的操作员的名称。page_operator 的数据类型为 sysname，其默认值为 NULL。

[@delete_level =] delete_level

指定在何种情况下删除作业。delete_value 的数据类型为 int，其默认值为 NULL。delete_level 使用与 eventlog_level 相同的值。

[@automatic_post =] automatic_post

保留。

返回代码值

0（成功）或 1（失败）

注释

sp_update_job 必须从 msdb 数据库中运行。

sp_update_job 只更改提供了参数的设置。如果省略某一参数，则保留其当前设置。

权限

执行权限默认授予 public 角色。

示例

下例更改作业 Archive Tables 的名称和描述，并禁用该作业。

USE msdb
EXEC sp_update_job @job_name = 'Archive Tables',
   @new_name = 'Archive Tables - Disabled',
   @description = 'Job disabled until end of project',
   @enabled = 0

请参见

sp_add_job

sp_delete_job

sp_help_job

系统存储过程


sp_update_jobschedule

更改指定作业的调度设置。

语法

sp_update_jobschedule [@job_id =] job_id, | [@job_name =] 'job_name',
[@name =] 'name'
[, [@new_name =] 'new_name']
    [, [@enabled =] enabled]
[, [@freq_type =] freq_type]
[, [@freq_interval =] freq_interval]
[, [@freq_subday_type =] freq_subday_type]
[, [@freq_subday_interval =] freq_subday_interval]
[, [@freq_relative_interval =] freq_relative_interval]
[, [@freq_recurrence_factor =] freq_recurrence_factor]
[, [@active_start_date =] active_start_date]
[, [@active_end_date =] active_end_date]
[, [@active_start_time =] active_start_time]
[, [@active_end_time =] active_end_time]

参数

[@job_id =] job_id

是调度所属于的作业的标识号。job_id 的数据类型为 uniqueidentifier，其默认值为 NULL。

[@job_name =] 'job_name'

是调度所属于的作业的名称。各作业名称都必须是唯一的。job_name 的数据类型为 sysname，其默认值为 NULL。

说明 必须或者指定 job_id 或者指定 job_name，但不能两个都指定。

[@name =] 'name'

是要修改的调度的名称。name 的数据类型为 sysname，无默认值。

[@new_name =] 'new_name'

是调度的新名称。new_name 的数据类型为 sysname，其默认值为 NULL。

[@enabled =] enabled

指定启用 (1) 或不启用 (0) 调度。enabled 的数据类型为 tinyint，其默认值为 NULL。

[@freq_type =] freq_type

指定该作业运行的频繁程度。freq_type 的数据类型为 int，其默认值为 NULL，且可以取下列值之一。

值 | 描述
1 | 一次。
4 | 按天。
8 | 按星期。
16 | 按月。
32 | 按月，相对于 freq_interval。
64 | 当 SQL Server代理启动时运行。
128 | 当计算机空闲时运行。

[@freq_interval =] freq_interval

指定作业在哪一天运行。freq_interval 的数据类型为 int，其默认值为 NULL。freq_interval 的值取决于 freq_type 的值。

freq_type 的值 | 对 freq_interval 的影响
1（一次） | 未使用 freq_interval。
4（每天） | 每个 freq_interval 日。
8（每周） | freq_interval 是下列某个值或多个值（或 (OR) 在一起）： 1 = 星期日 2 = 星期一 4 = 星期二 8 = 星期三 16 = 星期四 32 = 星期五 64 = 星期六
16（每月） | 每月的 freq_interval 日。
32（每月相对信息） | freq_interval 可以取下列值之一： 1 = 星期日 2 = 星期一 3 = 星期二 4 = 星期三 5 = 星期四 6 = 星期五 7 = 星期六 8 = 日 9 = 工作日 10 = 周末
64（SQL Server 代理程序启动时） | 未使用 freq_interval。

[@freq_subday_type =] freq_subday_type

指定 freq_subday_interval 的单位。freq_subday_type 的数据类型为 int，其默认值为 NULL，且可以取下列值之一。

值 | 描述（单位）
0x1 | 在指定的时间。
0x4 | 分钟。
0x8 | 小时。

[@freq_subday_interval =] freq_subday_interval

指定作业每次执行之间的周期数，周期以 freq_subday_type 为单位。freq_subday_interval 的数据类型为 int，其默认值为 NULL。

[@freq_relative_interval =] freq_relative_interval

当 freq_interval 的值为 32（每月相对信息）时，指定每月调度作业发生的 freq_interval。freq_relative_interval 的数据类型为 int，其默认值为 NULL，且可以取下列值之一。

值 | 描述（单位）
1 | 第一个
2 | 第二个
4 | 第三个
8 | 第四个
16 | 最后一个

[@freq_recurrence_factor =] freq_recurrence_factor

指定作业各次调度执行之间的月数。freq_recurrence_factor 仅当 freq_type 为 8、16 或 32 时才使用。freq_recurrence_factor 的数据类型为 int，其默认值为 NULL。

[@active_start_date =] active_start_date

是作业可以开始执行的日期。active_start_date 的数据类型为 int，其默认值为 NULL。其值必须为 YYYYMMDD 格式。如果 active_start_date 不为 NULL，则日期必须大于或等于 19900101。

[@active_end_date =] active_end_date

是作业可以停止执行的日期。active_end_date 的数据类型为 int，其默认值为 NULL。其值必须为 YYYYMMDD 格式。

[@active_start_time =] active_start_time

是在 active_start_date 与 active_end_date 之间任何一天作业开始执行的时间。active_start_time 的数据类型为 int，其默认值为 NULL。其值必须以 HHMMSS 的格式输入。

[@active_end_time =] active_end_time

是在 active_start_date 与 active_end_date 之间任何一天作业停止执行的时间。active_end_time 的数据类型为 int，其默认值为 NULL。其值必须以 HHMMSS 的格式输入。

返回代码值

0（成功）或 1（失败）

注释

sp_update_jobschedule 必须从 msdb 数据库中运行。

更新作业调度将增加作业的版本号。

权限

执行权限默认授予 public 角色。

示例

下例禁用 Archive Tables 作业的 Monday Archive 调度，并更改该调度的名称。

USE msdb
EXEC sp_update_jobschedule @job_name = 'Archive Tables',
   @name = 'Monday Archive',
   @new_name = 'Monday Archive - DEACTIVATED',
   @enabled = 0

请参见

修改和查看作业

sp_add_jobschedule

sp_delete_jobschedule

sp_help_jobschedule

系统存储过程


sp_update_jobstep

更改用于自动执行操作的作业中某一步骤的设置。

语法

sp_update_jobstep [@job_id =] job_id, | [@job_name =] 'job_name',
[@step_id =] step_id
[,[@step_name =] 'step_name']
[, [@subsystem =] 'subsystem']
[, [@command =] 'command']
[, [@additional_parameters =] 'parameters']
[, [@cmdexec_success_code =] success_code]
[, [@on_success_action =] success_action]
[, [@on_success_step_id =] success_step_id]
[, [@on_fail_action =] fail_action]
[, [@on_fail_step_id =] fail_step_id]
[, [@server =] 'server']
[, [@database_name =] 'database']
[, [@database_user_name =] 'user']
[, [@retry_attempts =] retry_attempts]
[, [@retry_interval =] retry_interval]
[, [@os_run_priority =] run_priority]
[, [@output_file_name =] 'file_name']
[, [@flags =] flags]

参数

[@job_id =] job_id

是该步骤所属于的作业的标识号。job_id 的数据类型为 uniqueidentifier，其默认值为 NULL。

[@job_name =] 'job_name'

是该步骤所属于的作业的名称。job_name 的数据类型为 sysname，其默认值为 NULL。

说明 必须或者指定 job_id 或者指定 job_name，但不能两个都指定。

[@step_id =] step_id

是要修改的作业步骤的标识号。该标识号不能更改。step_id 的数据类型为 int，无默认值。

[@step_name =] 'step_name'

是步骤的新名称。step_name 的数据类型为 sysname，其默认值为 NULL。

[@subsystem =] 'subsystem'

是 SQL Server 代理用于执行 command 的子系统。subsystem 的数据类型为 nvarchar(40)，其默认值为 NULL。

[@command =] 'command'

是通过 subsystem 执行的命令。command 的数据类型为 nvarchar(3200)，其默认值为 NULL。

[@additional_parameters =] 'parameters'

保留。

[@cmdexec_success_code =] success_code

是 CmdExec 子系统命令的返回值，用以指示 command 执行成功。success_code 的数据类型为 int，其默认值为 NULL。

[@on_success_action =] success_action

是该步骤成功后所要执行的操作。success_action 的数据类型为 tinyint，其默认值为 NULL，且可以取下列值之一。

值 | 描述（操作）
1 | 成功后退出
2 | 失败后退出
3 | 转到下一步
4 | 转到步骤 success_step_id

[@on_success_step_id =] success_step_id

是当该步骤成功且 success_action 为 4 时，所要执行的此作业中步骤的标识号。success_step_id 的数据类型为 int，其默认值为 NULL。

[@on_fail_action =] fail_action

是步骤失败后所要执行的操作。fail_action 的数据类型为 tinyint，其默认值为 NULL，且可取下列值之一。

值 | 描述（操作）
1 | 成功后退出。
2 | 失败后退出。
3 | 转到下一步。
4 | 转到步骤 fail_step_id。

[@on_fail_step_id =] fail_step_id

是当该步骤失败且 fail_action 为 4 时，所要执行的此作业中步骤的标识号。fail_step_id 的数据类型为 int，其默认值为 NULL。

[@server =] 'server'

保留。server 的数据类型为 nvarchar(30)，默认值为 NULL。

[@database_name =] 'database'

是 TSQL 步骤要在其中执行的数据库的名称。database 的数据类型为 sysname，其默认值为 NULL。

[@database_user_name =] 'user'

是执行 TSQL 步骤时所使用的用户账号名称。user 的数据类型为 sysname，其默认值为 NULL。

[@retry_attempts =] retry_attempts

是步骤失败时要进行的重试尝试次数。retry_attempts 的数据类型为 int，其默认值为 NULL。

[@retry_interval =] retry_interval

是重试尝试之间的时间（以分钟计）。retry_interval 的数据类型为 int，其默认值为 NULL。

[@os_run_priority =] run_priority

保留。

[@output_file_name =] 'file_name'

是保存该步骤输出的文件的名称。file_name 的数据类型为 nvarchar(200)，其默认值为 NULL。此参数仅对 TSQL 或 CmdExec 子系统内运行的命令有效。

[@flags =] flag

控制行为的选项。flags 的数据类型为 int，可以是下列值之一。

值 | 描述
2 | 追加到输出文件。
4 | 重写输出文件。
0（默认值） | 未设置选项。

返回代码值

0（成功）或 1（失败）

注释

sp_update_jobstep 必须从 msdb 数据库中运行。

更新作业步骤将增加作业的版本号。

权限

执行权限默认授予 public 角色。

示例

下例将作业 Archive Tables 的第 4 步的名称更改为 Sales Detail。

USE msdb
EXEC sp_update_jobstep @job_name = 'Archive Tables', @step_id = 4,
   @step_name = 'Sales Detail'

请参见

修改和查看作业

sp_delete_jobstep

sp_help_jobstep

系统存储过程


sp_update_log_shipping_monitor_info

更新关于日志传送对的监视信息。

语法

sp_update_log_shipping_monitor_info
[@primary_server_name =] 'primary_server_name'
[@primary_database_name =] 'primary_database_name'
[@secondary_server_name =] 'secondary_server_name'
[@secondary_database_name =] 'secondary_database_name'
[,[@backup_threshold =] backup_threshold]
[,[@backup_threshold_alert =] backup_threshold_alert]
[,[@backup_threshold_alert_enabled =] backup_threshold_alert_enabled]
[,[@backup_outage_start_time =] backup_outage_start_time]
[,[@backup_outage_end_time =] backup_outage_end_time]
[,[@backup_outage_weekday_mask =] backup_outage_weekday_mask]
[,[@copy_enabled =] copy_enabled]
[,[@load_enabled =] load_enabled]
[,[@out_of_sync_threshold =] out_of_sync_threshold]
[,[@out_of_sync_threshold_alert =] out_of_sync_threshold_alert]
[,[@out_of_sync_threshold_alert_enabled =] out_of_sync_threshold_alert_enabled]
[,[@out_of_sync_outage_start_time =]out_of_sync_outage_start_time]
[,[@out_of_sync_outage_end_time =] out_of_sync_outage_end_time]
[,[@out_of_sync_outage_weekday_mask =] out_of_sync_outage_weekday_mask]

参数

[@primary_server_name =] 'primary_server_name'

主服务器名称。primary_server_name 的数据类型为 sysname，没有默认值。

[@primary_database_name =] 'primary_database_name'

主服务器上的数据库名称。primary_database_name 的数据类型为 sysname，没有默认值。

[@secondary_server_name =] 'secondary_server_name'

第二台服务器的名称。secondary_server_name 的数据类型为 sysname，没有默认值。

[@secondary_database_name =] 'secondary_database_name'

是辅助服务器上的数据库名称。secondary_database_name 的数据类型为 sysname，无默认值。

[@backup_threshold =] backup_threshold

是从上一次备份之后，至引发阈值警报错误之前的时间长度（以分钟计）。backup_threshold 的数据类型为 int，其默认值为 NULL。

[@backup_threshold_alert =] backup_threshold_alert

是超出备份阈值时引发的错误。backup_threshold_alert 的数据类型为 int，其默认值为 NULL。

[@backup_threshold_alert_enabled =] backup_threshold_alert_enabled

指定当超出 backup_threshold 值时是否发出警报。数字 1 表示将引发警报。backup_threshold_alert_enabled 的数据类型为 bit，其默认值为 NULL。

[@backup_outage_start_time =] backup_outage_start_time

是计划停歇开始的时间，以 HHMMSS 格式表示。在计划停歇期间，超出备份阈值时不会引发警报。backup_outage_start_time 的数据类型为 int，其默认值为 NULL。

[@backup_outage_end_time =] backup_outage_end_time

是计划停歇终止的时间，以 HHMMSS 格式表示。backup_outage_end_time 的数据类型为 int，其默认值为 NULL。

[@backup_outage_weekday_mask =] backup_outage_weekday_mask

表示计划停歇发生在一周中的哪一天。backup_outage_weekday_mask 的数据类型为 int，其默认值为 NULL。它可以是下列值中的一个或多个。

值 | 天
1 | 星期日
2 | 星期一
4 | 星期二
8 | 星期三
16 | 星期四
32 | 星期五
64 | 星期六

[@copy_enabled =] copy_enabled

指定是否在第二台服务器上启用数据库的副本。数值 1 表明启用复制。copy_enabled 的数据类型为 bit，其默认值为 NULL。

[@load_enabled =] load_enabled

指定是否在辅助服务器上启用数据库装载。load_enabled 的数据类型为 bit，其默认值为 NULL。

[@out_of_sync_threshold =] out_of_sync_threshold

是从上一次装载之后至引发错误之前的时间长度（以分钟计）。out_of_sync_threshold 的数据类型为 int，其默认值为 NULL。

[@out_of_sync_threshold_alert =] out_of_sync_threshold_alert

是超出不同步阈值时引发的错误。out_of_sync_threshold_alert 的数据类型为 int，其默认值为 NULL。

[@out_of_sync_threshold_alert_enabled =] out_of_sync_threshold_alert_enabled

指定当超出不同步阈值时是否引发警报。数值 1 表明将引发警报。out_of_sync_threshold_alert_enabled 的数据类型为 bit，其默认值为 NULL。

[@out_of_sync_outage_start_time =] out_of_sync_outage_start_time

是计划停歇开始的时间，以 HHMMSS 格式表示。在计划停歇期间，超出不同步阈值不会引发警报。out_of_sync_outage_start_time 的数据类型为 int，其默认值为 NULL。

[@out_of_sync_outage_end_time =] out_of_sync_outage_end_time

是计划停歇终止的时间，以 HHMMSS 格式表示。out_of_sync_outage_end_time 的数据类型为 int型，其默认值为 NULL。

[@out_of_sync_outage_weekday_mask =] out_of_sync_outage_weekday_mask

表示计划停歇发生在一周中的哪一天。out_of_sync_outage_weekday_mask 的数据类型为 int，其默认值为 NULL。它可以是下列值中的一个或多个。

值 | 天
1 | 星期日
2 | 星期一
4 | 星期二
8 | 星期三
16 | 星期四
32 | 星期五
64 | 星期六

返回代码值

0（成功）或 1（失败）

注释

此存储过程既在表 log_shipping_primaries 中更新主服务器，又在表 log_shipping_secondaries 中更新辅助服务器。

权限

只有 sysadmin 固定服务器角色的成员才能执行 sp_update_log_shipping_monitor_info。


sp_update_log_shipping_plan

更新有关现有日志传送计划的信息。

语法

sp_update_log_shipping_plan [@plan_id =] plan_id,
[@plan_name =] 'plan_name',
[@description =] 'description',
[@source_server =] 'source_server',
[@source_dir =] 'source_dir',
[@destination_dir =] 'destination_dir',
[@copy_job_id =] copy_job_id,
[@load_job_id =] load_job_id,
[@history_retention_period =] history_retention_period,
[@file_retention_period =] file_retention_period

参数

[@plan_id =] plan_id

是数据库所属于的计划的标识号。plan_id 的数据类型为 uniqueidentifier，其默认值为 NULL。

[@plan_name =] 'plan_name'

是数据库所属于的计划的名称。plan_name 的数据类型为 sysname，其默认值为 NULL。

说明 必须指定 plan_id 或 plan_name 两者之一，但不能两者都指定。

[@description =] 'description'

是计划的描述。description 的数据类型为 nvarchar(500)，其默认值为 NULL。

[@source_server =] 'source_server'

是源服务器的名称。source_server 的数据类型为 sysname，其默认值为 NULL。

[@source_dir =] 'source_dir'

是目录的完整路径，事务日志文件将从该目录复制。source_dir 的数据类型为 nvarchar(500)，其默认值为 NULL。

[@destination_dir =] 'destination_dir'

是复制事务日志文件的目的目录。destination_dir 的数据类型为 nvarchar(500)，其默认值为 NULL。

[@copy_job_id =] copy_job_id

是复制作业的作业 ID。copy_job_id 的数据类型为 uniqueidentifier，其默认值为 NULL。

[@load_job_id =] load_job_id

是装载作业的作业 ID。load_job_id 的数据类型为 uniqueidentifier，其默认值为 NULL。

[@history_retention_period =] history_retention_period

是历史记录要保留的时间长度（以分钟计）。history_retention_period 的数据类型为 int，其默认值为 NULL。

[@file_retention_period =] file_retention_period

是事务日志文件复制后的保留时间长度（以分钟计）。file_retention_period 的数据类型为 int，其默认值为 NULL。

返回代码值

0（成功）或 1（失败）

权限

只有 sysadmin 固定服务器角色的成员才能执行 sp_update_log_shipping_plan。

示例

下例用新的目的目录和文件保留期更新计划"Pubs database backup"。

EXEC   msdb.dbo.sp_update_log_shipping_plan
   @plan_name = N'Pubs database backup',
   @destination_dir = N'e:\log shipping',
   @history_retention_period = 4320


sp_update_log_shipping_plan_database

更新作为日志传送计划一部分的数据库。

语法

sp_update_log_shipping_plan_database
[@destination_database =] 'destination_database',
[@load_delay =] load_delay,
[@load_all =] load_all,
[@file_retention_period =] file_retention_period,
[@copy_enabled =] copy_enabled,
[@load_enabled =] load_enabled
 [@recover_db =] recover_db
[@terminate_users =] terminate_users

参数

[@destination_database =] 'destination_database'

是辅助数据库的名称。destination_database 的数据类型为 sysname，并且是必须提供的参数。

[@load_delay =] load_delay

是事务日志装载之前的时间长度（以分钟计）。load_delay 的数据类型为 int，其默认值为零 (0)。

[@load_all =] load_all

指定运行作业时是否装载所有新复制的事务日志。0 表示只装载一个事务日志。load_all 的数据类型为 bit，其默认值为 1。

[@file_retention_period =] file_retention_period

在删除之前将日志记录文件存储在第二个服务器上的时间长度，以分钟单位。file_retention_period 的数据类型为 int，默认值为 2,880 分钟（两天）。

[@copy_enabled =] copy_enabled

指定是否执行复制。1 表示应执行复制；0 表示不执行复制。copy_enabled 的数据类型为 bit。

[@load_enabled =] load_enabled

指定是否执行装载。1 表示应执行装载；0 表示不执行装载。load_enabled 的数据类型为 bit。

[@recover_db =] recover_db

指定数据库的状态。一 (1) 表示用 STANDBY 还原日志；而零 (0) 表示用 NORECOVERY 还原日志。recover_db 的数据类型为 bit。

[@terminate_users =] terminate_users

指定辅助服务器是否应当终止用户。值一 (1) 表示应终止用户；而零 (0) 表示不应终止用户。terminate_users 的数据类型为 bit。

返回代码值

0（成功）或 1（失败）

注释

此存储过程应在辅助服务器上执行，辅助服务器是目的数据库。

权限

只有 sysadmin 固定服务器角色的成员才能执行 sp_update_log_shipping_plan_database。

示例

下例从数据库"pubs_standby"中取消装载延时。

EXEC   msdb.dbo.sp_update_log_shipping_plan_database
   @destination_database = N'pubs_standby',
   @load_delay = 0


sp_update_notification

更新警报提示的提示方法。

语法

sp_update_notification [@alert_name =] 'alert',
[@operator_name =] 'operator',
[@notification_method =] notification

参数

[@alert_name =] 'alert'

是与此提示相关联的警报名称。alert 的数据类型为 sysname，无默认值。

[@operator_name =] 'operator'

是警报发生时所要通知的操作员。operator 的数据类型为 sysname，无默认值。

[@notification_method =] notification

是通知操作员的方法。notification 的数据类型为 tinyint，无默认值，且可以取下列值中的一个或多个值。

值 | 描述
1 | 电子邮件
2 | 呼叫程序
4 | net send
7 | 所有方法

返回代码值

0（成功）或 1（失败）

注释

sp_update_notification 必须从 msdb 数据库中运行。

可以为不具有指定的 notification_method 所必需的地址信息的操作员更新提示。如果发送电子邮件或呼叫程序提示时出现故障，则该故障将被记录到 SQL Server 代理程序错误日志。

权限

只有 sysadmin 固定服务器角色的成员才能执行 sp_update_notification。

示例

下例为发送给 stevenb 的提示修改提示方法，该提示是为警报 Test Alert 发送的。

USE msdb
EXEC sp_update_notification 'Test Alert', 'stevenb', 7

请参见

sp_add_notification

sp_delete_notification

sp_help_notification

系统存储过程


sp_update_operator

更新警报和作业所用的操作员（提示接收人）信息。

语法

sp_update_operator [@name =] 'name'
[, [@new_name =] 'new_name']
[, [@enabled =] enabled]
    [, [@email_address =] 'email_address']
[, [@pager_address =] 'pager_number']
[, [@weekday_pager_start_time =] weekday_pager_start_time]
[, [@weekday_pager_end_time =] weekday_pager_end_time]
[, [@saturday_pager_start_time =] saturday_pager_start_time]
[, [@saturday_pager_end_time =] saturday_pager_end_time]
[, [@sunday_pager_start_time =] sunday_pager_start_time]
[, [@sunday_pager_end_time =] sunday_pager_end_time]
[, [@pager_days =] pager_days]
[, [@netsend_address =] 'netsend_address']
[, [@category_name =] 'category']

参数

[@name =] 'name'

是要修改的操作员的名称，name 的数据类型为 sysname，无默认值。

[@new_name =] 'new_name'

是操作员的新名称。此名称必须是唯一的。new_name 的数据类型为 sysname，其默认值为 NULL。

[@enabled =] enabled

是表示操作员当前状态的数字（若当前已启用，其值为 １，若当前未启用，其值为 ０）。enabled 的数据类型为 tinyint，其默认值为 NULL。如果未启用，操作员将不会收到警报提示。

[@email_address =] 'email_address'

操作员的电子邮件地址。该字符串直接传递到电子邮件系统。email_address 的数据类型为 nvarchar(100)，默认值为 NULL。

[@pager_address =] 'pager_number'

操作员的呼叫程序地址。此字符串将直接传递给电子邮件系统。pager_number 的数据类型为 nvarchar(100)，其默认值为 NULL。

[@weekday_pager_start_time =] weekday_pager_start_time

指定从星期一到星期五可向此操作员发送呼叫提示的起始时间。weekday_pager_start_time 的数据类型为 int，其默认值为 NULL，且必须以 24 小时时钟的 HHMMSS 格式输入。

[@weekday_pager_end_time =] weekday_pager_end_time

指定从星期一到星期五可向指定操作员发送呼叫提示的终止时间。weekday_pager_end_time 的数据类型为 int，其默认值为 NULL，且必须以 24 小时时钟的 HHMMSS 格式输入。

[@saturday_pager_start_time =] saturday_pager_start_time

指定在星期六可向指定操作员发送呼叫提示的起始时间。saturday_pager_start_time 的数据类型为 int，其默认值为 NULL，且必须以 24 小时时钟的 HHMMSS 格式输入。

[@saturday_pager_end_time =] saturday_pager_end_time

指定在星期六可向指定操作员发送呼叫提示的终止时间。saturday_pager_end_time 的数据类型为 int，其默认值为 NULL，且必须以 24 小时时钟的 HHMMSS 格式输入。

[@sunday_pager_start_time =] sunday_pager_start_time

指定在星期日可向指定操作员发送呼叫提示的起始时间。sunday_pager_start_time 的数据类型为 int，其默认值为 NUL，且必须以 24 小时时钟的 HHMMSS 格式输入。

[@sunday_pager_end_time =] sunday_pager_end_time

指定在星期日可向指定操作员发送呼叫提示的终止时间。sunday_pager_end_time 的数据类型为 int，其默认值为 NULL，且必须以 24 小时时钟的 HHMMSS 格式输入。

[@pager_days =] pager_days

指定一星期中哪些天操作员可以接收呼叫（局限于指定的起始/终止时间）。pager_days 的数据类型为 tinyint，其默认值为 NULL，且必须介于 0 至 127 之间。pager_days 通过将所需的那些天对应的单个数值逐个相加而得到。例如，从星期一到星期五为 2+4+8+16+32 = 62。

值 | 描述
1 | 星期日
2 | 星期一
4 | 星期二
8 | 星期三
16 | 星期四
32 | 星期五
64 | 星期六

[@netsend_address =] 'netsend_address'

网络消息发送到的操作员的网络地址。netsend_address 的数据类型为 nvarchar(100)，默认值为 NULL。

[@category_name =] 'category'

该警报的类别名称。category 的数据类型为 sysname，默认值为 NULL。

返回代码值

0（成功）或 1（失败）

注释

sp_update_operator 必须从 msdb 数据库中运行。

权限

只有 sysadmin 固定服务器角色的成员才能执行 sp_update_operator。

示例

下例将操作员状态更新为启用，并设置可以呼叫该操作员的时间（星期一至星期五，早上八点至下午五点）。

USE msdb
EXEC sp_update_operator @name = 'Steven Buchanan', @enabled = 1,
   @email_address = 'stevenb',
   @pager_address = '5673218@mypagerco.com',
   @weekday_pager_start_time = 080000,
   @weekday_pager_end_time = 170000,
   @pager_days = 62

请参见

sp_add_operator

sp_delete_operator

sp_help_operator

系统存储过程


sp_update_targetservergroup

更改指定目标服务器组的名称。

语法

sp_update_targetservergroup [@name =] 'current_name'
[, [@new_name =] 'new_name']

参数

[@name =] 'current_name'

是目标服务器组的名称。current_name 的数据类型为 sysname，无默认值。

[@new_name =] 'new_name'

是目标服务器组的新名称。new_name 的数据类型为 sysname，无默认值。

返回代码值

0（成功）或 1（失败）

权限

只有 sysadmin 固定服务器角色的成员才能执行 sp_update_targetservergroup。

注释

sp_update_targetservergroup 必须从 msdb 数据库中运行。

示例

下例将目标服务器组 Weekly Bakups 更新为 Weekly Backups。

USE msdb
EXEC sp_update_targetservergroup 'Weekly Bakups', 'Weekly Backups'

请参见

sp_add_targetservergroup

sp_delete_targetservergroup

sp_help_targetservergroup

系统存储过程


sp_updateextendedproperty

更新现有扩展属性的值。

语法

sp_updateextendedproperty
[@name =]{'property_name'}
[, [@value =]{'value'}
[, [@level0type =]{'level0_object_type'}
, [@level0name =]{'level0_object_name'}
[, [@level1type =]{'level1_object_type'}
, [@level1name =]{'level1_object_name'}
[, [@level2type =]{'level2_object_type'}
, [@level2name =]{'level2_object_name'}
]
            ]
        ]
    ]

参数

[@name =]{'property_name'}

是要更新的属性名称。property_name 的数据类型为 sysname，且不能是 NULL。

[@value =]{'value'}

是与属性相关联的值。value 的数据类型为 sql_variant，其默认值为 NULL。value 的大小不能超过 7,500 字节；否则 SQL Server™ 会产生错误。

[@level0type =]{'level0_object_type'}

用户或用户定义类型。level0_object_type 的数据类型为 varchar(128)，其默认值为 NULL。有效的输入是 USER、TYPE 和 NULL。

[@level0name =]{'level0_object_name'}

是指定的 1 级对象类型的名称。level0_object_name 的数据类型为 sysname，默认设置为 NULL。

[@level1type =]{'level1_object_type'}

是 1 级对象的类型。level1_object_type 的数据类型为 varchar(128)，默认设置为 NULL。有效的输入是 TABLE、VIEW、PROCEDURE、FUNCTION、DEFAULT、RULE 和 NULL。

[@level1name =]{'level1_object_name'}

是指定的 1 级对象类型的名称。level1_object_name 的数据类型为 sysname，默认设置为 NULL。

[@level2type =]{'level2_object_type'}

2 级对象的类型。level2_object_type 的数据类型为 varchar(128)，默认设置为 NULL。有效的输入是 COLUMN、PARAMETER、INDEX、CONSTRAINT、TRIGGER 和 NULL。

[@level2name =]{'level2_object_name'}

是指定的 2 级对象类型的名称。level2_object_name 的数据类型为 sysname，默认设置为 NULL。

返回代码值

0（成功）或 1（失败）

注释

系统对象不允许有扩展属性。

对象是按级别区分的，0 级为最高，2 级为最低。当用户添加、更新或删除扩展属性时，必须指定所有更高级别的对象。例如，如果用户要向 1 级对象添加扩展属性，就必须指定所有 0 级信息。如果用户要向 2 级对象添加扩展属性，就必须提供关于 0 级和 1 级的所有信息。

在每个级别上，对象类型和对象名可唯一地标识对象。如果指定了一个对中的任一方，则必须指定另一方。

给定有效的 property_name 和 value，如果所有的对象类型和名称均为空值，那么要更新的属性就属于当前数据库。如果指定对象类型和名称，则还必须指定父对象和类型。否则，SQL Server 会产生错误。

权限

db_owner 和 db_ddladmin 固定数据库角色的成员可以更新任何对象的扩展属性。用户可以对其所拥有的对象更新扩展属性。但是，只有 db_owner 才可以更新用户名属性。

示例

下例为表"T1"中的"ID"列更新属性（"caption"，"Employee 1 ID"）。

CREATE   table T1 (id int , name char (20))
EXEC   sp_addextendedproperty 'caption', 'Employee ID', 'user', dbo, 'table', 'T1', 'column', id
EXEC   sp_updateextendedproperty 'caption', 'Employee 1 ID', 'user', dbo, 'table', 'T1', 'column', id

请参见

fn_listextendedproperty

属性管理


sp_updatestats

对当前数据库中所有用户定义的表运行 UPDATE STATISTICS。

语法

sp_updatestats [[@resample =] 'resample']

返回代码值

0（成功）或 1（失败）

参数

[@resample =] 'resample'

指定 sp_updatestats 将使用 UPDATE STATISTICS 命令的 RESAMPLE 选项。新统计表将继承旧统计表的采样比率。如果未指定 'resample'，则 sp_updatestats 使用默认采样更新统计表。该参数的数据类型为 varchar(8)，默认值为 'NO'。

注释

sp_updatestats 会显示表示其进度的消息。完成更新之后，该存储过程将报告已为所有的表更新了统计信息。

权限

只有 DBO 和 sysadmin 固定服务器角色的成员才能执行该过程。

示例

下例为数据库 pubs 中的表更新统计信息。

USE pubs
EXEC sp_updatestats

请参见

CREATE INDEX

CREATE STATISTICS

DBCC SHOW_STATISTICS

DROP STATISTICS

sp_autostats

sp_createstats

sp_dboption

系统存储过程

UPDATE STATISTICS


sp_updatetask

提供 sp_updatetask 只是为了向后兼容性。有关 Microsoft® SQL Server™ 7.0 版替换过程的更多信息，请参见 SQL Server 向后兼容性详细信息。

更新有关任务的信息。

重要 有关 SQL Server 早期版本中使用的语法的更多信息，请参见用于 6.x 版的《Microsoft SQL Server Transact-SQL 参考》。

注释

若要进行任务管理，请使用 SQL Server 企业管理器。

权限

执行权限默认授予 public 角色。

请参见

sp_addtask

sp_droptask

系统存储过程


sp_validatelogins

报告有关孤立的 Microsoft® Windows NT® 用户和组的信息，这些用户和组已不在 Windows NT 环境中，但仍在 Microsoft SQL Server™ 系统表中拥有项。

语法

sp_validatelogins

返回代码值

0（成功）或 1（失败）

结果集
列名 | 数据类型 | 描述
SID | varbinary(85) | Windows NT 用户或组的 Windows NT 安全标识符。
NT Login | sysname | Windows NT 用户或组的名称。

注释

孤立 Windows NT 用户和组在系统表中的条目只能用存储过程 sp_revokelogin 删除。如果该 Windows NT 用户或组在数据库中有用户帐户，可用存储过程 sp_revokedbaccess 将其删除。必须先删除数据库中的用户帐户，然后才能废除登录对 SQL Server 的连接访问权。

如果该 Windows NT 用户或组在数据库中拥有对象，那么必须删除这些对象，或者用存储过程 sp_changeobjectowner 将其所有权移交给另一用户。

权限

只有 sysadmin 或 securityadmin 固定服务器角色的成员才能执行 sp_validatelogins。

示例

下例显示已不存在但仍被授权连接到 SQL Server 的 Windows NT 用户和组。

EXEC sp_validatelogins
GO

SID                                                        NT Login
---------------------------------------------------------- -----------
0x0105000000000005150000007961275C521FE65395177650FC030000 dom\andrew
0x0105000000000005150000007961275C521FE65395177650FA030000 dom\joe
0x0105000000000005150000007961275C521FE65395177650FB030000 dom\margaret
0x0105000000000005150000007961275C521FE65395177650F3030000 dom\mike

请参见

sp_changeobjectowner

sp_revokedbaccess

sp_revokelogin

系统存储过程


sp_validname

检查 Microsoft® SQL Server™ 标识符名称的有效性。所有非二进制及非零数据，包括可用 nchar、nvarchar 或 ntext 数据类型存储的 Unicode 数据，都是可供标识符名称使用的有效字符。

语法

sp_validname [@name =] 'name'
[, [@raise_error =] raise_error]

参数

[@name =] 'name'

是要检查有效性的标识符名称。name 的数据类型为 sysname，无默认值。name 不能是 NULL，不能是空字符串，也不能包含二进制零字符。

[@raise_error =] raise_error

指定是否引发错误。raise_error 的数据类型为 bit，其默认值为 １，表示应显示错误。0 将导致不显示错误信息。

返回代码值

0（成功）或 1（失败）

权限

执行权限默认授予 public 角色。

请参见

数据类型

NCHAR

nchar 和 nvarchar

ntext、text 和 image

系统存储过程

使用标识符


sp_who

提供关于当前 Microsoft® SQL Server™ 用户和进程的信息。可以筛选返回的信息，以便只返回那些不是空闲的进程。

语法

sp_who [[@login_name =] 'login']

参数

[@login_name =] 'login'

是 SQL Server 上的用户登录名。login 的数据类型为 sysname，默认值是 NULL。如果没有指定名称，过程将报告全部活动的 SQL Server 用户。login 也可以是特定进程标识号码 (SPID)。若要返回有关活动进程的信息，请指定 ACTIVE。ACTIVE 从报告中排除等待用户下一个命令的进程。

返回代码值

0（成功）或 1（失败）

结果集

sp_who 返回包含以下信息的结果集。

列 | 数据类型 | 描述
spid | smallint | 系统进程 ID。
ecid | smallint | 与指定 SPID 相关联的给定线程的执行上下文 ID。 ECID = {0, 1, 2, 3, ...n}，其中 0 始终表示主或父线程，并且 {1, 2, 3, ...n} 表示子线程。
status | nchar(30) | 进程状态。
loginame | nchar(128) | 与特定进程相关联的登录名。
hostname | nchar(128) | 每个进程的主机或计算机名。
blk | char(5) | 如果存在阻塞进程，则是该阻塞进程的系统进程 ID。否则该列为零。 当与给定的 spid 相关联的事务受到孤立分布式事务的阻塞时，该列将对阻塞孤立事务返回 '-2'。
dbname | nchar(128) | 进程使用的数据库。
cmd | nchar(16) | 为此进程执行的 SQL Server 命令（Transact-SQL 语句、SQL Server 内部引擎处理等）。

sp_who 结果集将根据 spid 值按升序排序。如果是并行处理，则会为特定的 spid 创建子线程。主线程表示为 spid =xxx，并且 ecid =0。其余的子线程同样也是 spid = xxx，但 ecid > 0。这样，将会为该 spid 编号返回多行 — 它们在整个列表中放置该 spid 的位置组合在一起。子线程将随机排列，但父线程除外 (ecid = 0)；在该 spid 中，父线程被首先列出。

注释

阻塞进程（可能含有排它锁）是控制其它进程所需要的资源的进程。

在 SQL Server 2000 中，所有孤立 DTC 事务的 SPID 都被赋予值 '-2'。孤立 DTC 事务就是不与任何 SPID 相关联的分布式事务。这样，当某一孤立事务阻塞其它进程时，可由其特殊的 '-2' SPID 值来识别该孤立分布式事务。有关更多信息，请参见 KILL。

SQL Server 2000 保留从 1 到 50 的 SPID 值以便内部使用，而 51 或更大的 SPID 值则代表用户会话。

权限

执行权限默认授予 public 角色。

示例
A. 列出全部当前进程

此示例使用没有参数的 sp_who 报告所有当前用户。

USE master
EXEC sp_who

下面是结果集：

spid ecid status     loginame       hostname  blk dbname cmd
---- ---- ------     ------------   --------  --- ------ -----
1    0    background sa                       0   pubs   LAZY WRITER
2    0    sleeping   sa                       0   pubs   LOG WRITER
3    0    background sa                       0   master SIGNAL HANDLER
4    0    background sa                       0   pubs   RA MANAGER
5    0    background sa                       0   master TASK MANAGER
6    0    sleeping   sa                       0   pubs   CHECKPOINT SLEEP
7    0    background sa                       0   master TASK MANAGER
8    0    background sa                       0   master TASK MANAGER
9    0    background sa                       0   master TASK MANAGER
10   0    background sa                       0   master TASK MANAGER
11   0    background sa                       0   master TASK MANAGER
51   0    runnable   DOMAIN\loginX  serverX   0   Nwind  BACKUP DATABASE
51   2    runnable   DOMAIN\loginX  serverX   0   Nwind  BACKUP DATABASE
51   1    runnable   DOMAIN\loginX  serverX   0   Nwind  BACKUP DATABASE
52   0    sleeping   DOMAIN\loginX  serverX   0   master AWAITING COMMAND
53   0    runnable   DOMAIN\loginX  serverX   0   pubs   SELECT
(16 row(s) affected)
B. 列出特定用户的进程

此示例显示如何通过登录名查看有关单个当前用户的信息。

USE master
EXEC sp_who 'janetl'
C. 显示所有活动进程
USE master
EXEC sp_who 'active'
D. 通过进程 ID 显示特定进程
USE master
EXEC sp_who '10' --specifies the process_id

请参见

KILL

sp_lock

sysprocesses

系统存储过程


sp_xml_preparedocument

读取作为输入提供的可扩展标记语言 (XML) 文本，然后使用 MSXML 语法分析器 (Msxml2.dll) 对其进行分析，并提供分析后的文档供您使用。分析后的文档是 XML 文档中各节点（元素、特性、文本、注释等）的树型表示法。

sp_xml_preparedocument 返回一个句柄，可用于访问 XML 文档的新创建的内部表示方式。该句柄在连接到 Microsoft® SQL Server™ 2000 期间保持有效，直到重置连接或执行 sp_xml_removedocument 使句柄无效为止。

说明 分析过的文档存储在 SQL Server 2000 的内部高速缓存中。MSXML 语法分析器使用 SQL Server 可用总内存的八分之一。若要避免内存不足，请运行 sp_xml_removedocument 以释放内存。

语法

sp_xml_preparedocument hdoc OUTPUT
[, xmltext]
[, xpath_namespaces]

参数

hdoc

是新创建的文档的句柄。hdoc 的数据类型为 integer。

[xmltext]

是原 XML 文档。MSXML 语法分析器分析该 XML 文档。xmltext 是 text 类型（char、nchar、varchar、nvarchar、text 或 ntext）的参数。默认值是 NULL，在这种情况下，将创建空 XML 文档的内部表示法。

[xpath_namespaces]

指定 OPENXML 的行和列 XPath 表达式中所使用的命名空间声明。默认值是 <root xmlns:mp="urn:schemas-microsoft-com:xml-metaprop">。
xpath_namespaces 通过符合语法规则的 XML 文档的方式，为在 OPENXML 的 Xpath 表达式中使用的前缀提供命名空间 URI。xpath_namespaces 声明前缀必须用于引用命名空间 urn:schemas-microsoft-com:xml-metaprop，该命名空间提供有关分析后的 XML 元素的元数据。尽管可以使用此方法为元属性命名空间重新定义命名空间前缀，但此命名空间不会丢失。此前缀 mp 对 urn:schemas-microsoft-com:xml-metaprop 仍有效，即使 xpath_namespaces 不包含此类声明。xpath_namespaces 是 text 类型（char、nchar、varchar、nvarchar、text 或 ntext）的参数。

返回代码值

0（成功）或 >0（失败）

权限

执行权限默认授予 public 角色。

示例
A. 为符合语法规则的 XML 文档准备内部表示方式

下例返回作为输入提供的新创建的 XML 文档内部表示法的句柄。在对 sp_xml_preparedocument 的调用中，使用了默认命名空间前缀映射。

DECLARE @hdoc int
DECLARE @doc varchar(1000)
SET @doc ='
<ROOT>
<Customer CustomerID="VINET" ContactName="Paul Henriot">
   <Order CustomerID="VINET" EmployeeID="5" OrderDate="1996-07-04T00:00:00">
      <OrderDetail OrderID="10248" ProductID="11" Quantity="12"/>
      <OrderDetail OrderID="10248" ProductID="42" Quantity="10"/>
   </Order>
</Customer>
<Customer CustomerID="LILAS" ContactName="Carlos Gonzlez">
   <Order CustomerID="LILAS" EmployeeID="3" OrderDate="1996-08-16T00:00:00">
      <OrderDetail OrderID="10283" ProductID="72" Quantity="3"/>
   </Order>
</Customer>
</ROOT>'
--Create an internal representation of the XML document.
EXEC sp_xml_preparedocument @hdoc OUTPUT, @doc
-- Remove the internal representation.
exec sp_xml_removedocument @hdoc
B. 为带 DTD 的符合语法规则的 XML 文档准备内部表示方式

下例返回作为输入提供的新创建的 XML 文档内部表示法的句柄。存储过程根据文档中包含的 DTD 来验证装载的文档。在对 sp_xml_preparedocument 的调用中，使用了默认命名空间前缀映射。

DECLARE @hdoc int
DECLARE @doc varchar(2000)
SET @doc = '
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE root
[<!ELEMENT root (Customers)*>
<!ELEMENT Customers EMPTY>
<!ATTLIST Customers CustomerID CDATA #IMPLIED ContactName CDATA #IMPLIED>]>
<root>
<Customers CustomerID="ALFKI" ContactName="Maria Anders"/>
</root>'

EXEC sp_xml_preparedocument @hdoc OUTPUT, @doc
C. 指定命名空间 URI

下例返回作为输入提供的新创建的 XML 文档内部表示法的句柄。在对 sp_xml_preparedocument 的调用中，保留了元属性命名空间映射的 mp 前缀，并将 xyz 映射前缀添加到了命名空间 urn:MyNamespace。

DECLARE @hdoc int
DECLARE @doc varchar(1000)
SET @doc ='
<ROOT>
<Customer CustomerID="VINET" ContactName="Paul Henriot">
   <Order CustomerID="VINET" EmployeeID="5"
           OrderDate="1996-07-04T00:00:00">
      <OrderDetail OrderID="10248" ProductID="11" Quantity="12"/>
      <OrderDetail OrderID="10248" ProductID="42" Quantity="10"/>
   </Order>
</Customer>
<Customer CustomerID="LILAS" ContactName="Carlos Gonzlez">
   <Order CustomerID="LILAS" EmployeeID="3"
           OrderDate="1996-08-16T00:00:00">
      <OrderDetail OrderID="10283" ProductID="72" Quantity="3"/>
   </Order>
</Customer>
</ROOT>'
--Create an internal representation of the XML document.
EXEC sp_xml_preparedocument @hdoc OUTPUT, @doc, '<root xmlns:xyz="run:MyNamespace"/>'

请参见

sp_xml_removedocument


sp_xml_removedocument

删除文档句柄指定的 XML 文档的内部表示方式并使该文档句柄无效。

说明 分析过的文档保存在 Microsoft® SQL Server™ 2000 的内部高速缓存中。MSXML 语法分析器使用 SQL Server 可用总内存的八分之一。若要避免内存不足，请运行 sp_xml_removedocument 以释放内存。

语法

sp_xml_removedocument hdoc

参数

hdoc

是新创建的文档的句柄。无效句柄返回错误。hdoc 的数据类型为 integer。

返回代码值

0（成功）或 >0（失败）

权限

执行权限默认授予 public 角色。

示例
A. 删除 XML 文档

下例删除 XML 文档的内部表示法。该文档的句柄作为输入提供。

EXEC sp_xml_removedocument @hdoc

请参见

sp_xml_preparedocument


xp_cmdshell

以操作系统命令行解释器的方式执行给定的命令字符串，并以文本行方式返回任何输出。授予非管理用户执行 xp_cmdshell 的权限。

说明 在 Microsoft® Windows® 95 或 Microsoft Windows 98 操作系统中执行 xp_cmdshell 时，将不把 xp_cmdshell 的返回代码设置为唤醒调用的可执行文件的进程退出代码。返回代码始终为 0。

语法

xp_cmdshell {'command_string'} [, no_output]

参数

'command_string'

是在操作系统命令行解释器上执行的命令字符串。command_string 的数据类型为 varchar(255) 或 nvarchar(4000)，没有默认值。command_string 不能包含一对以上的双引号。如果由 command_string 引用的文件路径或程序名称中有空格，则需要使用一对引号。如果使用嵌入空格不方便，可考虑使用 FAT 8.3 文件名作为解决办法。

no_output

是可选参数，表示执行给定的 command_string，但不向客户端返回任何输出。

返回代码值

0（成功）或 1（失败）

结果集

执行下列 xp_cmdshell 语句将返回当前目录的目录列表。

xp_cmdshell 'dir *.exe'

行以 nvarchar(255) 列的形式返回。

执行下列 xp_cmdshell 语句将返回随后的结果集：

xp_cmdshell 'dir *.exe', NO_OUTPUT

下面是结果：

The command(s) completed successfully.
注释

xp_cmdshell 以同步方式操作。在命令行解释器命令执行完毕之前，不会返回控制。

当授予用户执行权限时，用户能在 Microsoft Windows NT® 命令行解释器上执行运行 Microsoft SQL Server™ 的帐户有权执行的任何操作系统命令。

默认情况下，只有 sysadmin 固定服务器角色的成员才能执行此扩展存储过程。但是，也可以授予其他用户执行此存储过程的权限。

当作为 sysadmin 固定服务器角色成员的用户唤醒调用 xp_cmdshell 时，将在运行 SQL Server 服务的安全上下文中执行 xp_cmdshell。当用户不是 sysadmin 组的成员时，xp_cmdshell 将模拟使用 xp_sqlagent_proxy_account 指定的 SQL Server 代理程序的代理帐户。如果代理帐户不能用，则 xp_cmdshell 将失败。这只是针对于 Microsoft® Windows NT® 4.0 和 Windows 2000。在 Windows 9.x 上，没有模拟，且 xp_cmdshell 始终在启动 SQL Server 的 Windows 9.x 用户的安全上下文下执行。

说明 在早期版本中，获得 xp_cmdshell 执行权限的用户在 MSSQLServer 服务的用户帐户上下文中运行命令。可以通过配置选项配置 SQL Server，以便对 SQL Server 无 sa 访问权限的用户能够在 SQLExecutiveCmdExec Windows NT 帐户的上下文中运行 xp_cmdshell。在 SQL Server 7.0 中，该帐户称为 SQLAgentCmdExec。现在，不是 sysadmin 固定服务器角色成员的用户将在该帐户上下文中运行命令，而无需再进行配置更改。

权限

xp_deletemail 的执行权限默认授予 sysadmin 固定服务器角色的成员，但可以授予其他用户。

重要 如果为 MSSQLServer 服务选用的 Windows NT 帐户不是本地管理员组的成员，则非 sysadmin 固定服务器角色成员的用户将无法执行 xp_cmdshell。

示例
A. 返回可执行文件列表

下例显示执行目录命令的 xp_cmdshell 扩展存储过程。

EXEC master..xp_cmdshell 'dir *.exe'
B. 使用 Windows NT net 命令

下例显示 xp_cmdshell 在存储过程中的使用。下例先用 net send 通知用户 SQL Server 即将关闭，然后用 net pause 暂停服务器，最后用 net stop 关闭服务器。

CREATE PROC shutdown10
AS
EXEC xp_cmdshell 'net send /domain:SQL_USERS ''SQL Server shutting down
   in 10 minutes. No more connections allowed.', no_output
EXEC xp_cmdshell 'net pause sqlserver'
WAITFOR DELAY '00:05:00'
EXEC xp_cmdshell 'net send /domain: SQL_USERS ''SQL Server shutting down
   in 5 minutes.', no_output
WAITFOR DELAY '00:04:00'
EXEC xp_cmdshell 'net send /domain:SQL_USERS ''SQL Server shutting down
   in 1 minute. Log off now.', no_output
WAITFOR DELAY '00:01:00'
EXEC xp_cmdshell 'net stop sqlserver', no_output
C. 不返回输出

下例使用 xp_cmdshell 执行命令字符串，且不向客户端返回输出。

USE master
EXEC xp_cmdshell 'copy c:\sqldumps\pubs.dmp \\server2\backups\sqldumps',
   NO_OUTPUT
D. 使用返回状态

在下例中，xp_cmdshell 扩展存储过程也给出了返回状态。返回代码值存储在变量 @result 中。

DECLARE @result int
EXEC @result = xp_cmdshell 'dir *.exe'
IF (@result = 0)
   PRINT 'Success'
ELSE
   PRINT 'Failure'
E. 将变量内容写入文件

下例将当前目录内容写入当前服务器目录下名为 dir_out.txt 的文件中。

DECLARE @cmd sysname, @var sysname
SET @var = 'dir /p'
SET @cmd = 'echo ' + @var + ' > dir_out.txt'
EXEC master..xp_cmdshell @cmd

请参见

CREATE PROCEDURE

EXECUTE

创建安全帐户

系统存储过程（常规扩展过程）


xp_deletemail

删除 Microsoft® SQL Server™ 收件箱中的邮件。sp_processmail 使用 xp_deletemail 处理 SQL Server 收件箱中的邮件。

语法

xp_deletemail {'message_number'}

参数

'message_number'

是收件箱中应删除的邮件的编号（由 xp_findnextmsg 赋值）。message_number 的数据类型为 varchar(255)，无默认值。

返回代码值

0（成功）或 1（失败）

结果集

当所传递的邮件ID 有效时，xp_deletemail 返回下列结果集。

The command(s) completed successfully.
注释

除无效参数外的任何失败均记入 Microsoft Windows NT® 应用程序日志。

权限

xp_deletemail 的执行权限默认授予 sysadmin 固定服务器角色的成员，但可以授予其他用户。

示例

下例删除 xp_findnextmsg 提供的邮件ID 所对应的邮件。xp_findnextmsg 的值将置于局部变量 @message_id 中。

DECLARE @message_id varchar(255)
SET @message_id = 'XA17' -- Setting to a value would go here.
USE master
EXEC xp_deletemail @message_id

请参见

sp_processmail

系统存储过程（SQL 邮件扩展过程）

xp_findnextmsg

xp_readmail

xp_sendmail

xp_startmail

xp_stopmail


xp_enumgroups

提供 Microsoft® Windows NT® 本地组列表或在指定的 Windows NT 域中定义的全局组列表。

语法

xp_enumgroups ['domain_name']

参数

'domain_name'

是要枚举其全局组列表的 Windows NT 域。domain_name 的数据类型为 sysname，其默认值为 NULL。

返回代码值

0（成功）或 1（失败）

结果集
列名 | 数据类型 | 描述
group | sysname | Windows NT 组的名称
comment | sysname | Windows NT 提供的 Windows NT 组的描述

注释

如果 domain_name 是正在运行 Microsoft SQL Server™ 的基于 Windows NT 的计算机名称，或者未指定域名，则 xp_enumgroups 从正在运行 SQL Server 的计算机上枚举本地组。

如果 SQL Server 运行的是 Windows® 95/98，则无法使用 xp_enumgroups。

权限

xp_enumgroup 的执行权限默认授予 master 数据库中的 db_owner 固定数据库角色成员以及 sysadmin 固定服务器角色成员，但可以授予其他用户。

示例

下例列出 sales 域中的组。

EXEC xp_enumgroups 'sales'

请参见

sp_grantlogin

sp_revokelogin

系统存储过程（常规扩展过程）

xp_loginconfig

xp_logininfo


xp_findnextmsg

接受输入的邮件ID 并返回输出的邮件ID。为了处理 Microsoft® SQL Server™ 收件箱中的邮件，请一起使用 xp_findnextmsg 和 sp_processmail。

语法

xp_findnextmsg [[@type =] type]
[,[@unread_only =] 'unread_value']
[,[@msg_id =] 'message_number' [OUTPUT]]

参数

[@type =] type

是基于以下 MAPI 邮件定义的输入邮件类型：

IP[M | C].Vendorname.subclass

如果 type 为 NULL，则以 IPM 打头的邮件类型出现在邮件客户程序的收件箱中，可通过 xp_findnextmsg 查找或阅读。以 IPC 打头的邮件类型不出现在邮件客户程序的收件箱中，并且必须设置 type 参数才能查找或阅读。默认设置为 NULL。

[@unread_only =] 'unread_value'

是否仅考虑未读 (true) 邮件。默认值为 FALSE，即考虑所有邮件。

[@msg_id =] 'message_number'

是输入和输出参数，输入时指定邮件字符串，输出时指定下一封邮件的字符串。

OUTPUT

如果指定，message_number 将置于输出参数中。如果未指定，message_number 将作为单列、单行结果集返回。

返回代码值

0（成功）或 1（失败）

结果集

当所传递的邮件ID 有效时，xp_findnextmsg 返回下列结果集：

The command(s) completed successfully.
注释

除无效参数外的任何失败均记入 Microsoft Windows NT® 应用程序日志。

权限

xp_findnestmsg 的执行权限默认授予 master 数据库中的 db_owner 固定数据库角色成员以及 sysadmin 固定服务器角色成员，但可以授予其他用户。

示例

下例在搜索下一个邮件 ID（仅搜索未读邮件）时检索状态。xp_findnextmsg 返回的值将置于局部变量 @message_id 中。

DECLARE @status int, @message_id varchar(255)
-- SET @status = value would be here.
-- SET @message_id = value would be here.
EXEC @status = xp_findnextmsg @msg_id = @message_id OUTPUT

请参见

sp_processmail

系统存储过程（SQL 邮件扩展过程）

xp_deletemail

xp_readmail

xp_sendmail

xp_startmail

xp_stopmail


xp_grantlogin

授予 Microsoft® Windows NT® 组或用户访问 Microsoft SQL Server™ 的权限。提供 xp_grantlogin 是为了向后兼容。请使用 sp_grantlogin。

语法

xp_grantlogin {[@loginame =] 'login'} [,[@logintype =] 'logintype']

参数

[@loginame =] 'login'

是要添加的 Windows NT 用户或组的名称。Windows NT 用户或组必须用 Windows NT 域名以 Domain\User 的形式加以限定。login 的数据类型为 sysname，无默认值。

[@logintype =] 'logintype'

是要对其授权访问的登录的安全等级。logintype 的数据类型为 varchar(5)，其默认值为 NULL。只能指定 admin。如果指定 admin，则授予 login 访问 SQL Server 的权限，并将其添加为 sysadmin 固定服务器角色的成员。

返回代码值

0（成功）或 1（失败）

注释

xp_grantlogin 现在是系统存储过程而非扩展存储过程，它调用 sp_grantlogin 授予基于 Windows NT 的组或用户访问 SQL Server 的权限。

请参见

sp_denylogin

sp_grantlogin

系统存储过程（常规扩展过程）

xp_enumgroups

xp_loginconfig

xp_logininfo

sp_revokelogin


xp_logevent

将用户定义消息记入 Microsoft® SQL Server™ 日志文件和 Microsoft Windows NT® 事件查看器。可以使用 xp_logevent 发送警报，而不必给客户端发送消息。

语法

xp_logevent {error_number, 'message'} [, 'severity']

参数

error_number

是用户定义的大于 50,000 的错误号。最大值为 1073741823 (230 - 1)。

'message'

是少于 8,000 个字符的字符串。

'severity'

是以下三个字符串之一：INFORMATIONAL、WARNING 或 ERROR。severity 是可选的，其默认值为 INFORMATIONAL。

返回代码值

0（成功）或 1（失败）

结果集

对于所包含的代码示例，xp_logevent 返回下列错误信息：

The command(s) completed successfully.
注释

在从 Transact-SQL 过程、触发器、批处理等环境中发送消息时，请使用 RAISERROR 语句，而不要使用 xp_logevent。xp_logevent 不调用客户端的消息处理程序，也不设置 @@ERROR。若要将消息写入 Windows NT 事件查看器和 SQL Server 内的 SQL Server 错误日志文件中，请执行 RAISERROR 语句。

权限

xp_logevent 的执行权限默认授予 master 数据库中的 db_owner 固定数据库角色成员以及 sysadmin 固定服务器角色成员，但可以授予其他用户。

示例

下例将消息（连同传递给消息的变量）记入 Windows NT 事件查看器。

DECLARE @@TABNAME varchar(30)
DECLARE @@USERNAME varchar(30)
DECLARE @@MESSAGE varchar(255)
SET @@TABNAME = 'customers'
SET @@USERNAME = USER_NAME()
SELECT @@MESSAGE = 'The table ' + @@TABNAME + ' is not owned by the user
   ' + @@USERNAME + '.'

USE master
EXEC xp_logevent 60000, @@MESSAGE, informational

请参见

PRINT

RAISERROR

系统存储过程（常规扩展过程）


xp_loginconfig

报告 Microsoft® SQL Server™ 在 Microsoft Windows 2000 或 Microsoft Windows NT® 4.0 上运行时的登录安全配置。

语法

xp_loginconfig ['config_name']

参数

'config_name'

是要显示的配置值。如果未指定 config_name，将报告所有配置值。config_name 的数据类型为 sysname，其默认值为 NULL，可以是下面的某个值。

值 | 描述
login mode | 登录安全模式。可能的值为 Mixed 和 Windows Authentication。
default login | 信任连接的授权用户的默认 SQL Server 登录 ID 名（用于无匹配登录名的用户）。默认登录为 guest。为向后兼容性而提供。
default domain | 信任连接的网络用户的默认 Windows NT 域名。默认域是运行 SQL Server 的计算机所属的域。为向后兼容性而提供。
audit level | 审核级别。可能值为 none、success、failure 以及 all。审核将写入错误日志和 Windows NT 事件查看器中。
set hostname | 指明在客户端登录记录中是否用 Windows NT 网络用户名替换主机名。可能值为 true 或 false。如果设置此值，网络用户名将出现在 sp_who 的输出中。
map _ | 报告将哪些特殊 Windows NT 字符映射为有效的 SQL Server 字符 _（下划线）。可能值为 domain separator（默认值）、space、null 或任意单个字符。为向后兼容性而提供。
map $ | 报告将哪些特殊 Windows NT 字符映射为有效的 SQL Server 字符 $（美元符号）。可能值为 domain separator、space、null 或任意单个字符。默认值为 space。为向后兼容性而提供。
map # | 报告将哪些特殊 Windows NT 字符映射为有效的 SQL Server 字符 #（数字符号）。可能值为 domain separator、space、null 或任意单个字符。默认值为连字符。为向后兼容性而提供。

返回代码值

0（成功）或 1（失败）

结果集
列名 | 数据类型 | 描述
name | sysname | 配置值
config value | sysname | 配置值设置

注释

xp_loginconfig 不能用于设置配置值。

使用 SQL Server 企业管理器设置登录模式和审核级别。

权限

xp_loginconfig 的执行权限默认授予 master 数据库中的 db_owner 固定数据库角色成员以及 sysadmin 固定服务器角色成员，但可以授予其他用户。

示例
A. 报告所有配置值

下例显示所有当前配置设置。

EXEC xp_loginconfig

name

config_value

----------------

-------------------------

login mode

mixed

default login

guest

default domain

REDMOND

audit level

none

Set hostname

false

Map _

domain separator

Map $

space

Map #

-

B. 报告登录模式配置值

下例仅显示登录模式的设置。

EXEC xp_loginconfig 'login mode'

name

config_value

----------------

-------------------------

login mode

mixed

请参见

sp_denylogin

sp_grantlogin

系统存储过程（常规扩展过程）

sp_revokelogin

xp_logininfo


xp_logininfo

报告帐户、帐户类型、帐户的特权级别、帐户的映射登录名和帐户访问 Microsoft® SQL Server™ 的权限路径。

语法

xp_logininfo [[@acctname =] 'account_name'] [,[@option =] 'all' | 'members']
[,[@privelege =] variable_name OUTPUT]

参数

[@acctname =] 'account_name'

是授权访问 SQL Server 的 Microsoft Windows NT® 的用户或组的名称。account_name 的数据类型为 sysname，默认值为 NULL。如果未给定 account_name，则报告所有显式授予其登录权限的组和用户。必须用帐户所属的 Windows NT 域或计算机名限定 Windows NT 用户或组。

'all' | 'members'

指定是报告有关帐户的所有权限路径的信息，还是报告有关 Windows NT 组成员的信息。@option 的数据类型为 varchar(10)，其默认值为 NULL。除非指定了 all，否则仅显示第一个权限路径。

[@privelege =] variable_name

是输出参数，返回指定的 Windows NT 帐户的特权等级。variable_name 的数据类型为 varchar(10)，其默认值为"Not wanted"。返回的特权等级为 user、admin 或 null。

OUTPUT

如果指定，则将 variable_name 放置于输出参数中。

返回代码值

0（成功）或 1（失败）

结果集
列名 | 数据类型 | 描述
account name | nchar(128) | 完全合法的 Windows NT 帐户名。
type | char(8) | Windows NT 帐户类型。有效值为 user 或 group。
privilege | char(9) | SQL Server 的访问特权。有效值为 admin、user 或 null。
mapped login name | nchar(128) | 对于拥有用户特权的用户帐户，mapped login name 显示在用该帐户登录时 SQL Server 试图使用的映射登录名（采用前面添加域名的映射规则）。
permission path | nchar(128) | 使帐户得到访问权限的组成员资格。

注释

如果指定 account_name 作为第一个参数，则 xp_logininfo 报告该帐户的最高访问特权等级。如果用户有系统管理员访问权限和用户访问权限，则只报告系统管理员级（最高特权）条目。如果用户属于多个拥有相同特权等级的组，则只报告第一个匹配的组（组的顺序按向这些组授予 SQL Server 访问权限的顺序决定），并最多返回一行结果。

如果 account_name 是有效 Windows NT 帐户，但该帐户没有访问 SQL Server 的权限，则返回空结果集。如果 account_name 无法识别为有效的 Windows NT 帐户，则返回错误信息。

如果指定了 account_name 和 all，则列出该帐户的所有权限路径。如果 account_name 是多个组的成员，并且所有这些组都有访问 SQL Server 的权限，则返回多个行。admin 特权行在 user 特权行之前报告，而同一特权等级内的行顺序由向帐户授予 SQL Server 访问权限的顺序决定。account_name 既适用于单个用户也适用于组。

如果指定了 account_name 和 members，则返回组的下一级成员列表。如果 account_name 是本地组，则该列表可以包含本地用户、域用户和全局组。如果 account_name 是全局帐户，则该列表由域用户组成。如果 account_name 是用户帐户，则返回错误信息。

权限

xp_logininfo 的执行权限默认授予 master 数据库中的 db_owner 固定数据库角色成员以及 sysadmin 固定服务器角色成员，但可以授予其他用户。

示例

下例显示有关 BUILTIN\Administrators Windows NT 组的信息。

EXEC xp_logininfo 'BUILTIN\Administrators'

请参见

sp_denylogin

sp_grantlogin

sp_revokelogin

系统存储过程（常规扩展过程）

xp_loginconfig


xp_msver

返回并允许要查询的 Microsoft® SQL Server™ 版本信息。除了有关服务器实际内部版本号码的版本信息外，还返回多种环境信息。该信息可以在 Transact-SQL 语句、批处理、存储过程等环境中使用，以增强与平台无关代码的逻辑。

语法

xp_msver [optname]

参数

optname

是选项名，可以是以下各项之一。

选项/列名 | 描述
ProductName | 产品名，如 Microsoft SQL Server。
ProductVersion | 产品版本，如 7.00.419，其中 7.00 是版本，419 是 Microsoft 内部版本号码。
Language | SQL Server 的语言版本。
Platform | 运行 SQL Server 的计算机的操作系统名、厂商名以及芯片家族名。例如，NT INTEL X86 表示 Microsoft Windows NT® 的操作系统名，Intel 表示芯片的生产厂商名，并且是 486 或是更高级别的处理器。
Comments | 有关 SQL Server 的杂项信息。
CompanyName | 生产 SQL Server 的公司名，如 Microsoft Corporation。
FileDescription | 操作系统。
FileVersion | SQL Server 可执行文件的版本。例如，1998.02.01 表示 Sqlservr.exe 文件的文件版本是 1998 年 2 月 1 日。
InternalName | SQL Server 在 Microsoft 内部的名称，如 SQLSERVR。
LegalCopyright | SQL Server 所需的合法版权信息；如 Copyright© Microsoft Corp. 1998。
LegalTrademarks | SQL Server 所需的合法商标信息。如，Microsoft® 是 Microsoft Corporation 的注册商标。
OriginalFilename | SQL Server 启动时执行的文件名，如 Sqlservr.exe。
PrivateBuild | 保留。
SpecialBuild | 保留。
WindowsVersion | 运行 SQL Server 的计算机上安装的 Microsoft Windows 版本。例如，4.0 表示 Microsoft Windows NT 的版本是 4.0，1381 表示内部版本号码。
ProcessorCount | 运行 SQL Server 的计算机中安装的处理器数量。
ProcessorActiveMask | 表明在运行 SQL Server 的计算机中安装的哪些处理器为 Microsoft Windows NT 所激活并且可用。
ProcessorType | 处理器类型。类似于 Platform。
PhysicalMemory | 运行 SQL Server 的计算机上安装的 RAM 容量（以 MB 为单位）。例如，32 表示 32 MB 的 RAM。
Product ID | Product ID (PID) 号，该号码在安装过程中指定。该号码印在 SQL Server 原始光盘盒的不干胶标签上。

返回代码值

0（成功）或 1（失败）

结果集

不带任何参数的情况下，xp_msver 返回下面的四列结果集（值可能会不同）：

Index  Name                     Internal_Value Character_Value
------ ------------------------ -------------- ----------------
1      ProductName              NULL           Microsoft SQL
                                   Server
2      ProductVersion           458752         7.00.498
3      Language                 1033           English (United
                                   States)
4      Platform                 NULL           NT INTEL X86
5      Comments                 NULL           NT INTEL X86
6      CompanyName              NULL           Microsoft
                                   Corporation
7      FileDescription          NULL           SQL Server
                                   Windows NT
8      FileVersion              NULL           1998.05.25
9      InternalName             NULL           SQLSERVR
10     LegalCopyright           NULL           Copyright ©
                                   Microsoft Corp. 1998
11     LegalTrademarks          NULL           Microsoft® is a
                                   registered trademark of                                       Microsoft Corporation.                                       Windows(TM) is a                                             trademark of Microsoft                                       Corporation
12     OriginalFilename         NULL           SQLSERVR.EXE
13     PrivateBuild             NULL           NULL
14     SpecialBuild             262242         NULL
15     WindowsVersion           90505220       4.0 (1381)
16     ProcessorCount           1              1
17     ProcessorActiveMask      1              00000001
18     ProcessorType            586            PROCESSOR_INTEL_PENTIUM
19     PhysicalMemory           63             63 (66510848)
20     Product ID               NULL           NULL

(20 row(s) affected)

如果指定了任意选项，xp_msver 将返回四列标题以及该选项的值。例如，指定 FileDescription 选项执行 xp_msver 时返回下列结果集。

xp_msver FileDescription

Index  Name                      Internal_Value Character_Value
------ ------------------------- -------------- ------------------------
7      FileDescription           NULL           SQL Server Windows NT

(1 row(s) affected)
权限

执行权限默认授予 public 角色。

请参见

系统函数

系统存储过程（常规扩展过程）

@@VERSION


xp_readmail

阅读 Microsoft® SQL Server™ 邮件收件箱中的邮件。sp_processmail 使用此过程处理 SQL Server 收件箱中的所有邮件。

语法

xp_readmail [[@msg_id =] 'message_number']
[, [@type =] 'type' [OUTPUT]]
[,[@peek =] 'peek']
[,[@suppress_attach =] 'suppress_attach']
[,[@originator =] 'sender' OUTPUT]
[,[@subject =] 'subject' OUTPUT]
[,[@message =] 'message' OUTPUT]
[,[@recipients =] 'recipients [;...n]' OUTPUT]
[,[@cc_list =] 'copy_recipients [;...n]' OUTPUT]
[,[@bcc_list =] 'blind_copy_recipients [;...n]' OUTPUT]
[,[@date_received =] 'date' OUTPUT]
[,[@unread =] 'unread_value' OUTPUT]
[,[@attachments =] 'attachments [;...n]' OUTPUT])
[,[@skip_bytes =] bytes_to_skip OUTPUT]
[,[@msg_length =] length_in_bytes OUTPUT]
[,[@originator_address =] 'sender_address' OUTPUT]]

参数

[@msg_id =] 'message_number'

是要阅读的邮件的编号。message_number 的数据类型为 varchar(255)，无默认值。

'type'

是基于以下 MAPI 邮件定义返回的邮件类型：

IP[M | C].Vendorname.subclass

如果用于输入，则此参数必须定义特定邮件的类型；如果 message_number 为 NULL，则忽略输入的 type。type 的数据类型为 varchar(255)，其默认值为 NULL。

OUTPUT

如果指定，则将指定参数值置于输出参数中。

[@peek =] 'peek'

是否 SQL Server 返回邮件而不更改要阅读邮件的状态。peek 的数据类型为 varchar(5)，其默认值为 FALSE。如果设置为 false，则将邮件视为"已读"。如果设置为 true，则将邮件视为"未读"。

[@suppress_attach =] 'suppress_attach'

是否忽略邮件附件。suppress_attach 的数据类型为 varchar(255)，其默认值为 TRUE（不创建临时文件）。如果设置为 true，则 SQL Server 禁止在 xp_readmail 阅读带附件邮件时创建临时文件。如果设置为 false，则不禁止在阅读带附件邮件时创建临时文件。

[@originator =] 'sender'

是返回的发件人邮件地址。sender 的数据类型为 varchar(255)，无默认值。

[@subject =] 'subject'

是返回的邮件主题。subject 的数据类型为 varchar(255)，无默认值。

[@message =] 'message'

是所返回邮件的正文或实际文本。message 的数据类型为 text，无默认值。

[@recipients =] 'recipients [;...n]'

是要返回的邮件的收件人列表，该列表以分号分隔。收件人名称之间用分号 (;) 分隔。recipient_list 的数据类型为 varchar(255)，无默认值。

[@cc_list =] 'copy_recipients [;...n]'

是要返回的邮件的复本收件人（抄送人）列表，该列表以分号分隔。收件人名称之间用分号 (;) 分隔。cc_list 的数据类型为 varchar(255)，无默认值。

[@bcc_list =] 'blind_copy_recipients [;...n]'

是要返回的邮件的密件复本收件人（密件抄送人）列表，该列表以分号分隔。收件人名称之间用分号 (;) 分隔。bcc_list 的数据类型为 varchar(255)，无默认值。

[@date_received =] 'date'

是邮件的返回日期。date 的数据类型为 varchar(255)，无默认值。

[@unread =] 'unread_value'

邮件以前是未读 (true) 还是已读 (false) 的。unread_value 的数据类型为 varchar(5)，其默认值为 TRUE。

[@attachments =] 'attachments [;...n]'

是返回的邮件附件临时路径的列表，该列表以分号分隔。临时路径以分号 (;) 分隔。attachments 的数据类型为 varchar(255)，无默认值。

[@skip_bytes =] bytes_to_skip OUTPUT

如果输入的值不为 0，则此参数指定在将邮件的下 255 个字节（最大字节数）读入 body of message 输出参数之前要跳过的字节数。如果使用 bytes_to_skip，则 body_of_message 包含邮件的下一部分，并且 bytes_to_skip 返回邮件中的下一个起始点（前一 bytes_to_skip 加上 message 的长度）。bytes_to_skip 的数据类型为 int，其默认值为 0。

[@msg_length =] length_in_bytes OUTPUT

邮件的总长度（以字节为单位）。在存储过程中与 bytes_to_skip 协同使用时，此参数允许以 255 个字节为单位阅读邮件。length_in_bytes 的数据类型为 int，其默认值为 255（字节）。

[@originator_address =] 'sender_address'

已解析的邮件发出人的邮件地址。sender_address 是 varchar(255)，无默认值。

返回代码值

0（成功）或 1（失败）

结果集

xp_readmail 返回包含下面这些列的结果集（较旧邮件首先出现）。

列名 | 描述
Originator | 电子邮件的发件人
Date Received | 电子邮件的接收日期
Recipients | 邮件的接收者
CC List | 电子邮件"抄送"行中的人员
BCC List | 电子邮件"密件抄送"行中的人员
Subject | 电子邮件的主题行
Message | 邮件的正文（文本）
Unread | 该邮件是否未读
Attachments | 邮件的任何附件
Message ID | 邮件ID
Type | 邮件类型

注释

除无效参数外的任何失败均记入 Microsoft Windows NT® 应用程序日志。

使用 xp_readmail 有两种方法：

  • 将收件箱内容作为结果集返回客户端。

  • 阅读收件箱中的单封邮件。

若要将收件箱内容作为结果集返回客户端，则应将 message_number 设置为 NULL 或不包含 message_number。在这种情况下，可使用 type 来阅读特定的邮件。可以将 peek 和 suppress_attach 指定为输入参数，以控制阅读邮件的方式。

若要阅读收件箱中的单封邮件，应将 xp_findnextmsg 所返回的有效 message_number 提供给 xp_readmail 作为输入参数。可以将 peek 和 suppress_attach 指定为输入参数，以控制阅读邮件的方式。如果以这种方式使用 peek 和 suppress_attach，所有其它参数都是可选的输出参数，其中包含要阅读的邮件中的特定信息。

通过执行下面命令，可以查看将 xp_findnextmsg 用作 xp_readmail 的输入参数的示例：

sp_helptext 'sp_processmail'

用于阅读单封邮件时，xp_readmail 可以通过逐段阅读的方式阅读多于 255 个字节的邮件文本。使用 length_in_bytes 和 length_in_bytes 逐段阅读多于 255 个字节的邮件文本。将 length_in_bytes 既作为输入参数又作为输出参数，可以编写循环代码，以处理整个邮件的文本。下列代码显示了这种循环的示例（假定 message_number 设置为 xp_findnextmsg 所返回的有效邮件标识符）。

USE master
WHILE (1 = 1)
BEGIN
EXEC @status = xp_readmail @msg_id = @msg_id,
   @message = @message OUTPUT,
   @skip_bytes = @skip_bytes OUTPUT,
   @msg_length = @msg_length OUTPUT

IF @status <> 0 BREAK
SELECT 'msg_id' = @msg_id, 'msg_part' = @message
IF @skip_bytes = @msg_length BREAK
END
权限

xp_readmail 的执行权限默认授予 master 数据库中的 db_owner 固定数据库角色成员以及 sysadmin 固定服务器角色成员，但可以授予其他用户。

示例

下例在阅读邮件时返回状态。在下例中，xp_findnextmsg 所返回的邮件ID 放置于局部变量 @message_id 中并传递给 xp_readmail。

USE master
EXEC @status = xp_readmail @msg_id = @message_id,
   @originator = @originator OUTPUT,
   @cc_list = @cc_list OUTPUT,
   @subject = @msgsubject OUTPUT,
   @message = @query OUTPUT,
   @peek = 'TRUE',
   @suppress_attach = 'TRUE'

请参见

sp_processmail

系统存储过程（SQL 邮件扩展过程）

xp_deletemail

xp_findnextmsg

xp_sendmail

xp_startmail

xp_stopmail


xp_revokelogin

废除 Microsoft® Windows NT® 组或用户访问 Microsoft SQL Server™ 的权限。提供 xp_revokelogin 是为了向后兼容。请使用 sp_revokelogin。

语法

xp_revokelogin {[@loginame =] 'login'}

参数

[@loginame =] 'login'

是要废除其访问权限的 Windows NT 用户或组的名称。必须用 Windows NT 域名限定该 Windows NT 用户或组。login 的数据类型为 sysname，无默认值。

返回代码值

0（成功）或 1（失败）

注释

xp_revokelogin 现在是系统存储过程而非扩展存储过程，它调用 sp_revokelogin 废除 Windows NT 组或用户访问 SQL Server 的权限。

请参见

sp_denylogin

sp_grantlogin

sp_revokelogin

系统存储过程（常规扩展过程）

xp_loginconfig

xp_logininfo


xp_sendmail

向指定的收件人发送邮件和查询结果集附件。

语法

xp_sendmail {[@recipients =] 'recipients [;...n]'}
[,[@message =] 'message']
[,[@query =] 'query']
[,[@attachments =] 'attachments [;...n]']
[,[@copy_recipients =] 'copy_recipients [;...n]'
[,[@blind_copy_recipients =] 'blind_copy_recipients [;...n]'
[,[@subject =] 'subject']
[,[@type =] 'type']
[,[@attach_results =] 'attach_value']
[,[@no_output =] 'output_value']
[,[@no_header =] 'header_value']
[,[@width =] width]
[ , [ @separator = ] 'separator' ]
[,[@echo_error =] 'echo_value']
[ , [ @set_user = ] 'user' ]
[,[@dbuse =] 'database']

参数

[@recipients =] 'recipients [;...n]'

是以分号分隔的邮件收件人列表。

n

是表示可以指定多个 recipient、copy_recipient 或 blind_copy_recipient 的占位符。

[@message =] 'message'

是要发送的邮件。message 最大可达 8.000 个字节。

[@query =] 'query'

是有效的 Microsoft® SQL Server™ 查询，其结果将通过邮件送出。xp_sendmail 对 query 参数使用绑定连接。SQL 邮件建立的 query 连接不会被发出 xp_sendmail 请求的客户端所控制的锁阻塞。这使 xp_sendmail 更易于在触发器中使用。但是，query 语句不能引用仅在触发器中可用的逻辑 inserted 表和 deleted 表。query 最大可达 8,000 个字节。

[@attachments =] 'attachments [;...n]'

是以分号分隔的附加到邮件上的文件列表。

[@copy_recipients =] 'copy_recipients [;...n]'

是以分号分隔的列表，标识邮件复本收件人（抄送人）。

[@blind_copy_recipients =] 'blind_copy_recipients [;...n]'

是可选的以分号分隔的列表，标识邮件密件复本收件人（密件抄送人）。

[@subject =] 'subject'

是指定邮件主题的可选参数。如果未指定 subject，则默认值为"SQL Server 消息"。

[@type =] 'type'

是基于以下 MAPI 邮件定义的输入邮件类型：

IP[M | C].Vendorname.subclass

如果 type 为 NULL，则以 IPM 打头的邮件类型出现在邮件客户端的收件箱中，并由 xp_findnextmsg 查找或阅读。以 IPC 打头的邮件类型不出现在邮件客户程序的收件箱中，并且必须设置 type 参数才能查找或阅读。默认设置为 NULL。

有关使用自定义邮件类型的更多信息，请参见独立提供的《Microsoft Windows NT Resource Kit》或《Microsoft Mail Technical Reference》。

[@attach_results =] 'attach_value'

是可选参数，指定查询结果集应作为邮件中的附件文件发送，而不是追加到邮件中发送。如果 attachments 不为 NULL，并且 attach_results 为 true，则 attachments 中的第一个文件名将作为结果集的文件名。如果 attachments 为 NULL，则生成带 .txt 扩展名的文件名。默认值为 FALSE，这意味着结果集将追加到邮件中。

[@no_output =] 'output_value'

是可选参数，用来发送邮件但不向发送邮件的客户端会话返回任何输出。默认值为 FALSE，这意味着 SQL Server 客户端会话将接收输出。

[@no_header =] 'header_value'

是可选参数，表示通过邮件发送查询结果，但不随查询结果发送列标题信息。默认值为 FALSE，即列标题信息随查询结果一起发送。

[@width =] width

是可选参数，设置查询的输出文本行宽。此参数与 isql 实用工具中的 /w 参数相同。对于产生长输出行的查询，应结合使用 attach_results 与 width 以发送行中无换行符的输出。默认宽度为 80 个字符。

[@separator =] 'separator'

是结果集中每列的列分隔符字符串。默认情况，列分隔符为空格。使用列分隔符可以使访问电子表格和其它应用程序中的结果集更容易。例如，结合使用 attach_results 与 separator 以发送用逗号分隔值的文件。

[@echo_error =] 'echo_value'

值为 true 时，SQL 邮件将捕获运行查询时遇到的任何服务器消息或 DB-Library 错误，并将其追加到邮件中而不是写入错误日志。同时也将返回行/受影响行的计数追加到邮件中。

说明 echo_error 为 true 时，即使出现 DB-Library 错误或消息，或查询没有返回结果，只要邮件成功发送，xp_sendmail 就返回状态 0（成功）。

[@set_user =] 'user'

是应在其中运行查询的安全上下文。如果没有指定 user，安全上下文默认为执行 xp_sendmail 的用户的安全上下文。

[@dbuse =] 'database'

是应在其中运行查询的数据库上下文。默认值为 NULL，这意味着将用户置于默认数据库中。

返回代码值

0（成功）或 1（失败）

结果集

xp_sendmail 返回下列消息：

Mail sent.
注释

必须在执行 xp_sendmail 前启动 SQL 邮件会话。会话可以自动启动，也可以使用 xp_startmail 启动。有关自动设置 SQL 邮件会话的更多信息，请参见配置邮件配置文件。一个 SQL 邮件会话支持 SQL Server 上的所有用户，但每次只有一个用户可以发送邮件。其他发送邮件的用户自动排队等候，直到第一个用户的邮件发送出去。

如果指定 query，则 xp_sendmail 作为客户端登录到 SQL Server，并执行指定的查询。SQL 邮件建立与 SQL Server 之间的单独的连接；它不与发出 xp_sendmail 的原始客户端连接共享同一连接。

说明 发出 xp_sendmail 的客户端连接所控制的锁会阻塞 query。例如，如果要在事务中更新表，并且为更新创建了触发器，而该触发器试图选择的更新行信息与 query 参数所选择的相同，则 SQL 邮件连接将被初始客户端连接所控制的行排它锁阻塞。

xp_sendmail 在 SQL Server 的安全上下文（默认为本地管理员帐户）中运行。有效 xp_sendmail 用户可以在管理员安全上下文中访问邮件的附件文件。如果非系统管理员用户必须访问 xp_sendmail，而您希望阻止对附件文件的不安全访问，则系统管理员可以创建一个存储过程，该过程调用 xp_sendmail 并提供所需的功能，但不表现 attachments 参数。此存储过程必须在 master 数据库中定义。然后系统管理员可向必要的用户授予该存储过程的执行权限，但不授予基础 xp_sendmail 过程的权限。

xp_sendmail 向指定收件人发送邮件、查询结果集或附件，并对 query 参数使用绑定连接。SQL 邮件建立的 query 连接不会被发出 xp_sendmail 请求的客户端所控制的锁阻塞。这使 xp_sendmail 更易于在触发器中使用。但是，query 语句不能引用仅在触发器中可用的逻辑 inserted 和 deleted 表。

说明 当邮局和通讯簿位于 MSSQLServer 服务因无足够权限而无法访问的文件共享位置时，试图执行 xp_sendmail 将导致违规访问。

有关使用存储过程调用 xp_sendmail 的更多信息，请参见如何使用 SQL 邮件(Transact-SQL)。

权限

xp_sendmail 的执行权限默认授予 master 数据库中的 db_owner 固定数据库角色成员以及 sysadmin 固定服务器角色成员，但可以授予其他用户。

示例
A. 使用不带变量的 xp_sendmail

下例向用户 Robert King（电子邮件地址是 robertk）发送邮件，告知该用户 master 数据库已满。

EXEC xp_sendmail 'robertk', 'The master database is full.'
B. 使用带变量的 xp_sendmail

下例向用户 Robert King 和 Laura Callahan（电子邮件地址是 laurac）发送邮件，并将复本发送给 Anne Dodsworth（电子邮件地址是 anned）和 Michael Suyama（电子邮件地址是 michaels）。下例还指定了邮件的主题行。

EXEC xp_sendmail @recipients = 'robertk;laurac',
   @message = 'The master database is full.',
   @copy_recipients = 'anned;michaels',
   @subject = 'Master Database Status'
C. 发送结果

下例将 sp_configure 的结果发送给 Robert King。

EXEC xp_sendmail 'robertk', @query = 'sp_configure'
D. 将结果作为附件文件发送

下例将查询 SELECT * FROM INFORMATION_SCHEMA.TABLES 的结果作为文本文件附件发送给 Robert King。下例包含邮件的主题行以及将在附件之前出现的邮件正文。@width 参数用于防止在输出行中换行。

EXEC xp_sendmail @recipients = 'robertk',
   @query = 'SELECT * FROM INFORMATION_SCHEMA.TABLES',
   @subject = 'SQL Server Report',
   @message = 'The contents of INFORMATION_SCHEMA.TABLES:',
   @attach_results = 'TRUE', @width = 250
E. 发送大于 7,990 个字符的邮件

下例显示如何发送大于 7,990 个字符的邮件。由于 message 受 varchar 长度的限制（这样每行开销较小，像所有存储过程参数一样），下例将长消息写入由单个文本列组成的全局临时表中。然后使用 @query 参数通过邮件发送该临时表的内容。

CREATE TABLE ##texttab (c1 text)
INSERT ##texttab values ('Put your long message here.')
DECLARE @cmd varchar(56)
SET @cmd = 'SELECT c1 FROM ##texttab'
EXEC master.dbo.xp_sendmail 'robertk',
   @query = @cmd, @no_header= 'TRUE'
DROP TABLE ##texttab

请参见

sp_processmail

系统存储过程（SQL 邮件扩展过程）

xp_deletemail

xp_findnextmsg

xp_readmail

xp_startmail

xp_stopmail


xp_sprintf

设置一系列字符和值的格式并将其存储到字符串输出参数中。每个格式参数都用相应的参数替换。

语法

xp_sprintf {string OUTPUT, format}
[, argument [,...n]]

参数

string

是接收输出的 varchar 变量。

OUTPUT

如果指定，则将变量值放在输出参数中。

format

是带有与 argument 值对应的占位符的格式字符串，类似于 C 语言的 sprintf 函数所支持的格式字符串。目前仅支持 %s 格式参数。

argument

是代表相应格式参数值的字符串。

n

是表示最多可以指定 50 个参数的占位符。

返回代码值

0（成功）或 1（失败）

结果集

xp_sprintf 返回下列消息：

The command(s) completed successfully.
权限

执行权限默认授予 public 角色。

示例

下例使用参数创建 INSERT 语句。

DECLARE @ret_string varchar (255)
EXEC xp_sprintf @ret_string OUTPUT, 'INSERT INTO %s VALUES (%s, %s)', 'table1', '1', '2'
PRINT @ret_string

下面是结果集：

INSERT INTO table1 VALUES (1, 2)

请参见

系统存储过程（常规扩展过程）

xp_sscanf


xp_sqlagent_proxy_account

为非 sysadmin 固定服务器角色成员的用户执行作业或命令时，设置或检索 SQL Server 代理程序和 xp_cmdshell 扩展存储过程使用的代理帐户信息。代理帐户是 Microsoft® Windows® 帐户，作业或命令提示符命令在此帐户的安全上下文中运行。

语法

xp_sqlagent_proxy_account

{ N'GET' |

N'SET', N'agent_domain_name', N'agent_username', N'agent_password'

}

参数

N'GET'

检索当前 SQL Server 代理程序的代理帐户的名称。N'GET' 的数据类型为 nvarchar，无默认设置。

N'SET'

设置 Windows 帐户以用作 SQL Server 代理程序的代理帐户。使用 agent_domain_name、agent_username 和 agent_password 以指定 Windows 帐户用作代理帐户。如果没有指定有效的 Windows 帐户信息，例如没有指定正确的密码，则 sp_sqlagent_proxy_account 将收到错误信息。N'SET' 的数据类型为 nvarchar，无默认设置。

'agent_domain_name'

是包含 agent_username 中指定的 Windows 用户帐户的 Windows 域的名称。agent_domain_name 的数据类型为 nvarchar，无默认设置。

'agent_username'

是用作 SQL Server 代理程序的代理帐户的 Windows 帐户的名称。agent_username 的数据类型为 nvarchar，无默认设置。

'agent_password'

是在 agent_username 中指定的 Windows 帐户的密码。agent_password 的数据类型为 nvarchar，无默认设置。

说明 必须按顺序指定 xp_sqlagent_proxy_account 的参数。无法使用命名参数。

返回代码值

0（成功）或 1（失败）

当执行 xp_sqlagent_proxy_account 失败后，SQL Server 将生成包含有关错误的错误信息。

结果集

如果已经设置 SQL Server 代理程序的代理帐户，则指定 N'GET' 时 xp_sqlagent_proxy_account 将返回带有下列信息的结果集。

列 | 数据类型 | 描述
domain | sysname | 包含用作 SQL Server 代理程序的代理帐户的 Windows 帐户的域。
username | sysname | 用作 SQL Server 代理程序的代理帐户的 Windows 帐户。

如果还没有设置 SQL Server 代理程序的代理帐户，或如果指定了 N'SET'，则不返回任何结果集。

注释

SQL Server 代理程序的代理帐户允许不属于 sysadmin 固定服务器角色的 SQL Server 用户执行 xp_cmdshell 和自己的 SQL Server 代理程序作业。管理员可以给代理帐户指派适当的安全权限，以控制这些作业在网络中访问资源的能力。

SQL Server 用户使用 xp_cmdshell 执行命令提示符命令时，命令必须在 Windows 帐户的安全上下文中执行。如果 SQL Server 用户是 sysadmin 固定服务器角色的成员，则 SQL Server 使用 SQL Server 服务在其下运行的 Windows 帐户执行命令提示符命令。如果执行 xp_cmdshell 的 SQL Server 用户不是 sysadmin 固定服务器角色的成员，则 SQL Server 使用指定为 SQL Server 代理程序的代理帐户的 Windows 帐户执行命令。如果没有设置任何 SQL Server 代理程序的代理帐户，则用户将收到错误信息。SQL Server 代理程序作业还必须在 Windows 帐户的安全上下文中执行。如果作业为 sysadmin 固定服务器角色的成员所有，则作业使用 SQL Server 服务在其下运行的 Windows 帐户来执行。如果作业所有者不在 sysadmin 中，则作业使用 SQL Server 代理程序的代理帐户执行，并且如果没有设置任何代理帐户，则将产生错误。

xp_sqlagent_proxy_account 将为在其上执行的实例设置或检索代理帐户。该实例的 SQL Server 服务必须在 Windows 管理员帐户下运行，以读取或设置 SQL Server 代理程序的代理帐户。

权限

xp_sqlagent_proxy_account 的执行权限默认授予 sysadmin 固定服务器角色的成员。

示例
A. 检索当前指派的 SQL Server 代理程序的代理帐户

下例检索当前指派的用作 SQL Server 代理程序的代理帐户的帐户。

EXEC master.dbo.xp_sqlagent_proxy_account N'GET'

下面是结果集。

Domain               Username
------------------------------------
NETDOMAIN            john
B. 不用密码设置 SQL Server 代理程序的代理帐户

下例没有指定密码，将 SQL Server 代理程序的代理帐户设置为 LONDON\ralph。如果 LONDON/ralph 帐户实际上有密码，则下例将会接收到扩展存储过程无法登录的错误信息。

EXEC master.dbo.xp_sqlagent_proxy_account N'SET',
             N'NETDOMAIN', -- agent_domain_name
             N'ralph', -- agent_username
             N'' – agent password
C. 使用密码设置 SQL Server 代理程序的代理帐户

下例将 SQL Server 代理程序的代理帐户设置为 LONDON\Ralph 并指定密码。

EXEC master.dbo.xp_sqlagent_proxy_account N'SET',
             N'NETDOMAIN', -- agent_domain_name
             N'ralph', -- agent_username
             N'RalphPwd', – agent password

请参见

SQL Server 代理程序属性（作业系统选项卡）

系统存储过程

xp_cmdshell


xp_sqlmaint

用包含 sqlmaint 开关的字符串调用 sqlmaint 实用工具。sqlmaint 实用工具在一个或多个数据库上执行一系列维护操作。

语法

xp_sqlmaint 'switch_string'

参数

'switch_string'

是包含 sqlmaint 实用工具开关的字符串。开关及其值之间必须以空格分隔。

-? 开关对 xp_sqlmaint 无效。

返回代码值

无。如果 sqlmaint 实用工具失败，则返回错误。

注释

如果该过程由使用 SQL Server 身份验证登录的用户调用，则执行前用 –U "login_id_" 和 -P"password" 开关准备 switch_string。如果用户使用 Windows 身份验证登录，则 switch_string 将不加更改地传递给 sqlmaint。

权限

xp_sqlmaint 的执行权限默认授予 master 数据库中的 db_owner 固定数据库角色成员以及 sysadmin 固定服务器角色成员，但可以授予其他用户。

示例

在下例中，xp_sqlmaint 调用 sqlmaint 执行完整性检查、创建报表文件并更新 msdb.dbo.sysdbmaintplan_history。

EXEC xp_sqlmaint '-PlanID 02A52657-D546-11D1-9D8A-00A0C9054212
   -Rpt "C:\Program Files\Microsoft SQL Server\MSSQL\LOG\DBMaintPlan2.txt" -WriteHistory  -CkDB -CkAl'

下面是结果：

The command(s) executed successfully.

请参见

sqlmaint 实用工具

系统存储过程


xp_sscanf

将数据从字符串读入每个格式参数所给定的变量位置。

语法

xp_sscanf {string OUTPUT, format}
[, argument [,...n]]

参数

字符串

是要从中读取参数值的字符串。

OUTPUT

如果指定，则将 argument 的值放到输出参数中。

format

是带格式的字符串，类似于 C 语言的 sscanf 函数所支持的字符串。目前仅支持 %s 格式参数。

argument

是为相应的 format 参数值设置的 varchar 变量。

n

是表示最多可以指定 50 个参数的占位符。

返回代码值

0（成功）或 1（失败）

结果集

xp_sscanf 返回下列消息：

The command(s) completed successfully.
权限

执行权限默认授予 public 角色。

示例

下例使用 xp_sscanf 从源字符串提取两个值（根据它们在源字符串格式中的位置）。

DECLARE @filename varchar (20), @message varchar (20)
EXEC xp_sscanf 'sync -b -fauthors10.tmp -rrandom', 'sync -b -f%s -r%s',
   @filename OUTPUT, @message OUTPUT
SELECT @filename, @message

下面是结果集：

-------------------- --------------------
authors10.tmp        random

请参见

系统存储过程（常规扩展过程）

xp_sprintf


xp_startmail

启动 SQL 邮件客户端会话。

语法

xp_startmail [[@user =] 'mapi_profile_name']
[,[@password =] 'mapi_profile_password']

参数

[@user =] 'mapi_profile_name'

是可选参数，指定邮件用户名。mapi_profile_name 的数据类型为 sysname，无默认值。

[@password =] 'mapi_profile_password'

是指定的 mapi_profile_name 的邮件密码。mapi_profile_password 的数据类型为 sysname，没有默认值。如果在运行 xp_startmail 之前，已在同一台计算机上启动了邮件客户程序，则允许使用 NULL 值。

返回代码值

0（成功）或 1（失败）

结果集

xp_startmail 返回下列消息：

SQL mail session started.
注释

如果提供了 mapi_profile_name 和 mapi_profile_password，Microsoft® SQL Server™ 将尝试使用该用户名和密码登录到 Windows NT Mail（或者其它 MAPI 提供程序）上。如果提供的 mapi_profile_name 和 mapi_profile_password 不正确，将返回错误信息。如果没提供 mapi_profile_name 和 mapi_profile_password，SQL Server 将使用在"SQL Server 属性"对话框中指定的用户名和密码。如果没有显式提供用户名或密码，SQL Server 将尝试使用默认的 MAPI 配置文件登录到 MAPI 提供程序。某些 MAPI 提供程序可能被配置为使用 Windows 身份验证，在这种情况下，将忽略 MAPI 密码。

说明 如果使用 xp_startmail 启动邮件会话，则可以选择提供登录名和密码，而不必在命令提示符下键入。然而，如果有一个现有的 Windows NT Mail 客户端会话正在运行，SQL 邮件将不会寄生在该会话上。该行为不同于 SQL Server 7.0 版和更早的版本。

如果已存在邮件会话，xp_startmail 就不启动新邮件会话。如果在运行 SQL Server 的同一计算机上使用邮件，则邮件客户程序必须在 xp_startmail 执行之前或 SQL Server 启动之前（如果 SQL 邮件配置为在 SQL Server 启动时自动启动）启动。

权限

xp_startmail 的执行权限默认授予 master 数据库中的 db_owner 固定数据库角色成员以及 sysadmin 固定服务器角色成员，但可以授予其他用户。

示例
A. 不带变量地使用 xp_startmail

下例使用 SQL Server 安装过程中指定的用户名和密码启动邮件。

USE master
EXEC xp_startmail
B. 对 xp_startmail 使用变量

下例使用用户名 janetl 和密码 abc12345 启动邮件。

USE master
EXEC xp_startmail 'janetl', 'abc12345'

请参见

sp_processmail

配置邮件配置文件

系统存储过程（SQL 邮件扩展过程）

xp_deletemail

xp_findnextmsg

xp_readmail

xp_sendmail

xp_stopmail


xp_stopmail

停止 Microsoft® SQL Server™ 的邮件客户端会话。

语法

xp_stopmail

返回代码值

0（成功）或 1（失败）

结果集

xp_stopmail 返回下列消息：

Stopped SQL mail session.
注释

如果不存在可以停止的 SQL Server 邮件会话，则返回一条消息。

权限

xp_stopmail 的执行权限默认授予 master 数据库中的 db_owner 固定数据库角色成员以及 sysadmin 固定服务器角色成员，但可以授予其他用户。

请参见

sp_processmail

系统存储过程（SQL 邮件扩展过程）

xp_deletemail

xp_findnextmsg

xp_readmail

xp_sendmail

xp_startmail


对象层次结构语法

sp_OAGetProperty 和 sp_OASetProperty 的 propertyname 参数以及 sp_OAMethod 的 methodname 支持对象层次结构语法类似于 Microsoft® Visual Basic®。当使用该特殊语法时，这些参数有下列通用格式：

语法

'TraversedObject.PropertyOrMethod'

参数

TraversedObject

是存储过程中指定的在层次结构中位于 objecttoken 下的 OLE 对象。使用 Visual Basic 语法指定一系列集合、对象属性和返回对象的方法。系列中的每个对象指定符必须用句号 (.) 隔开。

系列中的项目可以是集合名。使用下面的语法指定集合：

Collection("item")

必须用双引号 (") 将 item 括起来。不支持用于集合的 Visual Basic 感叹号 (!) 语法。

PropertyOrMethod

是 TraversedObject 属性或方法的名称。

若要通过使用 sp_OAGetProperty、sp_OASetProperty 或 sp_OAMethod 参数（包括支持 sp_OAMethod 输出参数）指定所有索引或方法参数，请使用下面的语法：

PropertyOrMethod

若要在圆括号内指定所有索引或方法参数（将导致忽略 sp_OAGetProperty、sp_OASetProperty 或 sp_OAMethod 的所有检索或方法参数），请使用下面的语法：

PropertyOrMethod( [ParameterName :=] "parameter" [,...] )

必须用双引号 (") 将每个参数括起来。指定所有位置参数后才能指定命名参数。

注释

如果没有指定 TraversedObject，则必需有 PropertyOrMethod。

如果没有指定 PropertyOrMethod，TraversedObject 将作为对象令牌输出参数从 OLE 自动化存储过程返回。如果已指定 PropertyOrMethod，将调用 TraversedObject 的属性或方法，且属性值或方法返回值作为输出参数从 OLE 自动化存储过程返回。

如果 TraversedObject 列表中的任何项目没有返回 OLE 对象，则说明发生了错误。

有关 Visual Basic OLE 对象语法的更多信息，请参见 Visual Basic 文档。

有关 HRESULT 返回代码的更多信息，请参见 sp_OACreate 部分的"HRESULT 返回代码"。

示例

下面是使用 SQL-DMO SQLServer 对象的对象层次结构语法示例。

-- Call the Connect method of the SQLServer object.
EXEC @hr = sp_OAMethod @object,
    'Connect("my_server", "my_login", "my_password")'

-- Get the pubs..authors Table object.
EXEC @hr = sp_OAGetProperty @object,
    'Databases("pubs").Tables("authors")',
    @table OUT

-- Get the Rows property of the pubs..authors table.
EXEC @hr = sp_OAGetProperty @object,
    'Databases("pubs").Tables("authors").Rows',
    @rows OUT

-- Call the CheckTable method of the pubs..authors table.
EXEC @hr = sp_OAMethod @object,
    'Databases("pubs").Tables("authors").CheckTable',
    @checkoutput OUT

请参见

使用 OLE 自动化存储过程进行数据类型转换

OLE 自动化脚本示例

如何创建 OLE 自动化对象 (Transact-SQL)

系统存储过程（OLE 自动化扩展存储过程）

如何调试自定义 OLE 自动化服务器 (Transact-SQL)


复制存储过程

复制系统存储过程编写成文档，可以作为特殊环境中执行复制的方法，也可在批处理文件和脚本中使用。然而在大多数情况下，最好使用 SQL-DMO 所提供的编程接口和复制 ActiveX® 控件设计复制程序，而不要编写直接调用系统存储过程的程序。

使用基于系统存储过程的脚本的一个优点是可以执行复制，在一台服务器上创建发布和订阅，通过 SQL Server 企业管理器自动生成脚本，然后在其它服务器上使用该脚本执行复制组件，通常只需要做很少的修改。执行脚本要比使用 SQL Server 企业管理器重复执行相同步骤更迅速、更高效。

有关更多信息，请参见编写复制脚本。


sp_add_agent_parameter

将新参数及其值添加到代理程序配置中。此存储过程在运行代理程序的分发服务器的任何数据库上执行。

语法

sp_add_agent_parameter [ @profile_id = ] profile_id
, [ @parameter_name = ] 'parameter_name'
, [ @parameter_value = ] 'parameter_value'

参数

[@profile_id = ] profile_id

是 msdb 数据库内 MSagent_profiles 表中的配置 ID。profile_id 的数据类型为 int，没有默认设置。

[@parameter_name = ] 'parameter_name'

是参数名。parameter_name 的数据类型为 sysname，没有默认设置。对于系统配置文件，可更改的参数取决于代理程序的类型。若要找出 profile_id 所表示的代理程序类型，请在 Msagent_profiles 表中查找 profile_id，并注意 agent_type 字段的值。对于快照代理程序（它的 agent_type 字段值为 1），下列属性可以更改：

  • bcpbatchsize

  • historyverboselevel

  • logintimeout

  • maxbcpthreads

  • querytimeout

    对于日志读取器代理程序（它的 agent_type 字段值为 2），下列属性可以更改：

  • historyverboselevel

  • logintimeout

  • pollinginterval

  • querytimeout

  • readbatchsize

  • readbatchthreshold

    对于分发代理程序（它的 agent_type 字段值为 3），下列属性可以更改：

  • bcpbatchsize

  • commitbatchsize

  • commitbatchthreshold

  • historyverboselevel

  • logintimeout

  • maxbcpthreads

  • maxdeliveredtransactions

  • pollinginterval

  • querytimeout

  • transactionsperhistory

  • skiperrors

    对于合并代理程序（它的 agent_type 字段值为 4），下列属性可以更改：

  • pollinginterval

  • validateinterval

  • logintimeout

  • querytimeout

  • maxuploadchanges

  • maxdownloadchanges

  • uploadgenerationsperbatch

  • downloadgenerationsperbatch

  • uploadreadchangesperbatch

  • downloadreadchangesperbatch

  • uploadwritechangesperbatch

  • downloadwritechangesperbatch

  • validate

  • fastrowcount

  • historyverboselevel

  • changesperhistory

  • bcpbatchsize

  • numdeadlockretries

    对于自定义配置文件，可更改的参数取决于已定义的参数。若要查看已定义的参数，请运行 sp_help_agent_profile 查看与 profile_id 相关联的 profile_name。然后对于适当的 profile_id，运行 sp_help_agent_parameters 以查看与配置文件相关联的参数。

[@parameter_value = ] 'parameter_value'

是赋给参数的值。parameter_value 的数据类型为 nvarchar(255)，没有默认设置。

返回代码值

0（成功）或 1（失败）

注释

sp_add_agent_parameter 用于快照复制、事务复制和合并复制。

权限

只有 sysadmin 固定服务器角色成员才能执行 sp_add_agent_parameter。

请参见

分发代理程序配置

日志读取器代理程序配置

合并代理程序配置

快照代理程序配置

sp_add_agent_profile

sp_change_agent_profile

sp_drop_agent_parameter

sp_help_agent_parameter

系统存储过程


sp_add_agent_profile

为复制代理程序创建新配置文件。此存储过程在分发服务器的任何数据库上执行。

语法

sp_add_agent_profile [ [ @profile_id = ] profile_id OUTPUT ]
{ , [ @profile_name = ] 'profile_name' [ , [ @agent_type = ] 'agent_type' ] }
[ , [ @profile_type = ] profile_type ]
, [ @description = ] 'description'
[ , [ @default = ] default ]

参数

[@profile_id = ] profile_id

是与新插入的配置关联的 ID。profile_id 的数据类型为 int，并且是可选 OUTPUT 参数。如果已指定，则该值将设置为新配置 ID。

[ @profile_name = ] 'profile_name'

是配置文件名。profile_name 的数据类型为 sysname，没有默认设置。

[ @agent_type = ] 'agent_type'

是复制代理程序的类型。agent_type 的数据类型为 int，没有默认设置，可以是下列值之一。

值 | 描述
1 | 快照代理程序
2 | 日志读取器代理程序
3 | 分发代理程序
4 | 合并代理程序
9 | 队列读取器代理程序

[ @profile_type = ] profile_type

是配置的类型。profile_type 的数据类型为 int，默认设置为 1。0 表示系统配置。1 表示自定义配置。使用此存储过程只能创建自定义配置文件。只有 SQL Server 能创建系统配置文件。

[@description = ] 'description'

是对配置的描述。description 的数据类型为 nvarchar(3000)，没有默认设置。

[ @default = ] default

表示配置是否是 agent_type 的默认设置。default 的数据类型为 bit，默认设置为 0。0 表示配置不是默认设置。1 表示正添加的配置文件将成为 @agent_type 参数所指定的代理程序的新默认配置文件。

返回代码值

0（成功）或 1（失败）

注释

sp_add_agent_profile 用于快照复制、事务复制和合并复制。

在 MSagent_profiles 表中为配置添加行。

权限

只有 sysadmin 固定服务器角色成员才能执行 sp_add_agent_profile。

请参见

sp_add_agent_parameter

sp_change_agent_parameter

sp_change_agent_profile

sp_drop_agent_parameter

sp_drop_agent_profile

sp_help_agent_parameter

sp_help_agent_profile

系统存储过程


sp_addarticle

创建项目并将其添加到发布中。此存储过程在发布服务器的发布数据库上执行。

语法

sp_addarticle [ @publication = ] 'publication'
, [ @article = ] 'article'
, [ @source_table = ] 'source_table'
[ , [ @destination_table = ] 'destination_table' ]
[ , [ @vertical_partition = ] 'vertical_partition' ]
[ , [ @type = ] 'type' ]
[ , [ @filter = ] 'filter' ]
[ , [ @sync_object = ] 'sync_object' ]
[ , [ @ins_cmd = ] 'ins_cmd' ]
[ , [ @del_cmd = ] 'del_cmd' ]
[ , [@upd_cmd = ] 'upd_cmd' ]
[ , [ @creation_script = ] 'creation_script' ]
[ , [ @description = ] 'description' ]
[ , [ @pre_creation_cmd = ] 'pre_creation_cmd' ]
[ , [ @filter_clause = ] 'filter_clause']
[ , [ @schema_option = ] schema_option ]
[ , [ @destination_owner = ] 'destination_owner' ]
[ , [ @status =] status ]
[ , [ @source_owner = ] 'source_owner' ]
[ , [ @sync_object_owner = ] 'sync_object_owner' ]
[ , [ @filter_owner = ] 'filter_owner' ]
[ , [ @source_object = ] 'source_object' ]
[ , [ @artid = ] article_ID OUTPUT ]
[ , [ @auto_identity_range = ] 'auto_identity_range' ]
[ , [ @pub_identity_range = ] pub_identity_range ]
[ , [ @identity_range = ] identity_range ]
[ , [ @threshold = ] threshold ]
[ , [ @force_invalidate_snapshot = ] force_invalidate_snapshot ]

参数

[@publication = ] 'publication'

是包含项目的发布名。该名称在数据库内必须唯一。publication 的数据类型为 sysname，没有默认设置。

[@article = ]'article'

是项目名。该名称在发布内必须唯一。article 的数据类型为 sysname，没有默认设置。

[@source_table = ] 'source_table'

是由项目或存储过程表示的基础表名。source_table 的数据类型为 nvarchar(386)，必须在本地 SQL Server 计算机上，必须遵从标识符规则，而且必须是表（不是视图或其它数据库对象）。支持 source_table 只是为了向后兼容；改用 source_object。

[@destination_table = ] 'destination_table'

是目的（订阅）表（如果不同于 source_table 或存储过程）的名称。destination_table 的数据类型为 sysname，默认设置为 NULL，这表示 source_table 等于 destination_table。

[@vertical_partition = ] 'vertical_partition'

启用和禁用表项目上的列筛选。vertical_partition 的数据类型为 nchar(5)，默认设置为 FALSE。false 表示没有垂直筛选，并发布所有的列。true 清除除声明的主键之外的所有列。列通过 sp_articlecolumn 被添加。

[@type = ] 'type'

是项目类型。type 的数据类型为 sysname，可以是下列值之一。

值 | 描述
logbased | 基于日志的项目。
logbased manualfilter | 带手工筛选的基于日志的项目。
logbased manualview | 带手工视图的基于日志的项目。
logbased manualboth | 带手工筛选和手工视图的基于日志的项目。
proc exec | 将存储过程执行复制到项目的所有订阅服务器。
serializable proc exec | 仅当存储过程在可串行事务上下文内执行时才复制存储过程执行。
NULL（默认值） |

[@filter = ] 'filter'

是用于水平筛选表的存储过程（用 FOR REPLICATION 创建）。filter 的数据类型为 nvarchar(386)，默认设置为 NULL。必须手工执行 sp_articleview 和 sp_articlefilter 以创建视图并筛选存储过程。如果设置不是 NULL，则不创建存储过程（假设手动创建存储过程）。

[@sync_object = ] 'sync_object'

是用于生成数据文件的表或视图的名称，而此数据文件用来表示此项目的快照。sync_object 的数据类型为 nvarchar(386)，默认设置为 NULL。如果是 NULL，则调用 sp_articleview 自动创建用于生成输出文件的视图。这种情况在添加含有 sp_articlecolumn 的任意列后出现。如果设置不是 NULL，则不创建视图（假设手动创建视图）。

[@ins_cmd = ] 'ins_cmd'

是复制项目的插入时使用的复制命令类型。ins_cmd 的数据类型为 nvarchar(255)，可以是下列值之一。

值 | 描述
NONE | 不采取任何操作。
CALL sp_MSins_article

-或-

CALL custom_stored_procedure_name

（默认）

 在订阅服务器上调用要执行的存储过程。若要使用此复制方法，请使用 @schema_option 指定自动创建存储过程，或在项目的每个订阅服务器的目的数据库中创建指定的存储过程。custom_stored_procedure 是用户创建的存储过程名称，sp_Msins_article 包含代替参数的 _article 部分的项目名称。例如，对于 Categories 表，该参数将是 CALL sp_Msins_Categories。
SQL 或 NULL 复制 INSERT 语句。为 INSERT 语句提供项目中发布的所有列值。在插入上复制该命令：
INSERT INTO <table name> VALUES (c1value, c2value, c3value, ..., cnvalue)

[@del_cmd = ] 'del_cmd'

是复制项目的删除时使用的复制命令类型。del_cmd 的数据类型为 nvarchar(255)，可以是下列值之一。

值 | 描述
NONE | 不采取任何操作。
CALL sp_MSdel_article -or-

CALL custom_stored_procedure_name

（默认）

 在订阅服务器上调用要执行的存储过程。若要使用此复制方法，请使用 @schema_option 指定自动创建存储过程，或在项目的每个订阅服务器的目的数据库中创建指定的存储过程。custom_stored_procedure 是用户创建的存储过程名称，sp_Msins_article 包含代替参数的 _article 部分的项目名称。例如，对于 Categories 表，该参数将是 CALL sp_Msins_Categories。
XCALL sp_MSdel_article | 采用 XCALL 样式参数调用存储过程。若要使用这种复制方法，请用 @schema_option 指定自动创建存储过程，或在项目的每个订阅服务器的目的数据库中创建指定的存储过程。
SQL 或 NULL 复制 DELETE 语句。为 DELETE 语句提供所有主键列值。在删除上复制该命令：
DELETE FROM <table name> WHERE pkc1 = pkc1value AND pkc2 = pkc2value AND pkcn = pkcnvalue

说明 CALL、MCALL 和 XCALL 语法对传播到订阅服务器的数据量有不同的处理。CALL 语法传递所有已插入或已删除的列的所有值。MCALL 语法只传递受影响的列的值。XCALL 语法传递所有列的值（无论更改与否），其中包括列在被更改前的值。有关更多信息，请参见在项目中使用自定义存储过程。

[@upd_cmd = ] 'upd_cmd'

是复制项目的更新时使用的复制命令类型。upd_cmd 的数据类型为 nvarchar(255)，可以是下列值之一。

值 | 描述
NONE | 不采取任何操作。
CALL sp_MSupd_article | 在订阅服务器上调用要执行的存储过程。若要使用这种复制方法，请用 @schema_option 指定自动创建存储过程，或在项目的每个订阅服务器的目的数据库中创建指定的存储过程。
MCALL sp_MSupd_article（默认值） | 采用 MCALL 样式参数调用存储过程。若要使用此复制方法，请使用 @schema_option 指定自动创建存储过程，或在项目的每个订阅服务器的目的数据库中创建指定的存储过程。custom_stored_procedure 是用户创建的存储过程名称，sp_Msins_article 包含代替参数的 _article 部分的项目名称。例如，对于 Categories 表，该参数将是 CALL sp_Msins_Categories。
XCALL sp_MSupd_article | 采用 XCALL 样式参数调用存储过程。若要使用这种复制方法，请用 @schema_option 指定自动创建存储过程，或在项目的每个订阅服务器的目的数据库中创建指定的存储过程。
SQL 或 NULL 复制 UPDATE 语句。UPDATE 语句在所有的列值和主键列值上提供。在更新上复制该命令：
UPDATE <table name> SET c1 = c1value, SET c2 = c2value, SET cn = cnvalue WHERE pkc1 = pkc1value AND pkc2 = pkc2value AND pkcn = pkcnvalue

说明 CALL、MCALL 和 XCALL 语法对传播到订阅服务器的数据量有不同的处理。CALL 语法传递所有已插入或已删除的列的所有值。MCALL 语法只传递受影响的列的值。XCALL 语法传递所有列的值（无论更改与否），其中包括列在被更改前的值。有关更多信息，请参见在项目中使用自定义存储过程。

[@creation_script = ] 'creation_script'

是用于创建目标表的项目架构脚本的路径和名称。creation_script 的数据类型为 nvarchar(127)，默认设置为 NULL。

[@description = ] 'description'

是项目的描述项。description 的数据类型为 nvarchar(255)，默认设置为 NULL。

[@pre_creation_cmd = ] 'pre_creation_cmd'

当应用该项目的快照时，指定系统在订阅服务器上检测到同名的现有对象时所应采取的操作。pre_creation_cmd 的数据类型为 nvarchar(10)，可以是下列值之一。

值 | 描述
none | 不使用命令。
delete | 删除目的表。
drop（默认值） | 除去目的表。
truncate | 截断目的表。对 ODBC 或 OLE DB 订阅服务器无效。

[@filter_clause = ] 'filter_clause'

是定义水平筛选的 (WHERE) 限制子句。输入该限制子句时，省略关键字 WHERE。filter_clause 的数据类型为 ntext，默认设置为 NULL。有关更多信息，请参见自动生成筛选。

[@schema_option = ] schema_option

是给定项目的架构生成选项的位掩码。该参数指定在目的数据库中为所有 CALL/MCALL/XCALL 自动创建此存储过程。schema_option 的数据类型为 binary(8)，可以是下列值的组合。如果该值是 NULL，则系统将为该项目自动生成有效架构选项。"注释"中给出的表显示基于项目类型和复制类型的组合而选择的值。

值 | 描述
0x00 | 禁止由快照代理程序创建脚本并使用 creation_script。
0x01 | 生成对象创建（CREATE TABLE、CREATE PROCEDURE 等）。该值是存储过程项目的默认值。
0x02 | 生成项目的自定义存储过程（如果已定义）。
0x10 | 生成对应的聚集索引。
0x20 | 将用户定义数据类型转换为基本数据类型。
0x40 | 生成对应的非聚集索引。
0x80 | 在主键上包含声明引用完整性。
0x100 | 如果已定义，则复制表项目上的用户触发器。
0x200 | 复制外键约束。如果引用的表不是发布的一部分，则将不复制已发布表上的所有外键约束。
0x400 | 复制检查约束。
0x800 | 复制默认值。
0x1000 | 复制列级排序规则。
0x2000 | 复制与已发布项目源对象关联的扩展的属性。
0x4000 | 如果在表项目上定义了唯一键，则复制唯一键。
0x8000 | 使用 ALTER TABLE 语句将表项目上的主键和唯一键作为约束复制。
NULL |

并非所有的 @schema_option 值对每个复制类型和项目类型都有效。"注释"中给出的"有效架构选项"表显示可基于项目类型和复制类型的组合进行选择的有效架构选项。

[@destination_owner = ] 'destination_owner'

是目的对象所有者的名称。destination_owner 的数据类型为 sysname，默认设置为 NULL。如果 ODBC 订阅服务器可以订阅发布，则 destination_owner 必须为 NULL。

[@status = ] status

是 article 选项的位掩码。status 的数据类型为 tinyint，可以是下列值之一。

值 | 描述
0 | 没有附加属性。
8 | 在 INSERT 语句中包含列名。
16（默认值） | 使用参数化语句。
24 | 在 INSERT 语句中包含列名，并使用参数化语句。

[@source_owner = ] 'source_owner'

是源对象的所有者。source_owner 的数据类型为 sysname，默认设置为 NULL。

[@sync_object_owner = ] 'sync_object_owner'

是同步对象的所有者。sync_object_owner 的数据类型为 sysname，默认设置为 NULL。

[@filter_owner = ] 'filter_owner'

是筛选的所有者。filter_owner 的数据类型为 sysname，默认设置为 NULL。

[@source_object = ] 'source_object'

是要发布的表或存储过程。source_object 的数据类型为 sysname，默认设置为 NULL。如果 source_table 是 NULL，则 source_object 不能是 NULL。应使用 source_object 而非 source_table。提供 source_table 是为了向后与 SQL Server 6.x 发布服务器兼容。

[@artid = ] article_ID OUTPUT

是新项目的项目 ID。article_ID 的数据类型为 int，默认设置为 NULL，它是 OUTPUT 参数。

[@auto_identity_range = ] 'auto_identity_range'

当创建发布时，启用和禁用对该发布的自动标识范围处理。auto_identity_range 的数据类型为 nvarchar(5)，默认设置为 FALSE。true 启用自动标识范围处理；false 则禁用它。注意标识范围管理只适用于允许即时更新或排队更新的快照发布或事务发布。有关更多信息，请参见管理标识值。

[@pub_identity_range = ] pub_identity_range

控制发布服务器上的范围大小（如果项目的 auto_identity_range 已设置为 true）。pub_identity_range 的数据类型为 bigint，默认设置为 NULL。

[@identity_range = ] identity_range

控制订阅服务器上的范围大小（如果项目的 auto_identity_range 已设置为 true）。identity_range 的数据类型为 bigint，默认设置为 NULL。当 auto_identity_range 设置为 true 时使用该参数。

[@threshold = ] threshold

是控制分发代理程序何时指派新标识范围的百分比值。当使用在 threshold 中指定的百分比值时，分发代理程序创建新标识范围。threshold 的数据类型为 bigint，默认设置为 NULL。当 auto_identity_range 设置为 true 时使用该参数。

[@force_invalidate_snapshot = ] force_invalidate_snapshot

确认此存储过程所采取的操作可能会使现有的快照无效。force_invalidate_snapshot 的数据类型为 bit，默认设置为 0。0 指定添加项目不会导致快照无效。如果存储过程检测到更改确实需要新快照，则会发生错误，且不会进行任何更改。1 指定添加项目可能导致快照无效，且如果有现有订阅需要新快照，则提供适当的权限，使现有快照被标记为废弃并生成新快照。

返回代码值

0（成功）或 1（失败）

注释

sp_addarticle 用于快照复制或事务复制。

如果 vertical_partition 设置为 true，则 sp_addarticle 将视图的创建推迟到调用 sp_articleview 时（添加最后一个 sp_articlecolumn 之后）。

如果发布允许即时更新订阅，且已发布表没有 uniqueidentifier 列，则 sp_addarticle 自动将 uniqueidentifier 列添加到表中。

该表描述如果用户传递的是 NULL 值，则为存储过程选择的 @schema_option 默认值。默认值基于表的第一行中显示的复制类型和第一列中显示的项目类型。空单元表示无效的项目类型和复制类型组合，因而没有默认值。

项目类型 | 复制类型
 | 事务复制 | 快照复制
logbased | 0xF3 | 0x71
logbased manualfilter | 0xF3 | 0x71
logbased manualview | 0xF3 | 0x71
indexed view logbased | 0xF3 | 0x71
indexed view logbased manualfilter | 0xF3 | 0x71
indexed view logbased manualview | 0xF3 | 0x71
indexed view logbase manualboth | 0xF3 | 0x71
proc exec | 0x01 | 0x01
serialized proc exec | 0x01 | 0x01
proc schema only | 0x01 | 0x01
view schema only | 0x01 | 0x01
func schema only | 0x01 | 0x01
indexed view schema only | 0x01 | 0x01
table |  |

说明 如果为排队更新启用了发布，则 @schema_option 值 0x8000 和 0x0080 将被添加到下表所显示的默认值中。

有效架构选项表

项目类型 | 复制类型
 | 事务复制 | 快照复制
logbased | 所有选项 | 除 0x02 之外的所有选项
logbased manualfilter | 所有选项 | 除 0x02 之外的所有选项
logbased manualview | 所有选项 | 除 0x02 之外的所有选项
indexed view logbased | 所有选项 | 除 0x02 之外的所有选项
indexed view logbased manualfilter | 所有选项 | 除 0x02 之外的所有选项
indexed view logbased manualview | 所有选项 | 除 0x02 之外的所有选项
indexed view logbase manualboth | 所有选项 | 除 0x02 之外的所有选项
proc exec | 0x01 和 0x2000 | 0x01 和 0x2000
serialized proc exec | 0x01 和 0x2000 | 0x01 和 0x2000
proc schema only | 0x01 和 0x2000 | 0x01 和 0x2000
view schema only | 0x01、0x0100 和 0x2000 | 0x01、0x0100 和 0x2000
func schema only | 0x01 和 0x2000 | 0x01 和 0x2000
indexed view schema only | 0x01、0x10、0x040、0x0100 和 0x2000 | 0x01、0x10、0x040、0x0100 和 0x2000
table |  |

说明 对于排队更新发布，必须启用 @schema_option 值 0x8000 和 0x80。

权限

只有 sysadmin 固定服务器角色成员和 db_owner 固定数据库角色成员才能执行 sp_addarticle。

请参见

增强事务复制性能

sp_addpublication

sp_articlecolumn

sp_articlefilter

sp_articleview

sp_changearticle

sp_changepublication

sp_droparticle

sp_droppublication

sp_enumfullsubscribers

sp_helparticle

sp_helparticlecolumns

sp_helppublication

系统存储过程


sp_adddistpublisher

配置发布服务器以使用指定的分发数据库。此存储过程在分发服务器的任何数据库上执行。注意在使用此存储过程之前必须已运行存储过程 sp_adddistributor 和 sp_adddistributiondb。

语法

sp_adddistpublisher [ @publisher = ] 'publisher'
[ , @distribution_db = ] 'distribution_db'
[ , [ @security_mode = ] security_mode ]
[ , [ @login = ] 'login' ]
[ , [ @password = ] 'password' ]
{ , [ @working_directory = ] 'working_directory' }
[ , [ @trusted = ] 'trusted' ]
[ , [ @encrypted_password = ] encrypted_password ]
[ , [ @thirdparty_flag = ] thirdparty_flag ]

参数

[@publisher = ] 'publisher'

是发布服务器名。publisher 的数据类型为 sysname，没有默认设置。

[ @distribution_db = ] 'distribution_db'

是分发数据库名。distribution_db 的数据类型为 sysname，没有默认设置。该参数由复制代理程序用于连接到发布服务器。

[@security_mode = ] security_mode

是已实现的安全模式。复制代理程序使用该参数连接到发布服务器。security_mode 的数据类型为 int，可以是下列值之一。

值 | 描述
0 | 分发服务器上的复制代理程序使用 SQL Server 身份验证连接到发布服务器。
1 | 分发服务器上的复制代理程序使用 Windows 身份验证连接到发布服务器。
NULL（默认值） | 如果服务器（分发服务器）运行的是 Windows 95® 或 Windows 98 操作系统，则系统将该值更改为 0。如果服务器（分发服务器）运行的是 Windows NT® 4.0 或 Windows 2000 操作系统，则系统将该值更改为 1。

[ @login = ] 'login'

是登录。如果 security_mode 是 0，则必需该参数。login 的数据类型为 sysname，默认设置为 sa。该参数由复制代理程序用于连接到发布服务器。

[@password = ] 'password']

是密码。password 的数据类型为 sysname，默认设置为 NULL。该参数由复制代理程序用于连接到发布服务器。

[@working_directory = ] 'working_directory'

是用于存储发布的数据和架构文件的工作目录名。working_directory 的数据类型为 nvarchar(255)。应将该名称指定为 UNC 格式。

[@trusted = ] 'trusted'

是远程发布服务器使用与本地分发服务器相同的密码的时间。trusted 的数据类型为 nvarchar(5)，可以是下列值之一。

值 | 描述
True | 添加一个信任登录映射：sa 到 distributor_admin。该映射受信任，因此在远程发布服务器上不需要密码连接到分发服务器。
False | 添加一个不可信的映射：distributor_admin 到 distributor_admin。远程发布服务器上需要密码建立连接。
NULL（默认值） | 如果分发发布者是本地的，则系统将该值更改为 false（不可信）。为分发服务器设置的任何密码也为本地分发发布者设置（链接服务器连接回本地分发服务器）。如果分发发布者是远程的，则系统将该值更改为 true（可信），并且在远程发布服务器上不需要密码。如果用户直接更改 distributor_admin 密码，而不是使用 sp_changedistributor_password，则本地链接断开。

[@encrypted_password = ] encrypted_password

是加密密码的时间。encrypted_password 的数据类型为 bit，默认设置为 0。如果设置为 1，则以加密格式存储密码。

[@thirdparty_flag = ] thirdparty_flag

是发布服务器为 Microsoft® SQL Server™ 的时间。thirdparty_flag 的数据类型为 bit，可以是下列值之一。

值 | 描述
0（默认值） | Microsoft SQL Server 数据库。
1 | 除 SQL Server 之外的数据库。

返回代码值

0（成功）或 1（失败）

注释

sp_adddistpublisher 用于快照复制、事务复制和合并复制。

权限

只有 sysadmin 固定服务器角色成员才能执行 sp_adddistpublisher。

请参见

sp_changedistpublisher

sp_dropdistpublisher

sp_helpdistpublisher

系统存储过程


sp_adddistributiondb

创建新的分发数据库并安装分发服务器架构。分发数据库存储过程、架构以及用于复制的元数据。此存储过程在分发服务器的主数据库上执行，创建分发数据库并安装启用复制分发所需的表和存储过程。

语法

sp_adddistributiondb [ @database = ] 'database'
[ , [ @data_folder = ] 'data_folder' ]
[ , [ @data_file = ] 'data_file' ]
[ , [ @data_file_size = ] data_file_size ]
[ , [ @log_folder = ] 'log_folder' ]
[ , [ @log_file = ] 'log_file' ]
[ , [ @log_file_size = ] log_file_size ]
[ , [ @min_distretention = ] min_distretention ]
[ , [ @max_distretention = ] max_distretention ]
[ , [ @history_retention = ] history_retention ]
[ , [ @security_mode = ] security_mode ]
[ , [ @login = ] 'login' ]
[ , [ @password = ] 'password' ]
[ , [ @createmode = ] createmode ]

参数

[@database = ] 'database'

是要创建的分发数据库名称。database 的数据类型为 sysname，没有默认设置。

[@data_folder = ] 'data_folder'

是用于存储分发数据库数据文件的目录名称。data_folder 的数据类型为 nvarchar(255)，默认设置为 NULL。如果是 NULL，则使用 Microsoft® SQL Server™ 实例的数据目录，例如"C:\Program Files\Microsoft SQL Server\Mssql\Data"。

[@data_file = ] 'data_file'

是数据库文件名。data_file 的数据类型为 nvarchar(255)，默认设置为 database。如果是 NULL，则存储过程使用数据库名称构造文件名。

[@data_file_size = ] data_file_size

是以兆字节 (MB) 为单位的数据文件初始大小。data_file_size 的数据类型为 int，默认设置为 2 MB。

[@log_folder = ] 'log_folder'

是数据库日志文件目录名。log_folder 的数据类型为 nvarchar(255)，默认设置为 NULL。如果是 NULL，则使用 SQL Server 实例的数据目录，例如 C:\Program Files\Microsoft SQL Server\Mssql\Data。

[@log_file = ] 'log_file'

是日志文件名。log_file 的数据类型为 nvarchar(255)，默认设置为 NULL。如果是 NULL，则存储过程使用数据库名称构造文件名。

[@log_file_size = ] log_file_size

是初始日志文件大小（以 MB 为单位）。log_file_size 的数据类型为 int，默认设置为 0 MB，表示使用 SQL Server 允许的最小日志文件大小所创建的文件大小。

[@min_distretention = ] min_distretention

是事务从分发数据库中删除前的最小保持期（以小时为单位）。min_distretention 的数据类型为 int，默认设置为 0 小时。

[@max_distretention = ] max_distretention

是事务被删除前的最大保持期（以小时为单位）。max_distretention 的数据类型为 int，默认设置为 72 小时。将还没有接收到早于最大分发保持期的复制命令的订阅标记为非活动，且需要重新初始化。对每个非活动的订阅发出 RAISERROR 21011。

[@history_retention = ] history_retention

是保留历史记录的小时数。history_retention 的数据类型为 int，默认设置为 48 小时。

[@security_mode = ] security_mode

是要在创建分发数据库对象时使用的安全模式。security_mode 的数据类型为 int，默认设置为 0。0 指定 SQL Server 身份验证，而 1 指定 Windows 身份验证。

[@login = ] 'login'

是连接到分发服务器时所使用的登录名，连接后可以运行 instdist.sql 创建分发数据库对象。如果将 security_mode 设置为 0，则这是必需的。login 的数据类型为 sysname，默认设置为 sa。

[@password = ] 'password'

是连接到分发服务器运行 instdist.sql 时所使用的密码。如果将 security_mode 设置为 0，则这是必需的。password 的数据类型为 sysname，默认设置为 NULL。

[@createmode = ] createmode

createmode 的数据类型为 int，默认设置为 0，可以是下列值之一。

值 | 描述
0（默认值） | CREATE DATABASE，使用分发数据库模型文件 (distmdl.mdf) 的复本附加分发数据库。
1 | CREATE DATABASE 或使用现有的数据库，然后应用 instdist.sql 文件在分发数据库中创建复制对象。
2 | 仅限内部使用。

返回代码值

0（成功）或 1（失败）

注释

sp_adddistributiondb 用于所有类型的复制。但是，此存储过程只在分发服务器上运行。

在运行 sp_adddistributiondb 之前运行 sp_adddistributor。

权限

只有 sysadmin 固定服务器角色成员才能执行 sp_adddistributiondb。

请参见

sp_changedistributiondb

sp_dropdistributiondb

sp_helpdistributiondb

系统存储过程


sp_adddistributor

在 sysservers 表中创建一项（如果 sysservers 表中没有条目），将服务器项标记为分发服务器，并存储属性信息。此存储过程在分发服务器的主数据库上执行，将服务器注册并标记为分发服务器。在远程分发服务器的情况中，此存储过程还在发布服务器的主数据库上执行以注册远程分发服务器。

语法

sp_adddistributor [ @distributor = ] 'distributor'
[ , [ @heartbeat_interval = ] heartbeat_interval ]
[ , [ @password = ] 'password' ]
[ , [ @from_scripting = ] from_scripting ]

参数

[@distributor = ] 'distributor'

是分发服务器名称。distributor 的数据类型为 sysname，没有默认设置。如果设置远程分发服务器，则仅使用此参数。它在 msdb..MSdistributor 表中添加分发服务器属性项。

[@heartbeat_interval = ] heartbeat_interval

是代理程序在不记录进度消息的情况下可以运行的最长分钟数。heartbeat_interval 的数据类型为 int，默认值为 10 分钟。创建按该间隔唤醒的 SQL 代理程序作业，以检查正在运行的复制代理程序的状态。

[@password = ] 'password']

是 distributor_admin 登录的密码。password 的数据类型为 sysname，默认设置为 NULL。如果是 NULL 或 N，则密码重置为随机值。当添加第一台不信任的远程分发服务器时，必须配置该密码。存储用于 distributor RPC 连接（包括本地连接）的链接服务器项的 distributor_admin 登录和 password。如果 distributor 是本地分发服务器，则 distributor_admin 的密码将设置为新值。

[@from_scripting = ] from_scripting

仅限内部使用。

返回代码值

0（成功）或 1（失败）

注释

sp_adddistributor 用于快照复制、事务复制和合并复制。

权限

只有 sysadmin 固定服务器角色成员才能执行 sp_adddistributor。

请参见

sp_changedistributor_property

sp_dropdistributor

sp_helpdistributor

系统存储过程


sp_addmergealternatepublisher

添加使订阅服务器使用可选同步伙伴的能力。发布属性必须指定订阅服务器可以与其它发布服务器同步。此存储过程在订阅服务器的订阅数据库上执行。

语法

sp_addmergealternatepublisher [ @publisher = ] 'publisher'
, [ @publisher_db = ] 'publisher_db'
, [ @publication = ] 'publication '
, [ @alternate_publisher = ] 'alternate_synchronization_partner'
, [ @alternate_publisher_db = ] 'alternate_publisher_db'
, [ @alternate_publication = ] 'alternate_synchronization_partner'
, [ @alternate_distributor = ] 'alternate_distributor'
[ , [ @friendly_name = ] 'friendly_name' ]
[ , [ @reserved= ] 'reserved' ]

参数

[@publisher = ] 'publisher'

是发布服务器名。publisher 的数据类型为 sysname，没有默认设置。

[@publisher_db = ] 'publisher_db'

是发布数据库名。publisher_db 的数据类型为 sysname，没有默认设置。

[@publication = ] 'publication'

是发布名。publication 的数据类型为 sysname，没有默认设置。

[@alternate_publisher = ] 'alternate_synchronization_partner'

是备用发布服务器名称。alternate_synchronization_partner 的数据类型为 sysname，没有默认设置。

[@alternate_publisher_db = ] 'alternate_publisher_db'

是备用发布服务器上的发布数据库名称。alternate_publisher_db 的数据类型为 sysname，没有默认设置。

[@alternate_publication = ] 'alternate_synchronization_partner'

是可选同步伙伴上的发布名。alternate_synchronization_partner 的数据类型为 sysname，没有默认设置。

[@alternate_distributor = ] 'alternate_distributor'

是可选同步伙伴的分发服务器名称。alternate_distributor 的数据类型为 sysname，没有默认设置。

[@friendly_name = ] 'friendly_name'

是显示名称，通过该名称可以确定构成可选同步伙伴的发布服务器、发布和分发服务器之间的关联。friendly_name 的数据类型为 nvarchar(255)，默认设置为 NULL。

[@reserved = ] 'reserved'

仅限内部使用。

返回代码值

0（成功）或 1（失败）

注释

sp_addmergealternatepublisher 用于合并复制。

权限

只有 sysadmin 固定服务器角色成员或 db_owner 固定数据库角色成员才能执行 sp_addmergealternatepublisher。

请参见

可选同步伙伴


sp_addmergearticle

在现有的合并发布中添加项目。此存储过程在发布服务器的发布数据库上执行。

语法

sp_addmergearticle [ @publication = ] 'publication'
, [ @article = ] 'article'
, [ @source_object = ] 'source_object'
[ , [ @type = ] 'type' ]
[ , [ @description = ] 'description' ]
[ , [ @column_tracking = ] 'column_tracking' ]
[ , [ @status = ] 'status' ]
[ , [ @pre_creation_cmd = ] 'pre_creation_cmd' ]
[ , [ @creation_script = ] 'creation_script' ]
[ , [ @schema_option = ] schema_option ]
[ , [ @subset_filterclause = ] 'subset_filterclause' ]
[ , [ @article_resolver = ] 'article_resolver' ]
[ , [ @resolver_info = ] 'resolver_info' ]
[ , [ @source_owner = ] 'source_owner' ]
[ , [ @destination_owner = ] 'destination_owner' ]
[ , [ @vertical_partition = ] 'vertical_partition' ]
[ , [ @auto_identity_range = ] 'auto_identity_range' ]
[ , [ @pub_identity_range = ] pub_identity_range ]
[ , [ @identity_range = ] identity_range ]
[ , [ @threshold = ] threshold ]
[ , [ @verify_resolver_signature = ] verify_resolver_signature ]
[ , [ @destination_object = ] 'destination_object' ]
[ , [ @allow_interactive_resolver = ] 'allow_interactive_resolver' ]
[ , [ @fast_multicol_updateproc = ] 'fast_multicol_updateproc' ]
[ , [ @check_permissions = ] check_permissions ]
[ , [ @force_invalidate_snapshot = ] force_invalidate_snapshot ]

参数

[@publication = ] 'publication'

是包含该项目的发布名。publication 的数据类型为 sysname，没有默认设置。

[@article = ] 'article'

是项目名。article 的数据类型为 sysname，没有默认设置。article 必须为本地 SQL Server 计算机，而且必须遵从标识符规则。

[@source_object = ] 'source_object'

是从其中添加项目的源对象名称。source_object 的数据类型为 sysname，没有默认设置。

[@type = ] 'type'

是项目类型。type 的数据类型为 sysname，默认设置为 table，可以是下列值之一。

值 | 描述
table（默认值） | 项目监视表以确定已复制数据。
indexed view schema only | 项目监视索引视图和架构以确定源数据。
view schema only | 项目监视视图和架构以确定源数据。
proc schema only | 项目使用存储过程执行和架构以确定源数据。
func schema only | 项目使用用户定义的函数执行和架构以确定源数据。
NULL（默认值） |

[@description = ] 'description'

是对项目的描述。description 的数据类型为 nvarchar(255)，默认设置为 NULL。

[@column_tracking = ] 'column_tracking'

是列级跟踪的设置。column_tracking 的数据类型为 nvarchar(10)，默认设置为 FALSE。true 打开列跟踪。而 false 关闭列跟踪并在行级上保留冲突检测。如果已在其它合并发布中发布了表，则必须使用与基于该表的现有项目所用的相同的列跟踪值。该参数只专用于表项目。

[@status = ] 'status'

是项目状态。status 的数据类型为 nvarchar(10)，默认设置为 unsynced。如果是 active，则表示发布表的初始处理脚本已运行。如果是 unsynced，则表示发布表的初始处理脚本在下一次运行快照代理程序时运行。

[@pre_creation_cmd = ] 'pre_creation_cmd'

如果表存在于订阅服务器上，指定系统在应用快照时所采取的操作。pre_creation_cmd 的数据类型为 nvarchar(10)，可以是下列值之一。

值 | 描述
None | 如果表已在订阅服务器上存在，则不采取任何操作。
Delete | 根据子集筛选中的 WHERE 子句发出删除命令。
drop（默认值） | 重新创建表之前先除去表。
Truncate | 与 delete 相同，但是删除页而非行。不要使用 WHERE 子句。

[@creation_script = ] 'creation_script'

是项目的可选架构预创建脚本。creation_script 的数据类型为 nvarchar(255)，默认设置为 NULL。

[@schema_option = ] schema_option

是给定项目的架构生成选项位图。schema_option 的数据类型为 binary(8)，可以是下列值之一。如果该值是 NULL，则系统将为该项目自动生成有效架构选项。"注释"中给出的表显示基于项目类型和复制类型的组合而选择的值。另外，并非所有的 @schema_option 值对每个复制类型和项目类型都有效。"注释"中给出的"有效架构选项"表显示可基于项目类型和复制类型的组合进行选择的有效架构选项。

值 | 描述
0x00 | 禁用由快照代理程序使用的脚本并使用提供的创建脚本。
0x01 | 生成对象创建（CREATE TABLE、CREATE PROCEDURE 等）。它是存储过程项目的默认值。
0x10 | 生成对应的聚集索引。
0x20 | 将用户定义数据类型转换为基本数据类型。
0x40 | 生成对应的非聚集索引。
0x80 | 在主键上包含声明引用完整性。
0x100 | 如果已定义，则复制表项目上的用户触发器。
0x200 | 复制外键约束。如果引用的表不是发布的一部分，则将不复制已发布表上的所有外键约束。
0x400 | 复制检查约束。
0x800 | 复制默认值。
0x1000 | 复制列级排序规则。
0x2000 | 复制与已发布项目源对象关联的扩展的属性。
0x4000 | 如果在表项目上定义了唯一键，则复制唯一键。
0x8000 | 使用 ALTER TABLE 语句将表项目上的主键和唯一键复制为约束。

[@subset_filterclause = ] 'subset_filterclause'

是 WHERE 子句，它指定表项目的水平筛选，不包含单词 WHERE。subset_filterclause 的数据类型为 nvarchar(1000)，默认设置为空字符串。有关更多信息，请参见自动生成筛选。

[@article_resolver = ] 'article_resolver'

是用于解决表项目上的冲突的冲突解决程序。article_resolver 的数据类型为 varchar(255)，默认设置为 NULL。此参数的可用值列在 Microsoft 冲突解决程序描述中。如果提供的值不是一个 Microsoft 冲突解决程序，则 SQL Server 使用指定的冲突解决程序代替系统所提供的冲突解决程序。使用 sp_enumcustomresolvers 枚举可用自定义冲突解决程序的列表。

[@resolver_info = ] 'resolver_info'

是用于指定自定义冲突解决程序所需的附加信息。某些 Microsoft 冲突解决程序要求将列作为冲突解决程序的输入提供。resolver_info 的数据类型为 nvarchar(255)，默认设置为 NULL。有关更多信息，请参见 Microsoft 冲突解决程序描述。

[@source_owner = ] 'source_owner'

是 source_object 所有者的名称。source_owner 的数据类型为 sysname，默认设置为 NULL。如果是 NULL，则假定当前用户为所有者。

[@destination_owner = ] 'destination_owner'

是订阅数据库中的对象所有者（如果不是"dbo"）。destination_owner 的数据类型为 sysname，默认设置为 NULL。如果是 NULL，则假设"dbo"为所有者。

[@vertical_partition = ] 'column_filter'

启用和禁用表项目上的列筛选。vertical_partition 的数据类型为 nvarchar(5)，默认设置为 FALSE。false 表示没有垂直筛选，并发布所有的列。而 true 清除除声明的主键和 ROWGUID 外的所有列。列通过 sp_articlecolumn 被添加。

[@auto_identity_range = ] 'automatic_identity_range'

在创建发布时启用和禁用对发布上的表项目的自动标识范围处理。auto_identity_range 的数据类型为 nvarchar(5)，默认设置为 FALSE。true 启用自动标识范围处理，false 则禁用它。有关更多信息，请参见管理标识值。

[@pub_identity_range = ] pub_identity_range

控制发布服务器上的范围大小（如果项目的 auto_identity_range 已设置为 true）。auto_identity_range 的数据类型为 bigint，默认设置为 NULL。

[@identity_range = ] identity_range

控制订阅服务器上的范围大小（如果项目的 auto_identity_range 已设置为 true）。identity_range 的数据类型为 bigint，默认设置为 NULL。

[@threshold = ] threshold

控制合并代理程序何时指派新标识范围的百分比值。当使用在 threshold 中指定的百分比值时，合并代理程序创建新标识范围。threshold 的数据类型为 int，默认设置为 NULL。当 auto_identity_range 设置为 true 时使用该参数。

[@verify_resolver_signature = ] verify_resolver_signature

指定是否在将冲突解决程序用于合并复制之前验证数字签名。verify_resolver_signature 的数据类型为 int，默认设置为 0。0 指定将不验证签名。1 指定将验证签名以查看它的来源是否可信。有关更多信息，请参见Replication Signature Verification Constants (SQLDMO_VERIFYSIGNATURE_TYPE)。

[@destination_object = ] 'destination_object'

是订阅数据库中的对象名称。destination_object 的数据类型为 sysname，默认设置与 @source_object 中的设置相同。只有当项目是纯架构的项目，如存储过程、视图和 UDF 时，才能指定此参数。如果指定的项目为表项目，则 @source_object 中的值将重写 destination_object 中的值。

[@allow_interactive_resolver = ] 'allow_interactive_resolver'

在项目上启用或禁用交互式冲突解决程序。allow_interactive_resolver 的数据类型为 nvarchar(5)，默认设置为 FALSE。true 在项目上启用交互式冲突解决程序；而 false 禁用它。

[@fast_multicol_updateproc = ] 'fast_multicol_updateproc'

启用或禁用合并代理程序以对一个 UPDATE 语句中同一行内的多个列进行更改。fast_multicol_updateproc 的数据类型为 nvarchar(5)，默认设置为 TRUE。true 更新一个语句中的多个列。而 false 对每个更改的列分别发出 UPDATE。出于性能上的考虑，如果更新两个或更多的列，最好将该值设置为 true。但是，如果表上有这样的用户触发器，它在通过 IF UPDATE(col) 检测到的特定列的更新时会产生错误，则应将该选项设置为 false。即使那列未更新为新值，IF UPDATE(col) 仍将检测到列的更新并产生错误。这是因为在将选项设置为 true 时，所有的列（除了象筛选中所涉及的列这样的特殊列）都在一个 UPDATE 语句中设置。如果特定列的值未更改，它即被设置为原来的值。

[@check_permissions = ] check_permissions

是表级权限的位图，当合并代理程序对发布服务器进行更改时系统会对其进行验证。如果合并进程所使用的发布服务器登录/用户帐户没有正确的表权限，则无效更改将会记录为冲突。check_permissions 的数据类型为 int，可以是下列值之一。

值 | 描述
0x00（默认值） | 将不检查权限。
0x10 | 在可以上载订阅服务器上的 INSERT 操作之前检查发布服务器上的权限。
0x20 | 在可以上载订阅服务器上的 UPDATE 操作之前检查发布服务器上的权限。
0x40 | 在可以上载订阅服务器上进行的 DELETE 操作之前检查发布服务器上的权限。

[@force_invalidate_snapshot = ] force_invalidate_snapshot

确认此存储过程所采取的操作可能会使现有的快照无效。force_invalidate_snapshot 的数据类型为 bit，默认设置为 0。0 指定添加项目不会导致快照无效。如果存储过程检测到更改确实需要新快照，则会发生错误，且不会进行任何更改。而 1 指定添加项目可能会导致快照无效，而且如果有需要新快照的现有订阅，则值 1 将提供适当的权限，使现有快照被标记为废弃并生成新快照。

返回代码值

0（成功）或 1（失败）

注释

sp_addmergearticle 用于合并复制。

该表描述如果用户传递的是 NULL 值，则为存储过程选择的 @schema_option 默认值。默认值基于表的第一行中显示的复制类型和第一列中显示的项目类型。空单元表示无效的项目类型和复制类型组合，因而没有默认值。

项目类型 | 复制类型
 | 合并
logbased |
logbased manualfilter |
logbased manualview |
indexed view logbased |
indexed view logbased manualfilter |
indexed view logbased manualview |
indexed view logbase manualboth |
proc exec |
serialized proc exec |
proc schema only | 0x01
view schema only | 0x01
func schema only | 0x01
indexed view schema only | 0x01
table | 0xccf1

有效架构选项表

项目类型 | 复制类型
 | 合并
logbased |
logbased manualfilter |
logbased manualview |
indexed view logbased |
indexed view logbased manualfilter |
indexed view logbased manualview |
indexed view logbase manualboth |
proc exec | 0x01 和 0x2000
serialized proc exec | 0x01 和 0x2000
proc schema only | 0x01 和 0x2000
view schema only | 0x01、0x0100 和 0x2000
func schema only | 0x01 和 0x2000
indexed view schema only | 0x01、0x10、0x040、0x0100 和 0x2000
table | 除 0x02 和 0x8000 外的所有选项

权限

只有 sysadmin 固定服务器角色成员或 db_owner 固定数据库角色成员才能执行 sp_addmergearticle。

请参见

管理标识值

行级跟踪与列级跟踪

sp_changemergearticle

sp_dropmergearticle

sp_helpmergearticle

系统存储过程

指定自定义冲突解决程序


sp_addmergefilter

添加新合并筛选以创建基于与另一个表的联接的分区。此存储过程在发布服务器的发布数据库上执行。

语法

sp_addmergefilter [ @publication = ] 'publication'
, [ @article = ] 'article'
, [ @filtername = ] 'filtername'
, [ @join_articlename = ] 'join_articlename'
, [ @join_filterclause = ] join_filterclause
[ , [ @join_unique_key = ] join_unique_key ]
[ , [ @force_invalidate_snapshot = ] force_invalidate_snapshot ]
[ , [ @force_reinit_subscription = ] force_reinit_subscription ]

参数

[@publication = ] 'publication'

是包含该项目的发布名。publication 的数据类型为 sysname，没有默认设置。

[@article = ] 'article'

是项目名。article 的数据类型为 sysname，没有默认设置。

[@filtername = ] 'filtername'

是筛选名。filtername 是必需参数。filtername 的数据类型为 sysname，没有默认设置。

[@join_articlename = ] 'join_articlename'

是联接表的项目名。join_articlename 的数据类型为 sysname，没有默认设置。项目必须在 publication 给定的发布内。

[@join_filterclause = ] join_filterclause

是限定联接的筛选子句。join_ filterclause 的数据类型为 nvarchar(2000)。join_filterclause 只定义此存储过程中的布尔筛选。

[@join_unique_key = ] join_unique_key

指定联接是否在 @article 所指定表中的唯一键上。join_unique_key 的数据类型为 int，默认设置为 0。0 表示非唯一键。1 表示在 @join_articlename 中的唯一键上。

[@force_invalidate_snapshot = ] force_invalidate_snapshot

确认此存储过程采取的操作可能会使现有的快照无效。force_invalidate_snapshot 的数据类型为 bit，默认设置为 0。0 指定对合并项目的更改将不会导致快照无效。如果此存储过程检测到更改确实需要新的快照，则将会出现错误，且不会进行更改。而 1 指定对合并项目的更改可能导致快照无效，而且如果有需要新快照的现有订阅，则值 1 将提供适当的权限，使现有快照被标记为废弃并生成新快照。

[@force_reinit_subscription = ] force_reinit_subscription

确认此存储过程采取的操作可能要求现有的订阅重新初始化。force_reinit_subscription 的数据类型为 bit，默认设置为 0。0 指定对合并项目的更改不会导致订阅重新初始化。如果存储过程检测到更改需要重新初始化订阅，则会发生错误，且不会进行任何更改。而 1 指定对合并项目的更改将导致现有的订阅重新初始化，并提供使订阅重新初始化发生的权限。

返回代码值

0（成功）或 1（失败）

注释

sp_addmergefilter 用于合并复制。

通常，该选项用于具有对已发布的主键表的外键引用的项目，而且该主键表含有在其项目中定义的筛选。主键行的子集用于决定复制到订阅服务器的外键行。

权限

只有 sysadmin 固定服务器角色成员或 db_owner 固定数据库角色成员才能执行 sp_ addmergefilter。

请参见

sp_changemergefilter

sp_dropmergefilter

sp_helpmergefilter

系统存储过程


sp_addmergepublication

创建新合并发布。此存储过程在发布服务器的任何数据库上执行。

语法

sp_addmergepublication [ @publication = ] 'publication'
[ , [ @description = ] 'description'
[ , [ @retention = ] retention ]
[ , [ @sync_mode = ] 'sync_mode' ]
[ , [ @allow_push = ] 'allow_push' ]
[ , [ @allow_pull = ] 'allow_pull' ]
[ , [ @allow_anonymous = ] 'allow_anonymous' ]
[ , [ @enabled_for_internet = ] 'enabled_for_internet' ]
[ , [ @centralized_conflicts = ] 'centralized_conflicts' ]
[ , [ @dynamic_filters = ] 'dynamic_filters' ]
[ , [ @snapshot_in_defaultfolder = ] 'snapshot_in_default_folder' ]
[ , [ @alt_snapshot_folder = ] 'alternate_snapshot_folder' ]
[ , [ @pre_snapshot_script = ] 'pre_snapshot_script' ]
[ , [ @post_snapshot_script = ] 'post_snapshot_script' ]
[ , [ @compress_snapshot = ] 'compress_snapshot' ]
[ , [ @ftp_address = ] 'ftp_address' ]
[ , [ @ftp_port= ] ftp_port ]
[ , [ @ftp_subdirectory = ] 'ftp_subdirectory' ]
[ , [ @ftp_login = ] 'ftp_login' ]
[ , [ @ftp_password = ] 'ftp_password' ]
[ , [ @conflict_retention = ] conflict_retention ]
[ , [ @keep_partition_changes = ] 'keep_partition_changes' ]
[ , [ @allow_subscription_copy = ] 'allow_subscription_copy' ]
[ , [ @allow_synctoalternate = ] 'allow_synctoalternate' ]
[ , [ @validate_subscriber_info = ] 'validate_subscriber_info' ]
[ , [ @add_to_active_directory = ] 'add_to_active_directory' ]
[ , [ @max_concurrent_merge = ] maximum_concurrent_merge ]
[ , [ @max_concurrent_dynamic_snapshots =] max_concurrent_dynamic_snapshots ]
参数

[@publication = ] 'publication'

是要创建的合并发布名。publication 的数据类型为 sysname，没有默认设置，而且一定不能是关键字 ALL。发布名在数据库内必须唯一。

[@description = ] 'description'

是对发布的描述。description 的数据类型为 nvarchar(255)，默认设置为 NULL。

[@retention = ] retention

是保存给定 publication 的更改的天数。retention 的数据类型为 int，默认设置为 14 天。如果订阅在保持期内未合并，则将过期并被删除。

[@sync_mode = ] 'sync_mode'

是发布的订阅服务器的初始同步模式。sync_mode 的数据类型为 nvarchar(10)，默认设置为 native。如果是 native，则表示生成所有表的本机模式大容量复制程序输出。如果是 character，则表示生成所有表的字符模式大容量复制程序输出。非 SQL Server 订阅服务器要求使用 character。

[@allow_push = ] 'allow_push'

指定是否可以为给定发布创建强制订阅。allow_push 的数据类型为 nvarchar(5)，默认设置为 TRUE，它允许对发布进行强制订阅。

[@allow_pull = ] 'allow_pull'

指定是否可以为给定发布创建请求订阅。allow_pull 的数据类型为 nvarchar(5)，默认设置为 TRUE，它允许对发布创建请求订阅。

[@allow_anonymous = ] 'allow_anonymous'

指定是否可以为给定发布创建匿名订阅。allow_anonymous 的数据类型为 nvarchar(5)，默认设置为 FALSE，它不允许对发布创建匿名订阅。

[@enabled_for_internet = ] 'enabled_for_internet'

指定是否为 Internet 启用发布，并确定 FTP 是否可用于向订阅服务器传输快照。enabled_for_internet 的数据类型为 nvarchar(5)，默认设置为 FALSE。如果为 true，则将发布的同步文件放入 C:\Program Files\Microsoft SQL Server\MSSQL\Repldata\Ftp 目录中。用户必须创建 Ftp 目录。如果是 false，则不为 Internet 访问启用发布。

[@centralized_conflicts = ] 'centralized_conflicts'

指定冲突记录是否存储在发布服务器上。centralized_conflicts 的数据类型为 nvarchar(5)，默认设置为 TRUE。如果是 true，则所有的冲突记录都存储在发布服务器上。如果是 false，则在引起冲突的发布服务器和订阅服务器上都存储冲突记录。

[@dynamic_filters = ] 'dynamic_filters'

启用合并发布以允许动态筛选。dynamic_filter 的数据类型为 nvarchar(5)，默认设置为 FALSE。

[@snapshot_in_defaultfolder = ] 'snapshot_in_default_folder'

指定是否将快照文件存储在默认文件夹中。snapshot_in_default_folder 的数据类型为 nvarchar(5)，默认设置为 TRUE。如果是 true，则可以在默认文件夹中找到快照文件。如果是 false，则表示快照文件将存储在 alternate_snapshot_folder 所指定的备用位置中。备用位置可以在另一台服务器、一个网络驱动器或可移动媒体（如 CD-ROM 或可移动磁盘）上。也可以将快照文件保存到文件传输协议 (FTP) 站点以供订户以后检索。注意该参数可以为 true，并且在 @alt_snapshot_folder 参数中仍有位置。该组合指定将快照文件同时存储在默认位置和备用位置。

[@alt_snapshot_folder = ] 'alternate_snapshot_folder'

指定快照的备用文件夹的位置。alternate_snapshot_folder 的数据类型为 nvarchar(255)，默认设置为 NULL。

[@pre_snapshot_script = ] 'pre_snapshot_script'

指定指向 .sql 文件位置的指针。pre_snapshot_script 的数据类型为 nvarchar(255)，默认设置为 NULL。当在订阅服务器上应用快照时，合并代理程序将在运行任何复制的对象脚本之前运行快照前脚本。

[@post_snapshot_script = ] 'post_snapshot_script'

指定指向 .sql 文件位置的指针。post_snapshot_script 的数据类型为 nvarchar(255)，默认设置为 NULL。分发代理程序或合并代理程序将在所有其它复制的对象脚本和数据已在初始同步过程中应用之后才运行快照后脚本。

[@compress_snapshot = ] 'compress_snapshot'

指定将写入 @alt_snapshot_folder 位置快照压缩成 Microsoft® CAB 格式。compress_snapshot 的数据类型为 nvarchar(5)，默认设置为 FALSE。false 指定不压缩快照；而 true 指定将压缩快照。不能压缩默认文件夹中的快照。

[@ftp_address = ] 'ftp_address'

是分发服务器的 FTP 服务网络地址。ftp_address 的数据类型为 sysname，默认设置为 NULL。指定供订阅服务器的分发代理程序或合并代理程序获取的发布快照文件的位置。因为存储每个发布的该属性，所以每个发布可以有不同的 ftp_address。发布必须支持通过 FTP 传播快照。有关更多信息，请参见配置发布以允许订阅服务器使用 FTP 检索快照。

[@ftp_port = ] ftp_port

是分发服务器的 FTP 服务的端口号。ftp_port 的数据类型为 int，默认设置为 21。指定供订阅服务器的分发代理程序或合并代理程序获取的发布快照文件的位置。因为存储每个发布的该属性，所以每个发布可以有自己的 ftp_port。

[@ftp_subdirectory = ] 'ftp_subdirectory'

如果发布支持通过 FTP 传播快照，指定可供订阅服务器的合并代理程序获取的快照文件的位置。ftp_subdirectory 的数据类型为 nvarchar(255)，默认设置为 NULL。因为存储每个发布的该属性，所以每个发布可以有自己的 ftp_subdirctory，或选择没有子目录，如 NULL 值表示的那样。

[@ftp_login = ] 'ftp_login'

是用于连接到 FTP 服务的用户名。ftp_login 的数据类型为 sysname，默认设置为"anonymous"。

[@ftp_password = ] 'ftp_password'

是用于连接到 FTP 服务的用户密码。ftp_password 的数据类型为 sysname，默认设置为 NULL。

[@conflict_retention = ] conflict_retention

指定保留冲突的保持期（以天为单位）。conflict_retention 的数据类型为 int，从冲突文件中清除冲突行之前的默认设置是 14 天。

[@keep_partition_changes = ] 'keep_partition_changes'

指定同步优化是否应发生。keep_partition_changes 的数据类型为 nvarchar(5)，默认设置为 FALSE。false 表示不进行同步优化，且当分区中的数据更改时，验证发送给所有订阅服务器的分区。true 表示进行同步优化，且只有在更改的分区中有行的订阅服务器受影响。有关更多信息，请参见优化同步。

[@allow_subscription_copy = ] 'allow_subscription_copy'

启用或禁用复制订阅此发布的订阅数据库的能力。allow_subscription_copy 的数据类型为 nvarchar(5)，默认设置为 FALSE。

[@allow_synctoalternate = ] 'allow_synctoalternate'

启用可选同步伙伴以与此发布服务器同步。allow_synctoalternate 的数据类型为 nvarchar(5)，默认设置为 FALSE。

[@validate_subscriber_info = ] 'validate_subscriber_info'

列出正用于检索订阅服务器信息的函数，并验证动态筛选条件，而该条件正由订阅服务器用于验证分区信息是否与每个合并都一致。validate_subscriber_info 的数据类型为 nvarchar(500)，默认设置为 NULL。例如，如果 SUSER_SNAME() 用于动态筛选，则该参数应该是 @validate_subscriber_info=N'SUSER_SNAME()'。有关更多信息，请参见验证订阅服务器信息。

[@add_to_active_directory = ] 'add_to_active_directory'

指定是否将发布信息发布到 Microsoft Active Directory™。add_to_active_directory 的数据类型为 nvarchar(5)，默认设置为 FALSE。只有运行在 Windows® 2000 操作系统上的服务器才能使用该功能。true 值将发布信息添加到 Microsoft Active Directory。

[@max_concurrent_merge = ] maximum_concurrent_merge

最大并发合并进程数。该属性的 0 值表示对在任何给定时间运行的并发合并进程数没有限制。该属性对可以同时在合并发布上运行的并发合并进程数设置限制。如果同时调度的快照进程数比该值允许运行的快照进程数要多，则多出的作业被放入队列中，一直等到当前运行的合并进程结束。

[@max_concurrent_dynamic_snapshots =] max_concurrent_dynamic_snapshots

在合并发布上可以运行的最大并发动态快照会话数。如果是 0，表示对在任意给定时间运行的并发动态快照会话数没有限制。该属性对可以同时在合并发布上运行的并发快照进程数设置限制。如果同时调度的快照进程数比该值允许运行的快照进程数要多，则多出的作业被放入队列中，一直等到当前运行的合并进程结束。

返回代码值

0（成功）或 1（失败）

注释

sp_addmergepublication 用于合并复制。

若要使用 @add_to_active_directory 参数列出 Active Directory 的发布对象，必须已经在 Active Directory 中创建了 SQL Server 对象。有关更多信息，请参见 Active Directory 服务。

权限

只有 sysadmin 固定服务器角色成员或 db_owner 固定数据库角色成员才能执行 sp_addmergepublication。

请参见

配置发布以允许订阅服务器使用 FTP 检索快照

在应用快照之前和之后执行脚本

sp_changemergepublication

sp_dropmergepublication

sp_helpmergepublication

系统存储过程


sp_addmergepullsubscription

将请求订阅添加到合并发布。此存储过程在订阅服务器的订阅数据库上执行。

语法

sp_addmergepullsubscription [ @publication = ] 'publication'
[ , [ @publisher = ] 'publisher' ]
[ , [ @publisher_db = ] 'publisher_db' ]
[ , [ @subscriber_type = ] 'subscriber_type' ]
[ , [ @subscription_priority = ] subscription_priority ]
[ , [ @sync_type = ] 'sync_type' ]
[ , [ @description = ] 'description' ]

参数

[@publication = ] 'publication'

是发布名。publication 的数据类型为 sysname，没有默认设置。

[@publisher = ] 'publisher'

是发布服务器名。publisher 的数据类型为 sysname，默认设置为本地服务器名。该发布服务器必须是有效服务器。

[@publisher_db = ] 'publisher_db

是发布服务器数据库名。publisher_db 的数据类型为 sysname，默认设置为 NULL。

[@subscriber_type = ] 'subscriber_type'

是订阅服务器类型。subscriber_type 的数据类型为 nvarchar(15)，且可以是 global、local 或 anonymous。

[@subscription_priority = ] subscription_priority

是订阅优先级。subscription_priority 的数据类型为 real，默认设置为 NULL。对于本地订阅和匿名订阅，优先级为 0.0。在检测到冲突时，默认的冲突解决程序使用该优先级挑选入选方。对于全局订阅服务器，订阅优先级必须低于发布服务器的优先级 100。

[@sync_type = ] 'sync_type'

是订阅同步类型。sync_type 的数据类型为 nvarchar(15)，默认设置为 automatic。可以是 automatic 或 none。如果是 automatic，则表示首先将已发布表的架构和初始数据传输到订阅服务器。如果是 none，则假定订阅服务器已有已发布表的架构和初始数据。始终传输系统表和数据。

[@description = ] 'description'

是对该请求订阅的简短描述。description 的数据类型为 nvarchar(255)，默认设置为 NULL。

返回代码值

0（成功）或 1（失败）

注释

sp_addmergepullsubscription 用于合并复制。

sp_addmergepullsubscription 在请求订阅方面执行的功能与 sp_addmergesubscription 相似，但它不为该订阅创建代理程序。假定当前服务器名称和当前数据库名称是 subscriber 和 subscriber_db，且不出现在参数列表中。

如果创建全局订阅，则除了在订阅服务器上运行 sp_addmergepullsubscription 外，还必须在发布服务器上运行 sp_addmergesubscription 和 sp_addsubscriber 存储过程。

如果使用 SQL 代理程序对订阅进行同步处理，则 sp_addmergepullsubscription_agent 存储过程必须在订阅服务器上运行，才能创建与发布同步的代理程序和作业。

权限

只有 sysadmin 固定服务器角色成员或 db_owner 固定数据库角色成员才能执行 sp_addmergepullsubscription。

请参见

sp_changemergepullsubscription

sp_dropmergepullsubscription

sp_helpmergepullsubscription

系统存储过程


sp_addmergepullsubscription_agent

将请求订阅的代理程序添加到合并发布。此存储过程在订阅服务器的订阅数据库上执行。

语法

sp_addmergepullsubscription_agent [ [ @name = ] 'name' ]
, [ @publisher = ] 'publisher'
 , [ @publisher_db = ] 'publisher_db'
, [ @publication = ] 'publication '
[ , [ @publisher_security_mode = ] publisher_security_mode ]
[ , [ @publisher_login = ] 'publisher_login' ]
[ , [ @publisher_password = ] 'publisher_password' ]
[ , [ @publisher_encrypted_password = ] publisher_encrypted_password ]
[ , [ @subscriber = ] 'subscriber' ]
[ , [ @subscriber_db = ] 'subscriber_db' ]
[ , [ @subscriber_security_mode = ] subscriber_security_mode ]
[ , [ @subscriber_login = ] 'subscriber_login' ]
[ , [ @subscriber_password = ] 'subscriber_password' ]
[ , [ @distributor = ] 'distributor' ]
[ , [ @distributor_security_mode = ] distributor_security_mode ]
[ , [ @distributor_login = ] 'distributor_login' ]
[ , [ @distributor_password = ] 'distributor_password' ]
[ , [ @encrypted_password = ] encrypted_password ]
[ , [ @frequency_type = ] frequency_type ]
[ , [ @frequency_interval = ] frequency_interval ]
[ , [ @frequency_relative_interval = ] frequency_relative_interval ]
[ , [ @frequency_recurrence_factor = ] frequency_recurrence_factor ]
[ , [ @frequency_subday = ] frequency_subday ]
[ , [ @frequency_subday_interval = ] frequency_subday_interval ]
[ , [ @active_start_time_of_day = ] active_start_time_of_day ]
[ , [ @active_end_time_of_day = ] active_end_time_of_day ]
[ , [ @active_start_date = ] active_start_date ]
[ , [ @active_end_date = ] active_end_date ]
[ , [ @optional_command_line = ] 'optional_command_line' ]
[ , [ @merge_jobid = ] merge_jobid ]
[ , [ @enabled_for_syncmgr = ] 'enabled_for_syncmgr' ]
[ , [ @ftp_address = ] 'ftp_address' ]
[ , [ @ftp_port = ] ftp_port ]
[ , [ @ftp_login = ] 'ftp_login' ]
[ , [ @ftp_password = ] 'ftp_password' ]
[ , [ @alt_snapshot_folder = ] 'alternate_snapshot_folder' ]
[ , [ @working_directory = ] 'working_directory' ]
[ , [ @use_ftp= ] 'use_ftp' ]
[ , [ @reserved= ] 'reserved' ]
[ , [ @use_interactive_resolver = ] 'use_interactive_resolver' ]
[ , [ @offloadagent = ] 'remote_agent_activation' ]
[ , [ @offloadserver = ] 'remote_agent_server_name' ]
[ , [ @job_name = ] 'job_name' ]
[ , [ @dynamic_snapshot_location= ] 'dynamic_snapshot_location' ]

参数

[@name = ] 'name'

是代理程序名。name 的数据类型为 sysname，默认设置为 NULL。

[@publisher = ] 'publisher'

是发布服务器名。publisher 的数据类型为 sysname，没有默认设置。

[@publisher_db = ] 'publisher_db'

是发布服务器数据库名。publisher_db 的数据类型为 sysname，没有默认设置。

[@publication = ] 'publication'

是发布名。publication 的数据类型为 sysname，没有默认设置。

[@publisher_security_mode = ] publisher_security_mode

是在同步时用于连接到发布服务器的安全模式。publisher_security_mode 的数据类型为 int，默认设置为 1。如果该设置为 0，则指定 SQL Server 身份验证。如果该设置为 1，则指定 Windows 身份验证。

[@publisher_login = ] 'publisher_login'

是在同步时用于连接到发布服务器的登录。publisher_login 的数据类型为 sysname，默认设置为 NULL。

[@publisher_password = ] 'publisher_password'

是用于连接到发布服务器的密码。publisher_password 的数据类型为 sysname，默认设置为 NULL。

[@publisher_encrypted_password = ] publisher_encrypted_password

指定是否以加密格式存储密码。publisher_encrypted_password 的数据类型为 bit，默认设置为 0。

[@subscriber = ] 'subscriber'

是订阅服务器名。subscriber 的数据类型为 sysname，默认设置为 NULL。

[@subscriber_db = ] 'subscriber_db'

是订阅数据库名称。subscriber_db 的数据类型为 sysname，默认设置为 NULL。

[@subscriber_security_mode = ] subscriber_security_mode

是在同步时用于连接到订阅服务器的安全模式。subscriber_security_mode 的数据类型为 int，默认设置为 NULL。如果该设置为 0，则指定 SQL Server 身份验证。如果该设置为 1，则指定 Windows 身份验证。

[@subscriber_login = ] 'subscriber_login'

是在同步时用于连接到订阅服务器的订阅服务器登录。如果将 subscriber_security_mode 设置为 0，则必需 subscriber_login。subscriber_login 的数据类型为 sysname，默认设置为 NULL。

[@subscriber_password = ] 'subscriber_password'

是订阅服务器密码。如果 subscriber_security_mode 设置为 0，则必需 subscriber_password。subscriber_password 的数据类型为 sysname，默认设置为 NULL。如果使用订阅服务器密码，则将自动加密该密码。

[@distributor = ] 'distributor'

是分发服务器名。distributor 的数据类型为 sysname，默认设置为 publisher，这表示发布服务器也是分发服务器。

[@distributor_security_mode = ] distributor_security_mode

是在同步时用于连接到分发服务器的安全模式。distributor_security_mode 的数据类型为 int，默认设置为 0。0 指定 SQL Server 身份验证。1 指定 Windows 身份验证。

[@distributor_login = ] 'distributor_login'

是在同步时用于连接到分发服务器的分发服务器登录。如果将 distributor_security_mode 设置为 0，则必需 distributor_login。distributor_login 的数据类型为 sysname，默认设置为 NULL。

[@distributor_password = ] 'distributor_password'

是分发服务器密码。如果 distributor_security_mode 设置为 0，则必需 distributor_password。distributor_password 的数据类型为 sysname，默认设置为 NULL。

[@encrypted_password = ] encrypted_password

指定是否加密分发服务器密码。encrypted_password 的数据类型为 bit，默认设置为 0。这用于生成复制脚本。

[@frequency_type = ] frequency_type

是调度合并代理程序所用的频率。frequency_type 的数据类型为 int，可以是下列值之一。

值 | 描述
1 | 一次
2 | 按需
4 | 每天
8 | 每周
16 | 每月
32 | 每月相对信息
64 | 自动启动
124 | 反复出现
NULL（默认值） |

[@frequency_interval = ] frequency_interval

是合并代理程序运行的日期。frequency_interval 的数据类型为 int，可以是下列值之一。

值 | 描述
1 | 星期日
2 | 星期一
3 | 星期二
4 | 星期三
5 | 星期四
6 | 星期五
7 | 星期六
8 | 天
9 | 工作日
10 | 周末
NULL（默认值） |

[@frequency_relative_interval = ] frequency_relative_interval

是合并代理程序运行的日期。当 frequency_type 设置为 32（每月相对信息）时使用该参数。frequency_relative_interval 的数据类型为 int，可以是下列值之一。

值 | 描述
1 | 第一个
2 | 秒
4 | 第三个
8 | 第四个
16 | 最后一个
NULL（默认值） |

[@frequency_recurrence_factor = ] frequency_recurrence_factor

是 frequency_type 使用的重复因子。frequency_recurrence_factor 的数据类型为 int，默认设置为 0。

[@frequency_subday = ] frequency_subday

是在定义的周期内重新调度的频率。frequency_subday 的数据类型为 int，可以是下列值之一。

值 | 描述
1 | 一次
2 | 秒
4 | 分钟
8 | 小时
NULL（默认值） |

[@frequency_subday_interval = ] frequency_subday_interval

是 frequency_subday 的间隔。frequency_subday_interval 的数据类型为 int，默认设置为 NULL。

[@active_start_time_of_day = ] active_start_time_of_day

是第一次调度合并代理程序的时间，格式为 HHMMSS。active_start_time_of_day 的数据类型为 int，默认设置为 NULL。

[@active_end_time_of_day = ] active_end_time_of_day

是停止调度合并代理程序的时间，格式为 HHMMSS。active_end_time_of_day 的数据类型为 int，默认设置为 NULL。

[@active_start_date = ] active_start_date

是第一次调度合并代理程序的日期，格式为 YYYYMMDD。active_start_date 的数据类型为 int，默认设置为 NULL。

[@active_end_date = ] active_end_date

是停止调度合并代理程序的日期，格式为 YYYYMMDD。active_end_date 的数据类型为 int，默认设置为 NULL。

[@optional_command_line = ] 'optional_command_line'

是提供给合并代理程序的可选命令提示符。例如，-DefinitionFile C:\Distdef.txt 或 -CommitBatchSize 10。optional_command_line 的数据类型为 nvarchar(255)，默认设置为 ''。

[@merge_jobid = ] merge_jobid

是作业 ID 的输出参数。merge_jobid 的数据类型为 binary(16)，默认设置为 NULL。

[@enabled_for_syncmgr = ] 'enabled_for_syncmgr'

指定能否通过 Windows 同步管理器对订阅进行同步处理。enabled_for_syncmgr 的数据类型为 nvarchar(5)，默认设置为 FALSE。如果是 false，则表示该订阅没有注册到同步管理器上。如果是 true，则表示该订阅已注册到同步管理器上，可以在不启动 SQL Server 企业管理器的情况下进行同步处理。

[@ftp_address = ] 'ftp_address'

仅为保持向后兼容性。

[@ftp_port = ] ftp_port

仅为保持向后兼容性。

[@ftp_login = ] 'ftp_login'

仅为保持向后兼容性。

[@ftp_password = ] 'ftp_password'

仅为保持向后兼容性。

[@alt_snapshot_folder = ] 'alternate_snapshot_folder'

指定获取快照文件的位置。alternate_snapshot_folder 的数据类型为 nvarchar(255)，默认设置为 NULL。如果为 NULL，则将从发布服务器指定的默认位置获取快照文件。

[@working_directory = ] 'working_directory'

是在通过 FTP 传输快照文件时用于临时存储发布的数据和架构文件的工作目录名。working_directory 的数据类型为 nvarchar(255)，默认设置为 NULL。

[@use_ftp = ] 'use_ftp'

指定使用 FTP 而是典型协议来检索快照。use_ftp 的数据类型为 nvarchar(5)，默认设置为 FALSE。

[@reserved = ] 'reserved'

仅限内部使用。

[@use_interactive_resolver = ] 'use_interactive_resolver' ]

使用交互式冲突解决程序解决所有允许交互解决的项目的冲突。use_interactive_resolver 的数据类型为 nvarchar(5)，默认设置为 FALSE。

[@offloadagent = ] 'remote_agent_activation'

指定可以远程激活代理程序。remote_agent_activation 的数据类型为 nvarchar(5)，默认设置为 FALSE。false 指定不能远程地激活代理程序。true 指定将远程激活代理程序，并且是在 remote_agent_server_name 所指定的远程计算机上激活。

[@offloadserver = ] 'remote_agent_server_name'

指定用于远程代理程序激活的服务器的网络名称。remote_agent_server_name 的数据类型为 sysname，默认设置为 NULL。

[@job_name = ] 'job_name' ]

仅限内部使用。

[@dynamic_snapshot_location = ] 'dynamic_snapshot_location' ]

在使用动态快照时将要读取的快照文件所在的文件夹路径。dynamic_snapshot_location 的数据类型为 nvarchar(260)，默认设置为 NULL。

返回代码值

0（成功）或 1（失败）

注释

sp_addmergepullsubscription_agent 用于合并复制，并使用与 sp_addsubsubscriber_agent 相似的功能。

权限

只有 sysadmin 固定服务器角色成员或 db_owner 固定数据库角色成员才能执行 sp_addmergepullsubscription_agent。

请参见

系统存储过程


sp_addmergesubscription

创建强制或请求合并订阅。此存储过程在发布服务器的发布数据库上执行。

语法

sp_addmergesubscription [ @publication = ] 'publication'
[ , [ @subscriber = ] 'subscriber' ]
[ , [ @subscriber_db = ] 'subscriber_db' ]
[ , [ @subscription_type = ] 'subscription_type' ]
[ , [ @subscriber_type = ] 'subscriber_type' ]
[ , [ @subscription_priority = ] subscription_priority ]
[ , [ @sync_type = ] 'sync_type' ]
[ , [ @frequency_type = ] frequency_type ]
[ , [ @frequency_interval = ] frequency_interval ]
[ , [ @frequency_relative_interval = ] frequency_relative_interval ]
[ , [ @frequency_recurrence_factor = ] frequency_recurrence_factor ]
[ , [ @frequency_subday = ] frequency_subday ]
[ , [ @frequency_subday_interval = ] frequency_subday_interval ]
[ , [ @active_start_time_of_day = ] active_start_time_of_day ]
[ , [ @active_end_time_of_day = ] active_end_time_of_day ]
[ , [ @active_start_date = ] active_start_date ]
[ , [ @active_end_date = ] active_end_date ]
[ , [ @optional_command_line = ] 'optional_command_line' ]
[ , [ @description = ] 'description' ]
[ , [ @enabled_for_syncmgr = ] 'enabled_for_syncmgr' ]
[ , [ @offloadagent = ] remote_agent_activation ]
[ , [ @offloadserver = ] 'remote_agent_server_name' ]
[ , [ @use_interactive_resolver = ] 'use_interactive_resolver' ]
[ , [ @merge_job_name = ] 'merge_job_name' ]

参数

[@publication = ] 'publication'

是发布名。publication 的数据类型为 sysname，没有默认设置。发布必须已存在。

[@subscriber = ] 'subscriber'

是订阅服务器名。subscriber 的数据类型为 sysname，默认设置为 NULL。

[@subscriber_db = ] 'subscriber_db'

是订阅数据库名称。subscriber_db 的数据类型为 sysname，默认设置为 NULL。

[@subscription_type = ] 'subscription_type'

是订阅的类型。subscription_type 的数据类型为 nvarchar(15)，默认设置为 PUSH。如果是 push，则添加强制订阅并在分发服务器上添加合并代理程序。如果是 pull，则在分发服务器上不添加合并代理程序的情况下添加请求订阅。

说明 匿名订阅无需使用此存储过程。

[@subscriber_type = ] 'subscriber_type'

是订阅服务器的类型。subscriber_type 的数据类型为 nvarchar(15)，可以是下列值之一。

值 | 描述
local（默认值） | 订阅服务器仅对发布服务器是已知的。
global | 订阅服务器对所有服务器都是已知的。

[@subscription_priority = ] subscription_priority

是表示订阅优先级的数字。subscription_priority 的数据类型为 real，默认设置为 NULL。对于本地订阅和匿名订阅，优先级为 0.0。对于全局订阅，优先级必须小于 100.0。有关更多信息，请参见订阅类型和冲突。

[@sync_type = ] 'sync_type'

是订阅同步类型。sync_type 的数据类型为 nvarchar(15)，默认设置为 automatic。可以是 automatic 或 none。如果是 automatic，则表示首先将已发布表的架构和初始数据传输到订阅服务器。如果是 none，则假定订阅服务器已有已发布表的架构和初始数据。始终传输系统表和数据。

[@frequency_type = ] frequency_type

是表示合并代理程序何时运行的值。frequency_type 的数据类型为 int，可以是下列值之一。

值 | 描述
1 | 一次
4 | 每天
8 | 每周
10 | 每月
20 | 每月，相对于频率间隔
40 | 当 SQL Server 代理程序启动时
NULL（默认值） |

[@frequency_interval = ] frequency_interval

是合并代理程序运行的日期。frequency_interval 的数据类型为 int，可以是下列值之一。

值 | 描述
1 | 星期日
2 | 星期一
3 | 星期二
4 | 星期三
5 | 星期四
6 | 星期五
7 | 星期六
8 | 天
9 | 工作日
10 | 周末
NULL（默认值） |

[@frequency_relative_interval = ] frequency_relative_interval

是每月中已调度合并频率间隔发生。frequency_relative_interval 的数据类型为 int，可以是下列值之一。

值 | 描述
1 | 第一个
2 | 秒
4 | 第三个
8 | 第四个
16 | 最后一个
NULL（默认值） |

[@frequency_recurrence_factor = ] frequency_recurrence_factor

是 frequency_type 使用的重复因子。frequency_recurrence_factor 的数据类型为 int，默认设置为 NULL。

[@frequency_subday = ] frequency_subday

是 freq_subday_interval 的单位。frequency_subday 的数据类型为 int，可以是下列值之一。

值 | 描述
1 | 一次
2 | 秒
4 | 分钟
8 | 小时
NULL（默认值） |

[@frequency_subday_interval = ] frequency_subday_interval

是各合并间 frequency_subday 发生的频率。frequency_subday_interval 的数据类型为 int，默认设置为 NULL。

[@active_start_time_of_day = ] active_start_time_of_day

是第一次调度合并代理程序的时间，格式为 HHMMSS。active_start_time_of_day 的数据类型为 int，默认设置为 NULL。

[@active_end_time_of_day = ] active_end_time_of_day

是停止调度合并代理程序的时间，格式为 HHMMSS。active_end_time_of_day 的数据类型为 int，默认设置为 NULL。

[@active_start_date = ] active_start_date

是第一次调度合并代理程序的日期，格式为 YYYYMMDD。active_start_date 的数据类型为 int，默认设置为 NULL。

[@active_end_date = ] active_end_date

是停止调度合并代理程序的日期，格式为 YYYYMMDD。active_end_date 的数据类型为 int，默认设置为 NULL。

[@optional_command_line = ] 'optional_command_line'

是要执行的可选命令提示符。optional_command_line 的数据类型为 nvarchar(4000)，默认设置为 NULL。该参数用于添加捕获输出并将其保存到文件中的命令，或者用于指定配置文件或特性。

[@description = ] 'description'

是对该合并订阅的简短描述。description 的数据类型为 nvarchar(255)，默认设置为 NULL。

[@enabled_for_syncmgr = ] 'enabled_for_syncmgr'

指定是否可通过 Microsoft Windows 同步管理器对订阅进行同步处理。enabled_for_syncmgr 的数据类型为 nvarchar(5)，默认设置为 FALSE。如果是 false，则表示该订阅没有注册到同步管理器上。如果是 true，则表示该订阅已注册到同步管理器上，可以在不启动 SQL Server 企业管理器的情况下进行同步处理。

[@offloadagent = ] remote_agent_activation

指定可以远程地激活代理程序。remote_agent_activationis 的数据类型为 bit，默认设置为 0。0 指定不能远程地激活代理程序。而 1 指定将远程地激活代理程序，并且是在 remote_agent_server_name 所指定的远程计算机上激活。

[@offloadserver = ] 'remote_agent_server_name'

指定用于远程代理程序激活的服务器的网络名称。remote_agent_server_name 的数据类型为 sysname，默认设置为 NULL。

[@use_interactive_resolver = ] 'use_interactive_resolver'

允许交互式地解决所有允许交互式地解决的项目的冲突。use_interactive_resolver 的数据类型为 nvarchar(5)，默认设置为 FALSE。

[@merge_job_name = ] 'merge_job_name'

仅限内部使用。

返回代码值

0（成功）或 1（失败）

注释

sp_addmergesubscription 用于合并复制。

权限

只有 sysadmin 固定服务器角色成员或 db_owner 固定数据库角色成员才能执行 sp_addmergesubscription。

请参见

交互式冲突解决程序

sp_changemergesubscription

sp_dropmergesubscription

sp_helpmergesubscription

系统存储过程


sp_addpublication

创建快照发布或事务发布此存储过程在发布服务器的发布数据库上执行。

语法

sp_addpublication [ @publication = ] 'publication'
[ , [ @taskid = ] tasked ]
[ , [ @restricted = ] 'restricted' ]
[ , [ @sync_method = ] 'sync_method' ]
[ , [ @repl_freq = ] 'repl_freq' ]
[ , [ @description = ] 'description' ]
[ , [ @status = ] 'status' ]
[ , [ @independent_agent = ] 'independent_agent' ]
[ , [ @immediate_sync = ] 'immediate_sync' ]
[ , [ @enabled_for_internet = ] 'enabled_for_internet' ]
[ , [ @allow_push = ] 'allow_push'
[ , [ @allow_pull = ] 'allow_pull' ]
[ , [ @allow_anonymous = ] 'allow_anonymous' ]
[ , [ @allow_sync_tran = ] 'allow_sync_tran' ]
[ , [ @autogen_sync_procs = ] 'autogen_sync_procs' ]
[ , [ @retention = ] retention ]
[ , [ @allow_queued_tran= ] 'allow_queued_updating' ]
[ , [ @snapshot_in_defaultfolder= ] 'snapshot_in_default_folder' ]
[ , [ @alt_snapshot_folder= ] 'alternate_snapshot_folder' ]
[ , [ @pre_snapshot_script= ] 'pre_snapshot_script' ]
[ , [ @post_snapshot_script= ] 'post_snapshot_script' ]
[ , [ @compress_snapshot= ] 'compress_snapshot' ]
[ , [ @ftp_address = ] 'ftp_address' ]
[ , [ @ftp_port= ] ftp_port ]
[ , [ @ftp_subdirectory = ] 'ftp_subdirectory' ]
[ , [ @ftp_login = ] 'ftp_login' ]
[ , [ @ftp_password = ] 'ftp_password' ]
[ , [ @allow_dts = ] 'allow_transformable_subscriptions' ]
[ , [ @allow_subscription_copy = ] 'allow_subscription_copy' ]
[ , [ @conflict_policy = ] 'conflict_policy' ]
[ , [ @centralized_conflicts = ] 'centralized_conflicts' ]
[ , [ @conflict_retention = ] conflict_retention ]
[ , [ @queue_type = ] 'queue_type' ]
[ , [ @add_to_active_directory = ] 'add_to_active_directory' ]
[ , [ @logreader_job_name = ] 'logreader_agent_name' ]
[ , [ @qreader_job_name = ] 'queue_reader_agent_name' ]

参数

[@publication = ] 'publication'

是要创建的发布名。publication 的数据类型为 sysname，没有默认设置。该名称在数据库内必须唯一。

[@taskid = ] taskid

只支持向后兼容性；使用 sp_addpublication_snapshot。

[@restricted = ] 'restricted'

只支持向后兼容性；使用 default_access。

[@sync_method = ] 'sync_method'

是同步模式。sync_method 的数据类型为 nvarchar(13)，可以是下列值之一。

值 | 描述
native（默认值） | 生成所有表的本机模式大容量复制程序输出。
character | 生成所有表的字符模式大容量复制程序输出。
concurrent | 生成所有表的本机模式大容量复制程序输出，但在快照过程中并不锁定表。
concurrent_c | 生成所有表的字符模式大容量复制程序输出，但在快照过程中并不锁定表。

说明 值 concurrent 和 concurrent_c 可用于事务复制和合并复制，但不可用于快照复制。

[@repl_freq = ] 'repl_freq'

是复制频率的类型。replication_frequency 的数据类型为 nvarchar(10)，默认设置为 continuous。如果是 continuous，则表示发布服务器提供所有基于日志的事务输出。如果是 Snapshot，则表示发布服务器只生成已调度同步事件。

[@description = ] 'description'

是对发布的可选描述。description 的数据类型为 nvarchar(255)，默认设置为 NULL。

[@status = ] 'status'

指定发布数据是否可用。status 的数据类型为 nvarchar(8)，可以是下列值之一。

值 | 描述
active | 发布数据可立即用于订阅服务器。
inactive（默认值） | 首次创建发布时，发布数据不能由订阅服务器使用（订阅服务器可以订阅，但这些订阅不被处理）。

[@independent_agent = ] 'independent_agent'

指定是否有用于发布的单独的分发代理程序。independent_agent 的数据类型为 nvarchar(5)，默认设置为 FALSE。如果是 true，则表示有用于该发布的独立分发代理程序。如果是 false，则表示该发布使用共享的分发代理程序，每对发布服务器数据库/订阅服务器数据库都有一个共享的代理程序。

[@immediate_sync = ] 'immediate_synchronization'

指定是否每次快照代理程序运行时都创建发布的同步文件。immediate_synchronization 的数据类型为 nvarchar(5)，默认设置为 FALSE。如果是 true，则表示每次快照代理程序运行时都创建或重新创建同步文件。如果在创建订阅之前已完成快照代理程序，则订阅服务器能够立即获得同步文件。新订阅获得最后一次执行快照代理程序所生成的最新同步文件。要想使 immediate_synchronization 为 true，independent_agent 必须为 true。如果是 false，则表示只有存在新订阅时才创建同步文件。订阅服务器不能在订阅后接收同步文件，直到快照代理程序启动并完成。

[@enabled_for_internet = ] 'enabled_for_internet'

指定是否为 Internet 启用发布，并确定是否可通过 FTP 向订阅服务器传输快照文件。enabled_for_internet 的数据类型为 nvarchar(5)，默认设置为 FALSE。如果为 true，则将发布的同步文件放入 C:\Program Files\Microsoft SQL Server\MSSQL\Repldata\Ftp 目录中。用户必须创建 Ftp 目录。

[@allow_push = ] 'allow_push'

指定是否可以为给定发布创建强制订阅。allow_push 的数据类型为 nvarchar(5)，默认设置为 TRUE，它允许对发布进行强制订阅。

[@allow_pull = ] 'allow_pull'

指定是否可以为给定发布创建请求订阅。allow_pull 的数据类型为 nvarchar(5)，默认设置为 FALSE。如果是 false，则表示不允许在该发布上使用请求订阅。

[@allow_anonymous = ] 'allow_anonymous'

指定是否可以为给定发布创建匿名订阅。allow_anonymous 的数据类型为 nvarchar(5)，默认设置为 FALSE。如果是 true，则 immediate_synchronization 也必须设置为 true。如果是 false，则表示不允许在该发布上使用匿名订阅。

[@allow_sync_tran = ] 'allow_sync_tran'

指定对发布是否允许即时更新订阅。allow_sync_tran 的数据类型为 nvarchar(5)，默认设置为 FALSE。

[@autogen_sync_procs = ] 'autogen_sync_procs'

指定是否在发布服务器上生成即时更新订阅的同步存储过程。autogen_sync_procs 的数据类型为 nvarchar(5)，默认设置为 TRUE。

[@retention = ] retention]

是订阅活动的保持期（以小时为单位）。retention 的数据类型为 int，默认设置为 336 小时。如果订阅在保持期内不活动，则该订阅过期并被删除。该值可大于发布服务器所使用的分发数据库的最大保持期。如果为 0，则发布所知道的订阅将永远不会过期，且不会被过期订阅清除代理程序删除。有关更多信息，请参见订阅停用和过期。

[@allow_queued_tran = ] 'allow_queued_updating'

在订阅服务器上启用或禁用更改的队列，除非可以在发布服务器上应用它们。allow_queued_updating 的数据类型为 nvarchar(5)，默认设置为 FALSE。如果是 false，则不排队订阅服务器上的更改。

[@snapshot_in_defaultfolder = ] 'snapshot_in_default_folder'

指定是否将快照文件存储在默认文件夹中。snapshot_in_default_folder 的数据类型为 nvarchar(5)，默认设置为 TRUE。如果是 true，则可以在默认文件夹中找到快照文件。如果是 false，则表示快照文件已存储在 alternate_snapshot_folder 所指定的备用位置中。备用位置可以在另一台服务器、一个网络驱动器或可移动媒体（如光盘或可移动磁盘）上。也可以将快照文件保存到文件传输协议 (FTP) 站点以供订户以后检索。注意该参数可以为 true，并且在 @alt_snapshot_folder 参数中仍有位置。该组合指定将快照文件同时存储在默认位置和备用位置。

[@alt_snapshot_folder = ] 'alternate_snapshot_folder'

指定快照的备用文件夹的位置。alternate_snapshot_folder 的数据类型为 nvarchar(255)，默认设置为 NULL。

[@pre_snapshot_script = ] 'pre_snapshot_script'

指定指向 .sql 文件位置的指针。pre_snapshot_script 的数据类型为 nvarchar(255)，默认设置为 NULL。在订阅服务器上应用快照时，分发代理程序将在运行任何复制的对象脚本之前运行快照前脚本。

[@post_snapshot_script = ] 'post_snapshot_script'

指定指向 .sql 文件位置的指针。post_snapshot_script 的数据类型为 nvarchar(255)，默认设置为 NULL。分发代理程序将在初始同步过程中已应用所有其它复制的对象脚本和数据之后才运行快照后脚本。

[@compress_snapshot = ] 'compress_snapshot'

指定将写入 @alt_snapshot_folder 位置的快照压缩成 Microsoft® CAB 格式。compress_snapshot 的数据类型为 nvarchar(5)，默认设置为 FALSE。false 指定不压缩快照，而 true 指定将压缩快照。不能压缩默认文件夹中的快照。

[@ftp_address = ] 'ftp_address'

是分发服务器的 FTP 服务网络地址。ftp_address 的数据类型为 sysname，默认设置为 NULL。指定供订阅服务器的分发代理程序或合并代理程序获取的发布快照文件的位置。因为存储每个发布的该属性，所以每个发布可以有不同的 ftp_address。发布必须支持通过 FTP 传播快照。有关更多信息，请参见配置发布以允许订阅服务器使用 FTP 检索快照。

[@ftp_port = ] ftp_port

是分发服务器的 FTP 服务的端口号。ftp_port 的数据类型为 int，默认设置为 21。指定供订阅服务器的分发代理程序或合并代理程序获取的发布快照文件的位置。因为存储每个发布的该属性，所以每个发布可以有自己的 ftp_port。

[@ftp_subdirectory = ] 'ftp_subdirectory'

如果发布支持通过 FTP 传播快照，则指定可供订阅服务器的分发代理程序或合并代理程序获取的快照文件的位置。ftp_subdirectory 的数据类型为 nvarchar(255)，默认设置为 NULL。因为存储每个发布的该属性，所以每个发布可以有自己的 ftp_subdirctory，或选择没有子目录，如 NULL 值表示的那样。

[@ftp_login = ] 'ftp_login'

是用于连接到 FTP 服务的用户名。ftp_login 的数据类型为 sysname，默认设置为 ANONYMOUS。

[@ftp_password = ] 'ftp_password'

是用于连接到 FTP 服务的用户密码。ftp_password 的数据类型为 sysname，默认设置为 NULL。

[@allow_dts = ] 'allow_transformable_subscriptions'

指定发布允许数据转换。创建订阅时可以指定 DTS 包。allow_transformable_subscriptions 的数据类型为 nvarchar(5)，默认设置为 FALSE，它不允许 DTS 转换。

[@allow_subscription_copy = ] 'allow_subscription_copy'

启用或禁用复制订阅此发布的订阅数据库的能力。allow_subscription_copy 的数据类型为 nvarchar(5)，默认设置为 FALSE。

[@conflict_policy = ] 'conflict_policy'

指定当使用排队更新订阅服务器选项时所遵从的冲突解决策略。conflict_policy 的数据类型为 nvarchar(100)，默认设置为 NULL，可以是下列值之一。

值 | 描述
pub wins | 发布服务器在冲突中获胜。
sub reinit | 重新初始化订阅。
sub wins | 订阅服务器在冲突中获胜。
NULL（默认值） | 如果是 NULL 且该发布是快照发布，则默认策略变成 sub reinit。如果是 NULL 且发布不是快照发布，则默认策略变成 pub wins。

[@centralized_conflicts = ] 'centralized_conflicts'

指定冲突记录是否存储在发布服务器上。centralized_conflicts 的数据类型为 nvarchar(5)，默认设置为 TRUE。如果是 true，则表示冲突记录存储在发布服务器上。如果是 false，则在引起冲突的发布服务器和订阅服务器上都存储冲突记录。

[@conflict_retention = ] conflict_retention

指定冲突保持期（以天为单位）。conflict_retention 的数据类型为 int，默认设置为 14。

[@queue_type = ] 'queue_type'

指定使用的队列类型。queue_type 的数据类型为 nvarchar(10)，默认设置为 NULL，可以是下列值之一。

值 | 描述
msmq | 使用 Microsoft® 消息队列存储事务。
sql | 使用 SQL Server 存储事务。
NULL（默认值） | 默认设置为 sql，指定使用 SQL Server 存储事务。

[@add_to_active_directory = ] 'add_to_active_directory'

指定是否将发布信息发布到 Microsoft Active Directory™。add_to_active_directory 的数据类型为 nvarchar(10)，默认设置为 FALSE。只有运行 Windows® 2000 操作系统的服务器才能使用该功能。

[@logreader_job_name = ] 'logreader_agent_name'

仅限内部使用。

[@qreader_job_name = ] 'queue_reader_agent_name'

仅限内部使用。

返回代码值

0（成功）或 1（失败）

注释

sp_addpublication 用于快照复制和事务复制。

若要使用 @add_to_active_directory 参数列出 Active Directory 的发布对象，必须已经在 Active Directory 中创建了 SQL Server 对象。有关更多信息，请参见 Active Directory 服务。

权限

只有 sysadmin 固定服务器角色成员或 db_owner 固定数据库角色成员才能执行 sp_addpublication。

请参见

sp_addarticle

sp_articlecolumn

sp_changearticle

sp_changepublication

sp_droparticle

sp_droppublication

sp_enumfullsubscribers

sp_helparticle

sp_helparticlecolumns

sp_helppublication

系统存储过程


sp_addpublication_snapshot

创建用于指定发布的快照代理程序。此存储过程在发布服务器的发布数据库上执行。

语法

sp_addpublication_snapshot [ @publication = ] 'publication'
[ , [ @frequency_type = ] frequency_type ]
[ , [ @frequency_interval = ] frequency_interval ]
[ , [ @frequency_subday = ] frequency_subday ]
[ , [ @frequency_subday_interval = ] frequency_subday_interval ]
[ , [ @frequency_relative_interval = ] frequency_relative_interval ]
[ , [ @frequency_recurrence_factor = ] frequency_recurrence_factor ]
[ , [ @active_start_date = ] active_start_date ]
[ , [ @active_end_date = ] active_end_date ]
[ , [ @active_start_time_of_day = ] active_start_time_of_day ]
[ , [ @active_end_time_of_day = ] active_end_time_of_day ]
[ , [ @snapshot_job_name = ] 'snapshot_agent_name' ]

参数

[@publication = ] 'publication'

是发布名。publication 的数据类型为 sysname，没有默认设置。

[@frequency_type = ] frequency_type

是执行快照代理程序的频率。frequency_type 的数据类型为 int，可以是下列值之一。

值 | 描述
1 | 一次。
4（默认值） | 每天。
8 | 每星期。
10 | 每月。
20 | 每月，相对于频率间隔。
40 | 当 SQL Server 代理程序启动时。

[@frequency_interval = ] frequency_interval

是应用于 frequency_type 所设置频率的值。frequency_interval 的数据类型为 int，默认设置为 1，表示每天。

[@frequency_subday = ] frequency_subday

是 freq_subday_interval 的单位。frequency_subday 的数据类型为 int，可以是下列值之一。

值 | 描述
1 | 一次
2 | 秒
4（默认值） | 分钟
8 | 小时

[@frequency_subday_interval = ] frequency_subday_interval

是 frequency_subday 的间隔。frequency_subday_interval 的数据类型为 int，默认设置为 5，表示每隔 5 分钟。

[@frequency_relative_interval = ] frequency_relative_interval

是快照代理程序运行的日期。frequency_relative_interval 的数据类型为 int，默认设置为 1。

[@frequency_recurrence_factor = ] frequency_recurrence_factor

是 frequency_type 使用的重复因子。frequency_recurrence_factor 的数据类型为 int，默认设置为 0。

[@active_start_date = ] active_start_date

是第一次调度快照代理程序的日期，格式为 YYYYMMDD。active_start_date 的数据类型为 int，默认设置为 0。

[@active_end_date = ] active_end_date

是停止调度快照代理程序的日期，格式为 YYYYMMDD。active_end_date 的数据类型为 int，默认设置为 99991231，它表示 9999 年 12 月 31日。

[@active_start_time_of_day = ] active_start_time_of_day

是第一次调度快照代理程序的时间，格式为 HHMMSS。active_start_time_of_day 的数据类型为 int，默认设置为 0。

[@active_end_time_of_day = ] active_end_time_of_day

是停止调度快照代理程序的时间，格式为 HHMMSS。active_end_time_of_day 的数据类型为 int，默认设置为 235959，表示 24 小时制的 11:59:59 P.M.。

[@snapshot_job_name = ] 'snapshot_agent_name'

仅限内部使用。

返回代码值

0（成功）或 1（失败）

注释

sp_addpublication_snapshot 用于快照复制和事务复制。

权限

只有 sysadmin 固定服务器角色成员或 db_owner 固定数据库角色成员才能执行 sp_addpublication_snapshot。

请参见

系统存储过程


sp_addpublisher70

在 SQL Server 6.5 版订阅服务器上添加 Microsoft® SQL Server™ 7.0 版或 SQL Server 2000 发布服务器。此存储过程在 SQL Server 6.5 订阅服务器的任何数据库上执行。

语法

sp_addpublisher70 [ @publisher = ] 'publisher' ,
[ @dist_account = ] 'dist_account'

参数

[@publisher = ] 'publisher'

是发布服务器名。publisher 的数据类型为 varchar(30)，没有默认设置。

[@dist_account =] 'dist_account'

是分发代理程序在分发服务器上所使用的 Microsoft Windows® 帐户。在大多数情况下，它是分发服务器上 SQL Server 代理程序的 Windows 帐户。dist_account 的数据类型为 varchar(255)，没有默认设置。

返回代码值

0（成功）或 1（失败）

注释

sp_addpublisher70 用于快照复制和事务复制。

若要在 SQL Server 6.5 订阅服务器上添加 SQL Server 7.0 发布服务器或 SQL Server 2000 发布服务器，应将脚本应用于创建 sp_addpublisher70 存储过程的 SQL Server 6.5 版服务器。脚本位于 \Mssql7\Install 目录下的 Replp70.sql 文件中。

权限

在运行 SQL Server 6.5 的服务器上，执行许可权限默认授予系统管理员。

请参见

系统存储过程


sp_addpullsubscription

将请求订阅或匿名订阅添加到快照发布或事务发布。此存储过程在订阅服务器上要创建请求订阅的数据库上执行。

语法

sp_addpullsubscription [ @publisher = ] 'publisher'
, [ @publisher_db = ] 'publisher_db'
, [ @publication = ] 'publication '
[ , [ @independent_agent = ] 'independent_agent' ]
[ , [ @subscription_type = ] 'subscription_type']
[ , [ @description = ] 'description' ]
[ , [ @update_mode = ] 'update_mode' ]
[ , [ @immediate_sync = ] immediate_sync ]

参数

[@publisher = ] 'publisher'

是发布服务器名。publisher 的数据类型为 sysname，没有默认设置。

[@publisher_db = ] 'publisher_db'

是发布服务器数据库名。publisher_db 的数据类型为 sysname，没有默认设置。

[@publication =] 'publication'

是发布名。publication 的数据类型为 sysname，没有默认设置。

[@independent_agent = ] 'independent_agent'

指定是否有用于该发布的单独的分发代理程序。independent_agent 的数据类型为 nvarchar(5)，默认设置为 TRUE。如果是 true，则表示有用于该发布的独立分发代理程序。如果是 false，则表示每对发布服务器数据库/订阅服务器数据库都有一个分发代理程序。independent_agent 是该发布的属性，而且它在此处的值必须与在发布服务器上的值相同。

[@subscription_type = ] 'subscription_type'

是该发布的订阅类型。subscription_type 的数据类型为 nvarchar(9)，可以是下列值之一。

值 | 描述
pull | 请求订阅
anonymous（默认值） | 匿名订阅

[@description = ] 'description'

是对发布的描述。publication 的数据类型为 nvarchar(100)，默认设置为 NULL。

[@update_mode = ] 'update_mode'

是更新的类型。update_mode 的数据类型为 nvarchar(15)，可以是下列值之一。

值 | 描述
read-only（默认值） | 该订阅是只读的。在订阅服务器上所做的更改不会发送回发布服务器。
synctran | 启用对即时更新订阅的支持。
queued tran | 启用排队更新的订阅。可以在订阅服务器上进行数据修改，将其存储在队列中，然后传播到发布服务器。
failover | 将排队更新作为故障转移的情况下启用用于即时更新的订阅。可以在订阅服务器上进行数据修改并立即传播到发布服务器。如果发布服务器与订阅服务器未连接在一起，则可以将在订阅服务器上所做的数据修改存储在队列中，直到订阅服务器与发布服务器重新连接在一起。

[@immediate_sync = ] immediate_sync

表示每次快照代理程序运行时是否创建或重新创建同步文件。immediate_sync 的数据类型为 bit，默认设置为 1，而且该设置必须与 sp_addpublication 中 immediate_sync 的值相同。immediate_sync 是该发布的属性，而且它在此处的值必须与在发布服务器上的值相同。

返回代码值

0（成功）或 1（失败）

注释

sp_addpullsubscription 用于快照复制和事务复制。

如果在订阅服务器上没有 MSreplication_subscriptions 表，则 sp_addpullsubscription 创建它。它还在 MSreplication_subscriptions 表中添加行。对于请求订阅，应首先在发布服务器上调用 sp_addsubscription。

权限

只有 sysadmin 固定服务器角色成员或 db_owner 固定数据库角色成员才能执行 sp_addpullsubscription。

请参见

sp_droppullsubscription

sp_helppullsubscription

系统存储过程


sp_addpullsubscription_agent

添加新的代理程序到订阅服务器数据库。此存储过程在订阅服务器的订阅数据库上执行。

语法

sp_addpullsubscription_agent [ @publisher = ] 'publisher'
, [ @publisher_db = ] 'publisher_db'
, [ @publication = ] 'publication '
[ , [ @subscriber = ] 'subscriber' ]
[ , [ @subscriber_db = ] 'subscriber_db' ]
[ , [ @subscriber_security_mode = ] subscriber_security_mode ]
[ , [ @subscriber_login = ] 'subscriber_login' ]
[ , [ @subscriber_password = ] 'subscriber_password' ]
[ , [ @distributor = ] 'distributor' ]
[ , [ @distribution_db = ] 'distribution_db' ]
[ , [ @distributor_security_mode = ] distributor_security_mode ]
[ , [ @distributor_login = ] 'distributor_login' ]
[ , [ @distributor_password = ] 'distributor_password' ]
[ , [ @optional_command_line = ] 'optional_command_line' ]
[ , [ @frequency_type = ] frequency_type ]
[ , [ @frequency_interval = ] frequency_interval ]
[ , [ @frequency_relative_interval = ] frequency_relative_interval ]
[ , [ @frequency_recurrence_factor = ] frequency_recurrence_factor ]
[ , [ @frequency_subday = ] frequency_subday ]
[ , [ @frequency_subday_interval = ] frequency_subday_interval ]
[ , [ @active_start_time_of_day = ] active_start_time_of_day ]
[ , [ @active_end_time_of_day = ] active_end_time_of_day ]
[ , [ @active_start_date = ] active_start_date ]
[ , [ @active_end_date = ] active_end_date ]
[ , [ @distribution_jobid = ] distribution_jobid OUTPUT ]
[ , [ @encrypted_distributor_password = ] encrypted_distributor_password ]
[ , [ @enabled_for_syncmgr = ] 'enabled_for_syncmgr' ]
[ , [ @ftp_address = ] 'ftp_address' ]
[ , [ @ftp_port = ] ftp_port ]
[ , [ @ftp_login = ] 'ftp_login' ]
[ , [ @ftp_password = ] 'ftp_password' ]
[ , [ @alt_snapshot_folder = ] 'alternate_snapshot_folder' ]
[ , [ @working_directory = ] 'working_directory' ]
[ , [ @use_ftp = ] 'use_ftp' ]
[ , [ @publication_type= ] publication_type ]
[ , [ @dts_package_name = ] 'dts_package_name' ]
[ , [ @dts_package_password = ] 'dts_package_password' ]
[ , [ @dts_package_location = ] 'dts_package_location' ]
[ , [ @reserved= ] 'reserved' ]
[ , [ @offloadagent = ] 'remote_agent_activation' ]
[ , [ @offloadserver = ] 'remote_agent_server_name' ]
[ , [ @job_name = ] 'job_name' ]

参数

[@publisher = ] 'publisher'

是发布服务器名。publisher 的数据类型为 sysname，没有默认设置。

[@publisher_db = ] 'publisher_db'

是发布服务器数据库名。publisher_db 的数据类型为 sysname，没有默认设置。

[@publication = ] 'publication'

是发布名。publication 的数据类型为 sysname，没有默认设置。

[@subscriber = ] 'subscriber'

是订阅服务器名。subscriber 的数据类型为 sysname，默认设置为 NULL。

[@subscriber_db = ] 'subscriber_db'

是订阅数据库名称。subscriber_db 的数据类型为 sysname，默认设置为 NULL。

[@subscriber_security_mode = ] subscriber_security_mode

是在同步时用于连接到订阅服务器的安全模式。subscriber_security_mode 的数据类型为 int，默认设置为 NULL。0 指定 Microsoft SQL Server 身份验证。1 指定 Microsoft Windows 身份验证。

[@subscriber_login = ] 'subscriber_login'

是在同步时用于连接到订阅服务器的订阅服务器登录。subscriber_login 的数据类型为 sysname，默认设置为 NULL。

[@subscriber_password = ] 'subscriber_password'

是订阅服务器密码。如果 subscriber_security_mode 设置为 0，则必需subscriber_password。subscriber_password 的数据类型为 sysname，默认设置为 NULL。如果使用订阅服务器密码，则将自动加密该密码。

[@distributor = ] 'distributor'

是分发服务器名。distributor 的数据类型为 sysname，默认设置由 publisher 指定。

[ @distribution_db = ] 'distribution_db'

是分发服务器名。distribution_db 的数据类型为 sysname，没有默认设置。

[@distributor_security_mode = ] distributor_security_mode

是在同步时用于连接到分发服务器的安全模式。distributor_security_mode 的数据类型为 int，默认设置为 0。0 指定 Microsoft SQL Server 身份验证。1 指定 Microsoft Windows 身份验证。

[@distributor_login = ] 'distributor_login'

是在同步时用于连接到分发服务器的分发服务器登录。如果 distributor_security_mode 设置为 0，则需要 distributor_login。distributor_login 的数据类型为 sysname，默认设置为 sa。

[@distributor_password = ] 'distributor_password'

是分发服务器密码。如果 distributor_security_mode 设置为 0，则必需 distributor_password。distributor_password 的数据类型为 sysname，默认设置为 NULL。

[@optional_command_line = ] 'optional_command_line'

是提供给分发代理程序的可选命令提示符。例如，-DefinitionFile C:\Distdef.txt 或 -CommitBatchSize 10。optional_command_line 的数据类型为 nvarchar(4000)，默认设置为空字符串。

[@frequency_type = ] frequency_type

是调度分发代理程序所用的频率。frequency_type 的数据类型为 int，可以是下列值之一。

值 | 描述
1 | 一次
2（默认值） | 按需
4 | 每天
8 | 每周
16 | 每月
32 | 每月相对信息
64 | 自动启动
124 | 反复出现

[@frequency_interval = ] frequency_interval

是应用于 frequency_type 所设置频率的值。frequency_interval 的数据类型为 int，默认设置为 1。

[@frequency_relative_interval = ] frequency_relative_interval

是分发代理程序运行的日期。当 frequency_type 设置为 32（每月相对信息）时使用该参数。frequency_relative_interval 的数据类型为 int，可以是下列值之一。

值 | 描述
1（默认值） | 第一个
2 | 秒
4 | 第三个
8 | 第四个
16 | 最后一个

[@frequency_recurrence_factor = ] frequency_recurrence_factor

是 frequency_type 使用的重复因子。frequency_recurrence_factor 的数据类型为 int，默认设置为 1。

[@frequency_subday = ] frequency_subday

是在定义的周期内重新调度的频率。frequency_subday 的数据类型为 int，可以是下列值之一。

值 | 描述
1（默认值） | 一次
2 | 秒
4 | 分钟
8 | 小时

[@frequency_subday_interval = ] frequency_subday_interval

是 frequency_subday 的间隔。frequency_subday_interval 的数据类型为 int，默认设置为 1。

[@active_start_time_of_day = ] active_start_time_of_day

是第一次调度分发代理程序的时间，格式为 HHMMSS。active_start_time_of_day 的数据类型为 int，默认设置为 0。

[@active_end_time_of_day = ] active_end_time_of_day

是停止调度分发代理程序的时间，格式为 HHMMSS。active_end_time_of_day 的数据类型为 int，默认设置为 0。

[@active_start_date = ] active_start_date

是第一次调度分发代理程序的日期，格式为 YYYYMMDD。active_start_date 的数据类型为 int，默认设置为 0。

[@active_end_date = ] active_end_date

是停止调度分发代理程序的日期，格式为 YYYYMMDD。active_end_date 的数据类型为 int，默认设置为 0。

[@distribution_jobid = ] distribution_jobid OUTPUT

是该作业的分发代理程序 ID。distribution_jobid 的数据类型为 binary(16)，默认设置为 NULL，并且该参数是 OUTPUT 参数。

[@encrypted_distributor_password = ] encrypted_distributor_password

仅限内部使用。

[@enabled_for_syncmgr = ] 'enabled_for_syncmgr'

表示是否可以通过 Microsoft 同步管理器对订阅进行同步处理。enabled_for_syncmgr 的数据类型为 nvarchar(5)，默认设置为 FALSE。如果是 false，则表示该订阅没有注册到同步管理器上。如果是 true，则表示该订阅已注册到同步管理器上，可以在不启动 SQL Server 企业管理器的情况下进行同步处理。

[@ftp_address = ] 'ftp_address'

仅为保持向后兼容性。

[@ftp_port = ] ftp_port

仅为保持向后兼容性。

[@ftp_login = ] 'ftp_login'

仅为保持向后兼容性。

[@ftp_password = ] 'ftp_password'

仅为保持向后兼容性。

[@alt_snapshot_folder = ] 'alternate_snapshot_folder'

指定快照的备用文件夹的位置。alternate_snapshot_folder 的数据类型为 nvarchar(255)，默认设置为 NULL。

[@working_directory = ] 'working_director'

是用于存储发布的数据和架构文件的工作目录名。working_directory 的数据类型为 nvarchar(255)，默认设置为 NULL。应将该名称指定为 UNC 格式。

[@use_ftp = ] 'use_ftp'

指定使用 FTP 而不使用常规协议检索快照。use_ftp 的数据类型为 nvarchar(5)，默认设置为 FALSE。

[@publication_type = ] publication_type

指定发布的复制类型。publication_type 的数据类型为 tinyint，默认设置为 0。如果是 0，则发布是事务类型。如果是 1，则表示发布是快照类型。如果是 2，则表示发布是合并类型。

[@dts_package_name = ] 'dts_package_name'

指定 DTS 包的名称。dts_package_name 的数据类型为 sysname，默认设置为 NULL。例如，若要指定 DTSPub_Package 包，则该参数将是 @dts_package_name = N'DTSPub_Package'。

[@dts_package_password = ] 'dts_package_password'

指定如果有密码，则密码在包上。dts_package_password 的数据类型为 sysname，默认设置为 NULL，表示密码不在包上。

[@dts_package_location = ] 'dts_package_location'

指定包的位置。dts_package_location 的数据类型为 nvarchar(12)，默认设置为 SUBSCRIBER。包的位置可以是 distributor 或 subscriber。

[@reserved = ] 'reserved'

仅限内部使用。

[@offloadagent = ] 'remote_agent_activation'

指定可以远程地激活代理程序。remote_agent_activation 的数据类型为 bit，默认设置为 0。0 指定不能远程地激活代理程序。而 1 指定将远程地激活代理程序，并且是在 remote_agent_server_name 所指定的远程计算机上激活。

[@offloadserver = ] 'remote_agent_server_name'

指定用于远程激活的服务器的网络名。remote_agent_server_name 的数据类型为 sysname，默认设置为 NULL。

[@job_name = ] 'job_name'

仅限内部使用。

返回代码值

0（成功）或 1（失败）

注释

sp_addpullsubscription_agent 用于快照复制和事务复制。

权限

只有 sysadmin 固定服务器角色成员或 db_owner 固定数据库角色成员才能执行 sp_addpullsubscription_agent。

请参见

系统存储过程


sp_addscriptexec

将 SQL 脚本（.sql 文件）发布到发布的所有订阅服务器。此存储过程在发布服务器的发布数据库上执行。

语法

sp_addscriptexec [ @publication = ] publication
[ , [ @scriptfile = ] 'scriptfile' ]
[ , [ @skiperror = ] 'skiperror' ]

参数

[@publication = ] 'publication'

是发布名。publication 的数据类型为 sysname，没有默认设置。

[@scriptfile = ] 'scriptfile'

是 SQL 脚本文件的完整路径。scriptfile 的数据类型为 nvarchar(4000)，没有默认设置。

[@skiperror = ] 'skiperror'

表示在脚本处理过程中遇到错误时是否停止分发代理程序或合并代理程序。SkipError 的数据类型为 bit，默认设置为 0。如果是 0，则停止分发代理程序或合并代理程序。如果是 1，则继续执行分发代理程序或合并代理程序，并忽略错误。

返回代码值

0（成功）或 1（失败）

注释

sp_addscriptexec 用于事务复制和合并复制。

sp_addscriptexec 不用于快照复制。

sp_addscriptexec 对于将脚本应用到订阅服务器非常有用，并且使用 osql.exe 将脚本的内容应用于订阅服务器。但是，因为订阅服务器的配置千差万别，所以即使在发布到发布服务器之前对脚本进行了测试，仍有可能在订阅服务器上引起错误。SkipError 位使用户可以让分发代理程序或合并代理程序忽略错误继续运行。在运行 sp_addscriptexec 之前使用 osql.exe 测试脚本。

注意跳过的错误将继续记录在代理程序历史记录中供您参考。有关更多信息，请参见查看代理程序历史记录。

权限

只有 sysadmin 固定服务器角色成员或 db_owner 固定数据库角色成员才能执行 sp_addscriptexec 。

请参见

代理程序和监视器

如何监视复制代理程序的历史记录（企业管理器）

系统存储过程


sp_addsubscriber

向发布服务器添加新的订阅服务器，使其能够接收发布。此存储过程在发布服务器的发布数据库上执行。

语法

sp_addsubscriber [ @subscriber = ] 'subscriber'
[ , [ @type = ] type ]
[ , [ @login = ] 'login' ]
[ , [ @password = ] 'password' ]
[ , [ @commit_batch_size = ] commit_batch_size ]
[ , [ @status_batch_size = ] status_batch_size ]
[ , [ @flush_frequency = ] flush_frequency ]
[ , [ @frequency_type = ] frequency_type ]
[ , [ @frequency_interval = ] frequency_interval ]
[ , [ @frequency_relative_interval = ] frequency_relative_interval ]
[ , [ @frequency_recurrence_factor = ] frequency_recurrence_factor ]
[ , [ @frequency_subday = ] frequency_subday ]
[ , [ @frequency_subday_interval = ] frequency_subday_interval ]
[ , [ @active_start_time_of_day = ] active_start_time_of_day ]
[ , [ @active_end_time_of_day = ] active_end_time_of_day ]
[ , [ @active_start_date = ] active_start_date ]
[ , [ @active_end_date = ] active_end_date ]
[ , [ @description = ] 'description' ]
[ , [ @security_mode = ] security_mode ]
[ , [ @encrypted_password = ] encrypted_password ]

参数

[@subscriber = ] 'subscriber'

是要作为有效订阅服务器添加到服务器上发布的服务器名称。subscriber 的数据类型为 sysname，没有默认设置。

[@type = ] type

是订阅服务器的类型。type 的数据类型为 tinyint，可以是下列值之一。

值 | 描述
0（默认值） | Microsoft® SQL Server™ 订阅服务器
1 | ODBC 数据源服务器
2 | Microsoft Jet 数据库
3 | OLE DB 提供程序

[ @login = ] 'login'

是 SQL Server 身份验证的登录 ID。login 的数据类型为 sysname，默认设置为 sa。

[@password = ] 'password'

是 SQL Server 身份验证的密码。password 的数据类型为 sysname，默认设置为 NULL。

[@commit_batch_size = ] commit_batch_size

仅为保持向后兼容性。

[@status_batch_size = ] status_batch_size

仅为保持向后兼容性。

[@flush_frequency = ] flush_frequency

仅为保持向后兼容性。

[@frequency_type = ] frequency_type

是调度分发代理程序所用的频率。frequency_type 的数据类型为 int，可以是下列值之一。

值 | 描述
1 | 一次
2 | 按需
4 | 每天
8 | 每周
16 | 每月
32 | 每月相对信息
64（默认值） | 自动启动
124 | 反复出现

[@frequency_interval = ] frequency_interval

是应用于 frequency_type 所设置频率的值。frequency_interval 的数据类型为 int，默认设置为 1。

[@frequency_relative_interval = ] frequency_relative_interval

是分发代理程序运行的日期。当 frequency_type 设置为 32（每月相对信息）时使用该参数。frequency_relative_interval 的数据类型为 int，可以是下列值之一。

值 | 描述
1（默认值） | 第一个
2 | 秒
4 | 第三个
8 | 第四个
16 | 最后一个

[@frequency_recurrence_factor = ] frequency_recurrence_factor

是 frequency_type 使用的重复因子。frequency_recurrence_factor 的数据类型为 int，默认设置为 0。

[@frequency_subday = ] frequency_subday

是在定义的周期内重新调度的频率。frequency_subday 的数据类型为 int，可以是下列值之一。

值 | 描述
1 | 一次
2 | 秒
4（默认值） | 分钟
8 | 小时

[@frequency_subday_interval = ] frequency_subday_interval

是 frequency_subday 的间隔。frequency_subday_interval 的数据类型为 int，默认设置为 5。

[@active_start_time_of_day = ] active_start_time_of_day

是第一次调度分发代理程序的时间，格式为 HHMMSS。active_start_time_of_day 的数据类型为 int，默认设置为 0。

[@active_end_time_of_day = ] active_end_time_of_day

是停止调度分发代理程序的时间，格式为 HHMMSS。active_end_time_of_day 的数据类型为 int，默认设置为 235959，表示 24 小时制的 11:59:59 P.M.。

[@active_start_date = ] active_start_date

是第一次调度分发代理程序的日期，格式为 YYYYMMDD。active_start_date 的数据类型为 int，默认设置为 0。

[@active_end_date = ] active_end_date

是停止调度分发代理程序的日期，格式为 YYYYMMDD。active_end_date 的数据类型为 int，默认设置为 99991231，表示 9999 年 12 月 31 日。

[@description = ] 'description'

是对订阅服务器的文本描述。description 的数据类型为 nvarchar(255)，默认设置为 NULL。

[@security_mode = ] security_mode

是实现的安全模式。security_mode 的数据类型为 int，默认设置为 1。0 指定 SQL Server 身份验证。1 指定 Windows 身份验证。

[@encrypted_password = ] encrypted_password

仅限内部使用。

返回代码值

0（成功）或 1（失败）

注释

sp_addsubscriber 用于快照复制、事务复制和合并复制。

sp_addsubscriber 写入 distribution 数据库内的 MSsubscriber_info 表。

权限

只有 sysadmin 固定服务器角色成员才能执行 sp_addsubscriber。

请参见

sp_addremotelogin

sp_addserver

sp_changesubscriber

sp_dboption

sp_dropsubscriber

sp_helpdistributor

sp_helpserver

sp_helpsubscriberinfo

sp_remoteoption

sp_serveroption

系统存储过程


sp_addsubscriber_schedule

为分发代理程序和合并代理程序添加调度。此存储过程在发布服务器的任何数据库上执行。

语法

sp_addsubscriber_schedule [ @subscriber = ] 'subscriber'
[ , [ @agent_type = ] agent_type ]
[ , [ @frequency_type = ] frequency_type ]
[ , [ @frequency_interval = ] frequency_interval ]
[ , [ @frequency_relative_interval = ] frequency_relative_interval ]
[ , [ @frequency_recurrence_factor = ] frequency_recurrence_factor ]
[ , [ @frequency_subday = ] frequency_subday ]
[ , [ @frequency_subday_interval = ] frequency_subday_interval ]
[ , [ @active_start_time_of_day = ] active_start_time_of_day ]
[ , [ @active_end_time_of_day = ] active_end_time_of_day ]
[ , [ @active_start_date = ] active_start_date ]
[ , [ @active_end_date = ] active_end_date ]

参数

[@subscriber = ] 'subscriber'

是订阅服务器名。subscriber 的数据类型为 sysname。订阅服务器名在数据库内必须唯一，不能已存在，而且不能为 NULL。

[@agent_type = ] agent_type

是代理程序的类型，agent_type 的数据类型为 smallint，可以是下列值之一。

值 | 描述
0（默认值） | 分发代理程序
1 | 合并代理程序

[@frequency_type = ] frequency_type

是调度分发代理程序所用的频率。frequency_type 的数据类型为 int，可以是下列值之一。

值 | 描述
1 | 一次
2 | 按需
4 | 每天
8 | 每周
16 | 每月
32 | 每月相对信息
64（默认值） | 自动启动
124 | 反复出现

[@frequency_interval = ] frequency_interval

是应用于 frequency_type 所设置频率的值。frequency_interval 的数据类型为 int，默认设置为 1。

[@frequency_relative_interval = ] frequency_relative_interval

是分发代理程序运行的日期。当 frequency_type 设置为 32（每月相对信息）时使用该参数。frequency_relative_interval 的数据类型为 int，可以是下列值之一。

值 | 描述
1（默认值） | 第一个
2 | 秒
4 | 第三个
8 | 第四个
16 | 最后一个

[@frequency_recurrence_factor = ] frequency_recurrence_factor

是 frequency_type 使用的重复因子。frequency_recurrence_factor 的数据类型为 int，默认设置为 0。

[@frequency_subday = ] frequency_subday

是在定义的周期内重新调度的频率。frequency_subday 的数据类型为 int，可以是下列值之一。

值 | 描述
1 | 一次
2 | 秒
4（默认值） | 分钟
8 | 小时

[@frequency_subday_interval = ] frequency_subday_interval

是 frequency_subday 的间隔。frequency_subday_interval 的数据类型为 int，默认设置为 5。

[@active_start_time_of_day = ] active_start_time_of_day

是第一次调度分发代理程序的时间，格式为 HHMMSS。active_start_time_of_day 的数据类型为 int，默认设置为 0。

[@active_end_time_of_day = ] active_end_time_of_day

是停止调度分发代理程序的时间，格式为 HHMMSS。active_end_time_of_day 的数据类型为 int，默认设置为 235959，表示 24 小时制的 11:59:59 P.M.。

[@active_start_date = ] active_start_date

是第一次调度分发代理程序的日期，格式为 YYYYMMDD。active_start_date 的数据类型为 int，默认设置为 0。

[@active_end_date = ] active_end_date

是停止调度分发代理程序的日期，格式为 YYYYMMDD。active_end_date 的数据类型为 int，默认设置为 99991231，表示 9999 年 12 月 31 日。

返回代码值

0（成功）或 1（失败）

注释

sp_addsubscriber_schedule 用于快照复制、事务复制和合并复制。

权限

只有 sysadmin 固定服务器角色成员才能执行 sp_addsubscriber_schedule。

请参见

sp_changesubscriber_schedule

系统存储过程


sp_addsubscription

将订阅添加到发布并设置订阅服务器的状态。此存储过程在发布服务器的发布数据库上执行。

语法

sp_addsubscription [ @publication = ] 'publication'
[ , [ @article = ] 'article' ]
[ , [ @subscriber = ] 'subscriber' ]
[ , [ @destination_db = ] 'destination_db' ]
[ , [ @sync_type = ] 'sync_type' ]
[ , [ @status = ] 'status'
[ , [ @subscription_type = ] 'subscription_type' ]
[ , [ @update_mode = ] 'update_mode' ]
[ , [ @loopback_detection = ] 'loopback_detection' ]
[ , [ @frequency_type = ] frequency_type ]
[ , [ @frequency_interval = ] frequency_interval ]
[ , [ @frequency_relative_interval = ] frequency_relative_interval ]
[ , [ @frequency_recurrence_factor = ] frequency_recurrence_factor ]
[ , [ @frequency_subday = ] frequency_subday ]
[ , [ @frequency_subday_interval = ] frequency_subday_interval ]
[ , [ @active_start_time_of_day = ] active_start_time_of_day ]
[ , [ @active_end_time_of_day = ] active_end_time_of_day ]
[ , [ @active_start_date = ] active_start_date ]
[ , [ @active_end_date = ] active_end_date ]
[ , [ @optional_command_line = ] 'optional_command_line' ]
[ , [ @reserved = ] 'reserved' ]
[ , [ @enabled_for_syncmgr = ] 'enabled_for_syncmgr' ]
[ , [ @offloadagent = ] remote_agent_activation ]
[ , [ @offloadserver = ] 'remote_agent_server_name' ]
[ , [ @dts_package_name = ] 'dts_package_name' ]
[ , [ @dts_package_password = ] 'dts_package_password' ]
[ , [ @dts_package_location = ] 'dts_package_location' ]
[ , [ @distribution_job_name = ] 'distribution_job_name' ]

参数

[@publication = ] 'publication'

是发布名。publication 的数据类型为 sysname，没有默认设置。

[@article = ] 'article'

是对其订阅发布的项目。article 的数据类型为 sysname，默认设置为 all。项目名在发布内必须唯一。如果是 all 或没有提供，则表示将订阅添加到该发布内的所有项目。

[@subscriber = ] 'subscriber'

是订阅服务器名。subscriber 的数据类型为 sysname，默认设置为 NULL。

[@destination_db = ] 'destination_db'

是用来存放复制数据的目的数据库名。destination_db 的数据类型为 sysname，默认设置为 NULL，并且使用与发布数据库相同的名称。

[@sync_type = ] 'sync_type'

是订阅同步类型。sync_type 的数据类型为 nvarchar(15)，默认设置为 automatic。可以是 automatic 或 none。如果是 automatic，则表示首先将已发布表的架构和初始数据传输到订阅服务器。如果是 none，则假定订阅服务器已有已发布表的架构和初始数据。始终传输系统表和数据。

[@status = ] 'status'

是订阅状态。status 的数据类型为 sysname，可以是下列值之一。

值 | 描述
Active | 如果 sync_type 是 none，则 status 的默认设置为 active。若要启用订阅服务器以查看受限发布项目内的项目，必须将占位符订阅创建为不活动状态。如果 sync_type 是 automatic，则 status 不能设置为 active。
Subscribed | 如果 sync_type 是 none 以外的值，则 status 的默认设置为 subscribed。
NULL（默认值） |

[@subscription_type = ] 'subscription_type'

是订阅的类型。subscription_type 的数据类型为 nvarchar(4)，默认设置为 push。可以是 push 或 pull。push 订阅的分发代理程序驻留在分发服务器上，而 pull 订阅的分发代理程序驻留在订阅服务器上。subscription_type 可以是 pull 以创建对发布服务器是已知的命名请求订阅。有关更多信息，请参见订阅发布。

说明 匿名订阅无需使用此存储过程。

[@update_mode = ] 'update_mode'

是更新的类型。update_mode 的数据类型为 nvarchar(30)，可以是下列值之一。

值 | 描述
read only（默认值） | 该订阅是只读的。在订阅服务器上所做的更改不会发送到发布服务器。
sync tran | 启用对即时更新订阅的支持。
queued tran | 启用排队更新的订阅。可以在订阅服务器上进行数据修改，将其存储在队列中，然后传播到发布服务器。
failover | 将排队更新作为故障转移的情况下启用用于即时更新的订阅。可以在订阅服务器上进行数据修改并立即传播到发布服务器。如果发布服务器与订阅服务器未连接在一起，则可以将在订阅服务器上所做的数据修改存储在队列中，直到订阅服务器与发布服务器重新连接在一起。

注意，如果订阅的发布允许 DTS，则不允许值 synctran 和 queued tran。

[@loopback_detection = ] 'loopback_detection'

指定分发代理程序是否将在订阅服务器上发起的事务发送回订阅服务器。loopback_detection 的数据类型为 nvarchar(5)，可以是下列值之一。

值 | 描述
true | 分发代理程序不将从订阅服务器上发起的事务发送回该订阅服务器。仅当订阅 update_mode 的数据类型为 synctran 且项目表有发布的 timestamp 列时，才能将值设置为 true。
false | 分发代理程序将在订阅服务器上发起的事务发送回订阅服务器：
NULL（默认值） |

[@frequency_type = ] frequency_type

是调度分发代理程序所用的频率。frequency_type 的数据类型为 int，默认设置为 NULL。如果未指定值，则 sp_addsubscription 将使用 sp_addsubscriber 中指定的值。

[@frequency_interval = ] frequency_interval

是应用于 frequency_type 所设置频率的值。frequency_interval 的数据类型为 int，默认设置为 NULL。

[@frequency_relative_interval = ] frequency_relative_interval

是分发代理程序运行的日期。当 frequency_type 设置为 32（每月相对信息）时使用该参数。frequency_relative_interval 的数据类型为 int，可以是下列值之一。

值 | 描述
1 | 第一个
2 | 秒
4 | 第三个
8 | 第四个
16 | 最后一个
NULL（默认值） |

[@frequency_recurrence_factor = ] frequency_recurrence_factor

是 frequency_type 使用的重复因子。frequency_recurrence_factor 的数据类型为 int，默认设置为 NULL。

[@frequency_subday = ] frequency_subday

是在定义的周期内重新调度的频率（以分钟为单位）。frequency_subday 的数据类型为 int，可以是下列值之一。

值 | 描述
1 | 一次
2 | 秒
4 | 分钟
8 | 小时
NULL |

[@frequency_subday_interval = ] frequency_subday_interval

是 frequency_subday 的间隔。frequency_subday_interval 的数据类型为 int，默认设置为 NULL。

[@active_start_time_of_day = ] active_start_time_of_day

是第一次调度分发代理程序的时间，格式为 HHMMSS。active_start_time_of_day 的数据类型为 int，默认设置为 NULL。

[@active_end_time_of_day = ] active_end_time_of_day

是停止调度分发代理程序的时间，格式为 HHMMSS。active_end_time_of_day 的数据类型为 int，默认设置为 NULL。

[@active_start_date = ] active_start_date

是第一次调度分发代理程序的日期，格式为 YYYYMMDD。active_start_date 的数据类型为 int，默认设置为 NULL。

[@active_end_date = ] active_end_date

是停止调度分发代理程序的日期，格式为 YYYYMMDD。active_end_date 的数据类型为 int，默认设置为 NULL。

[@optional_command_line = ] 'optional_command_line'

是要执行的可选命令提示符。optional_command_line 的数据类型为 nvarchar(4000)，默认设置为 NULL。

[@reserved = ] 'reserved'

仅限内部使用。

[@enabled_for_syncmgr = ] 'enabled_for_syncmgr'

表示是否可以通过 Microsoft Windows 同步管理器对订阅进行同步处理。enabled_for_syncmgr 的数据类型为 nvarchar(5)，默认设置为 FALSE。如果是 false，则表示该订阅没有注册到 Windows 同步管理器上。如果是 true，则表示该订阅注册到 Windows 同步管理器上，可以在不启动 SQL Server 企业管理器的情况下进行同步处理。

[@offloadagent = ] 'remote_agent_activation'

指定可以远程地激活代理程序。remote_agent_activationt 的数据类型为 bit，默认设置为 0。0 指定不能远程地激活代理程序。1 指定可以远程地激活代理程序。

[@offloadserver = ] 'remote_agent_server_name'

指定用于远程激活的服务器的网络名。remote_agent_server_name 的数据类型为 sysname，默认设置为 NULL。

[@dts_package_name = ] 'dts_package_name'

指定 DTS 包的名称。dts_package_name 的数据类型为 sysname，默认设置为 NULL。例如，若要指定 DTSPub_Package 包，则该参数将是 @dts_package_name = N'DTSPub_Package'。该参数可用于强制订阅。若要向请求订阅添加 DTS 包信息，请使用 sp_addpullsubscription_agent。

[@dts_package_password = ] 'dts_package_password'

指定如果有密码，则密码在包上。dts_package_password 的数据类型为 sysname，默认设置为 NULL，表示包没有密码。

[@dts_package_location = ] 'dts_package_location'

指定包的位置。dts_package_location 的数据类型为 nvarchar(12)，默认设置为 DISTRIBUTOR。包的位置可以是 distributor 或 subscriber。

[@distribution_job_name = ] 'distribution_job_name'

仅限内部使用。

返回代码值

0（成功）或 1（失败）

注释

sp_addsubscription 用于快照复制和事务复制。

sp_addsubscription 禁止 ODBC 和 OLE DB 订阅服务器访问下列发布：

  • 在对 sp_addpublication 的调用中用本机 @sync_method 创建的发布。

  • 包含用 pre_creation_cmd 参数值为 3（截断）的 sp_addarticle 存储过程添加到其中的项目的发布。

  • 尝试将 @update_mode 设置为 synchtran 的发布。

  • 含有被配置为使用参数化语句的项目的发布。

另外，如果发布将 allow_queued_tran 选项设置为 true（表示在订阅服务器上启用更改队列，直到它们可在发布服务器上应用），项目中的时间戳列将写成 timestamp 脚本，而此列中的更改将发送到订阅服务器。订阅服务器将生成并更新时间戳列值。对于 ODBC/OLE DB 订阅服务器，如果尝试订阅的发布将 allow_queued_tran 设置为 true 且包含带时间戳列的项目，则 sp_addsubscription 将失败。

如果订阅不使用 DTS 包，则不能订阅已设置为 allow_transformable_subscriptions 的发布。如果来自发布的表需要重新应用于 DTS 订阅和非 DTS 订阅，则必须分别创建两种发布。每种发布针对一种类型的订阅。

权限

只有 sysadmin 固定服务器角色成员或 db_owner 固定数据库角色成员才能执行 sp_addsubscription。对于请求订阅，在发布访问列表中有登录的用户可以执行 sp_addsubscription。

请参见

sp_changesubstatus

sp_dropsubscription

sp_helpsubscription

系统存储过程


sp_addsynctriggers

在订阅服务器上创建与所有类型的可更新订阅（即时、排队和将排队更新作为故障转移的即时更新）一起使用的触发器。此存储过程在订阅服务器的订阅数据库上执行。

语法

sp_addsynctriggers [ @sub_table = ] 'sub_table'
, [ @sub_table_owner = ] 'sub_table_owner'
, [ @publisher = ] 'publisher' ,
, [ @publisher_db = ] 'publisher_db'
, [ @publication = ] 'publication '
, [ @ins_proc = ] 'ins_proc'
, [ @upd_proc = ] 'upd_proc'
, [ @del_proc = ] 'del_proc'
, [ @cftproc = ] 'cftproc'
, [ @proc_owner = ] 'proc_owner'
, [ , [ @identity_col = ] 'identity_col' ]
, [ , [ @ts_col = ] 'timestamp_col' ]
, [ , [ @filter_clause = ] 'filter_clause' ] ,
, [ @primary_key_bitmap = ] 'primary_key_bitmap' ,
[ , [ @identity_support = ] identity_support ]
[ , [ @independent_agent = ] independent_agent ]
, [ @distributor = ] 'distributor'

参数

[@sub_table =] 'sub_table'

是订阅服务器表名。sub_table 的数据类型为 sysname，没有默认设置。

[@sub_table_owner =] 'sub_table_owner'

是订阅服务器表所有者的名称。sub_table_owner 的数据类型为 sysname，没有默认设置。

[@publisher =] 'publisher'

是发布服务器名。publisher 的数据类型为 sysname，没有默认设置。

[@publisher_db =] 'publisher_db'

是发布服务器数据库名。publisher_db 的数据类型为 sysname，没有默认设置。如果是 NULL，则表示使用当前数据库。

[@publication =] 'publication'

是发布名。publication 的数据类型为 sysname，没有默认设置。

[@ins_proc =] 'ins_proc'

是在发布服务器上支持同步事务插入的存储过程名。ins_proc 的数据类型为 sysname，没有默认设置。

[@upd_proc =] 'upd_proc'

是在发布服务器上支持同步事务更新的存储过程名。ins_proc 的数据类型为 sysname，没有默认设置。

[@del_proc =] 'del_proc'

是在发布服务器上支持同步事务删除的存储过程名。ins_proc 的数据类型为 sysname，没有默认设置。

[@cftproc = ] 'cftproc'

是允许排队更新的发布所使用的自动生成存储过程的名称。cftproc 的数据类型为 sysname，没有默认设置。对于允许即时更新的发布，此值为 NULL。该参数适用于允许排队更新（排队更新和将排队更新作为故障转移的即时更新）的发布。

[@proc_owner = ] 'proc_owner'

指定发布服务器中的用户帐户，在该帐户下创建了用于（排队和/或即时）更新发布的所有自动生成存储过程。proc_owner 的数据类型为 sysname，没有默认设置。

[@identity_col =] 'identity_col'

是发布服务器上的标识列名。identity_col 的数据类型为 sysname，默认设置为 NULL。

[@ts_col =] 'timestamp_col'

是发布服务器上的 timestamp 列名。timestamp_col 的数据类型为 sysname，默认设置为 NULL。

[@filter_clause =] 'filter_clause'

是定义水平筛选的 (WHERE) 限制子句。输入该限制子句时，省略关键字 WHERE。filter_clause 的数据类型为 nvarchar(4000)，默认设置为 NULL。

[@primary_key_bitmap =] 'primary_key_bitmap'

是表内主键列的位图。primary_key_bitmap 的数据类型为 varbinary(4000)，没有默认设置。

[@identity_support = ] identity_support

当使用排队更新时启用和禁用自动标识范围处理。identity_support 的数据类型为 bit，默认设置为 0。0 表示没有标识范围支持，而 1 表示启用自动标识范围处理。

[@independent_agent = ] independent_agent

表示是否有用于该发布的单个分发代理程序（独立代理程序），或每个发布数据库和订阅数据库对有一个分发代理程序（共享代理程序）。该值反映了在发布服务器上定义的发布的 independent_agent 属性值。independent_agent 的数据类型为 bit，默认设置为 0。如果是 0，则表示代理程序为共享代理程序。如果是 1，则表示代理程序为独立代理程序。

[@distributor = ] 'distributor'

是分发服务器名称。distributor 的数据类型为 sysname，没有默认设置。

返回代码值

0（成功）或 1（失败）

注释

分发代理程序将 sp_addsynctriggers 作为订阅初始化的一部分。此存储过程通常不能由用户运行，但如果用户需要手工设置非同步订阅，则此过程很有用。

权限

只有 sysadmin 固定服务器角色成员或 db_owner 固定数据库角色成员才能执行 sp_addsynctriggers。

请参见

在即时更新中将排队更新作为故障转移

为复制选项制定计划

sp_articlesynctranprocs

sp_script_synctran_commands

系统存储过程


sp_addtabletocontents

将源表中当前不在跟踪表内的任何行的引用插入合并跟踪表中。如果已使用 bcp 大容量装载了大量数据（这不会记录合并跟踪触发器），则使用此选项。此存储过程在发布服务器的发布数据库上执行。

语法

sp_addtabletocontents [ @table_name = ] 'table_name'
[ , [ @owner_name = ] 'owner_name' ]

参数

[@table_name =] 'table_name'

是表名。table_name 的数据类型为 sysname，没有默认设置。

[@owner_name =] 'owner_name'

是表所有者的名称。owner_name 的数据类型为 sysname，默认设置为 NULL。

返回代码值

0（成功）或 1（失败）

注释

sp_addtabletocontents 只用于合并复制。

table_name 中的行由它们的 rowguidcol 引用，这些引用将添加到合并跟踪表中。应在将数据大容量复制到用合并复制发布的表后使用 sp_addtabletocontents。此存储过程启动对复制行的跟踪并确保将新行包含在下一个同步中。

权限

只有 sysadmin 固定服务器角色成员或 db_owner 固定数据库角色成员才能执行 sp_addtabletocontents。

请参见

使用大容量复制操作添加行

系统存储过程


sp_adjustpublisheridentityrange

调整发布上的标识范围，并基于发布上的阈值重新分配新的范围。此存储过程在发布服务器的发布数据库上执行。

语法

sp_adjustpublisheridentityrange [ @publication = ] 'publication'
[ @table_name = ] 'table_name'
[ @table_owner= ] 'table_owner'

参数

[@publication =] 'publication'

是包含该项目的发布名。publication 的数据类型为 sysname，默认设置为 NULL。

[@table_name =] 'table_name'

是表名。table_name 的数据类型为 sysname，默认设置为 NULL。

[@table_owner =] 'table_owner'

是订阅服务器表所有者的名称。table_owner 的数据类型为 sysname，默认设置为 NULL。

返回代码值

0（成功）或 1（失败）

注释

sp_adjustpublisheridentityrange 用于所有类型的复制。

对于已启用自动标识范围的发布，分发代理程序或合并代理程序负责基于发布的阈值自动调整发布的标识范围。但是，如果由于某种原因分发代理程序或合并代理程序停止运行了一段时间，并且已大量消耗了标识范围资源以至达到阈值，则用户可调用 sp_adjustpublisheridentityrange 为发布服务器分配新的范围值。

权限

只有 sysadmin 固定服务器角色成员或 db_owner 固定数据库角色成员才能执行 sp_adjustpublisheridentityrange。

请参见

管理标识值

系统存储过程


sp_article_validation

启动对指定项目的数据验证请求。此存储过程在发布服务器的发布数据库上执行。

语法

sp_article_validation [ @publication = ] 'publication'
[ , [ @article = ] 'article' ]
[ , [ @rowcount_only = ] type_of_check_requested ]
[ , [ @full_or_fast = ] full_or_fast ]
[ , [ @shutdown_agent = ] shutdown_agent ]
[ , [ @subscription_level = ] subscription_level ]
[ , [ @reserved = ] reserved ]

参数

[@publication =] 'publication'

是包含该项目的发布名。publication 的数据类型为 sysname，没有默认设置。

[@article = ]'article'

是要更改的项目名。article 的数据类型为 sysname，没有默认设置。

[@rowcount_only =] type_of_check_requested

指定是否仅返回表的行数。. type_of_check_requested 的数据类型为 smallint，默认设置为 1。如果为 0，则执行 SQL Server 7.0 兼容校验值检查。如果为 1，则只执行行数检查。如果为 2，则执行行数和校验值。

[@full_or_fast =] full_or_fast

是用于计算行数的方法。full_or_fast 的数据类型为 tinyint，可以是下列值之一。

值 | 描述
0 | 用 COUNT(*) 执行完整计数。
1 | 从 sysindexes.rows 执行快速计数。用 sysindexes 对行进行计数比对实际表中的行进行计数快得多。但由于很少对 sysindexes 进行更新，所以行数可能不准确。
2（默认值） | 首先使用快速方法执行条件快速计数。如果快速方法显示出差异，则转而使用完整方法。如果 expected_rowcount 的值为 NULL，而且正在使用存储过程获取该值，则始终使用完整 COUNT(*)。

[@shutdown_agent =] shutdown_agent

指定是否在完成验证时立即关闭分发代理程序。shutdown_agent 的数据类型为 bit，默认设置为 0。如果是 0，则表示不关闭分发代理程序。如果是 1，则表示在验证项目后关闭分发代理程序。

[@subscription_level =] subscription_level

指定是否由一组订阅服务器使用验证。subscription_level 的数据类型为 bit，默认设置为 0。如果是 0，则表示所有订阅服务器都不使用验证。如果是 1，则表示验证只能用于当前打开事务的 sp_marksubscriptionvalidation 调用所指定的订阅服务器的子集。

[@reserved =] reserved

仅限内部使用。

返回代码值

0（成功）或 1（失败）

注释

sp_article_validation 用于快照复制和事务复制。

sp_article_validation 使在指定的项目上聚集验证信息并向事务日志发布验证请求。分发代理程序接收到该请求后，将该请求中的验证信息与订阅服务器表进行比较。验证的结果显示在复制监视器和 SQL Server 代理程序警报中。

权限

只有 sysadmin 固定服务器角色成员或 db_owner 固定数据库角色成员才能执行 sp_article_validation。

请参见

sp_marksubscriptionvalidation

sp_publication_validation

sp_table_validation

系统存储过程


sp_articlecolumn

指定项目中使用的列。使用 sp_articlecolumn 垂直筛选表中的数据。此存储过程在发布服务器的发布数据库上执行。

语法

sp_articlecolumn [ @publication = ] 'publication'
, [ @article = ] 'article'
[ , [ @column = ] 'column' ]
[ , [ @operation = ] 'operation' ]
[ , [ @refresh_synctran_procs = ] refresh_synctran_procs ]
[ , [ @ignore_distributor = ] ignore_distributor ]
[ , [ @change_active = ] change_actve ]
[ , [ @force_invalidate_snapshot = ] force_invalidate_snapshot ]
[ , [ @force_reinit_subscription = ] force_reinit_subscription ]

参数

[@publication =] 'publication'

是包含该项目的发布名。publication 的数据类型为 sysname，没有默认设置。

[@article = ]'article'

是项目名。article 的数据类型为 sysname，没有默认设置。

[@column =] 'column'

是要添加或除去的列名。column 的数据类型为 sysname，默认设置为 NULL。如果是 NULL，则表示发布所有的列。

[@operation =] 'operation'

是复制状态。operation 的数据类型为 nvarchar(4)，默认设置为 add。add 标记要复制的列。drop 去除该列的标记。

[@refresh_synctran_procs =] refresh_synctran_procs

指定是否添加或除去项目中的列。refresh_synctran_procs 的数据类型为 bit，默认设置为 1。如果是 1，则表示重新生成支持同步事务的存储过程以匹配复制的列数。

[@ignore_distributor =] ignore_distributor

表示是否在不连接到分发服务器的情况下执行此存储过程。ignore_distributor 的数据类型为 bit，默认设置为 0。如果是 0，则表示必须为发布启用数据库，而且应刷新项目高速缓存以反映项目所复制的新列。如果是 1，则表示允许为驻留在未发布数据库中的项目除去项目列；应该仅在恢复情况下使用该设置。

[@change_active = ] change_active

允许修改带有订阅的发布中的列。change_active 的数据类型为 int，默认设置为 0。如果是 0，则表示将不修改列。如果是 1，则表示可以从有订阅的活动项目中添加或除去列。

[@force_invalidate_snapshot = ] force_invalidate_snapshot

确认此存储过程采取的操作可能使现有快照无效。force_invalidate_snapshot 的数据类型为 bit，默认设置为 0。0 指定对项目的更改不会导致快照无效。如果存储过程检测到更改确实需要新快照，则会发生错误，且不会进行任何更改。而 1 指定对项目所做的更改可能导致快照无效，而且如果现有订阅需要新的快照，则提供适当的权限，使现有快照被标记为废弃并生成新快照。

[@force_reinit_subscription = ] force_reinit_subscription

确认此存储过程采取的操作可能要求重新初始化现有的订阅。force_reinit_subscription 的数据类型为 bit，默认设置为 0。0 指定对项目的更改不会导致重新初始化订阅。如果存储过程检测到更改需要重新初始化订阅，则会发生错误，且不会进行任何更改。而 1 指定对项目的更改将导致重新初始化现有的订阅，且提供使订阅重新初始化发生的权限。

返回代码值

0（成功）或 1（失败）

注释

sp_articlecolumn 用于快照复制和事务复制。

sp_articlecolumn 在 sysarticles 内设置 bit。用 sp_articlecolumn 只能筛选一个未订阅项目。

权限

只有 sysadmin 固定服务器角色成员或 db_owner 固定数据库角色成员才能执行 sp_articlecolumn。

请参见

sp_addarticle

sp_addpublication

sp_articleview

sp_changearticle

sp_changepublication

sp_droparticle

sp_droppublication

sp_enumfullsubscribers

sp_helparticle

sp_helparticlecolumns

sp_helppublication

系统存储过程


sp_articlefilter

筛选将基于表项目发布的数据。此存储过程只能修改没有订阅的项目。此存储过程在发布服务器的发布数据库上执行。

语法

sp_articlefilter [ @publication = ] 'publication'
, [ @article = ] 'article'
[ , [ @filter_name = ] 'filter_name' ]
[ , [ @filter_clause = ] 'filter_clause']
[ , [ @force_invalidate_snapshot = ] force_invalidate_snapshot ]
[ , [ @force_reinit_subscription = ] force_reinit_subscription ]

参数

[@publication =] 'publication'

是包含该项目的发布名。publication 的数据类型为 sysname，没有默认设置。

[@article = ]'article'

是项目名。article 的数据类型为 sysname，没有默认设置。

[@filter_name =] 'filter_name'

是要从 filter_name 创建的筛选存储过程名。filter_name 的数据类型为 nvarchar(386)，默认设置为 NULL。

[@filter_clause =] 'filter_clause'

是定义水平筛选的 (WHERE) 限制子句。输入该限制子句时，省略关键字 WHERE。filter_clause 的数据类型为 ntext，默认设置为 NULL。

[@force_invalidate_snapshot = ] force_invalidate_snapshot

确认此存储过程采取的操作可能使现有快照无效。force_invalidate_snapshot 的数据类型为 bit，默认设置为 0。0 指定对项目的更改不会导致快照无效。如果存储过程检测到更改确实需要新快照，则会发生错误，且不会进行任何更改。而 1 指定对项目所做的更改可能导致快照无效，而且如果现有订阅需要新的快照，则提供适当的权限，使现有快照被标记为废弃并生成新快照。

[@force_reinit_subscription = ] force_reinit_subscription

确认此存储过程所采取的操作可能要求重新初始化现有的订阅。force_reinit_subscription 的数据类型为 bit，默认设置为 0。0 指定对项目的更改不会导致重新初始化订阅。如果存储过程检测到更改需要重新初始化订阅，则会发生错误，且不会进行任何更改。而 1 指定对项目的更改将导致重新初始化现有的订阅，且提供使订阅重新初始化发生的权限。

返回代码值

0（成功）或 1（失败）

注释

sp_article_filter 用于快照复制和事务复制。

sp_articlefilter 创建筛选，在 sysarticles 表的 filter 列中插入筛选存储过程的 ID，然后在 filter_clause 列中插入限制子句的文本。

若要创建带水平筛选的项目，请不带 filter 参数执行 sp_addarticle。执行 sp_articlefilter，并提供包括 filter_clause 在内的所有参数，然后执行 sp_articleview，并提供包括相同的 filter_clause 在内的所有参数。如果该筛选已存在，而且 sysarticles 中的 type 为 1（基于日志的项目），则删除以前的筛选并创建新筛选。

如果未提供 filter_name 和 filter_clause，则删除以前的筛选并将筛选 ID 设置为 0。

权限

只有 sysadmin 固定服务器角色成员或 db_owner 固定数据库角色成员才能执行 sp_articlefilter。

请参见

sp_addarticle

sp_articlecolumn

sp_articleview

系统存储过程


sp_articlesynctranprocs

在发布服务器上生成由更新（即时更新、排队更新和将排队更新作为故障转移的即时更新）订阅服务器触发器调用的过程。此存储过程在发布服务器的发布数据库上执行。

语法

sp_articlesynctranprocs [ @publication = ] 'publication'
, [ @article = ] 'article'
, [ @ins_proc = ] 'ins_proc'
, [ @upd_proc = ] 'upd_proc'
, [ @del_proc = ] 'del_proc'
[ , [ @autogen = ] 'autogen']
, [ @upd_trig = ] 'update_trigger' ]

参数

[@publication =] 'publication'

是发布名。publication 的数据类型为 sysname，没有默认设置。

[@article = ] 'article'

是项目名。article 的数据类型为 sysname，没有默认设置。

[@ins_proc =] 'ins_proc'

是支持与该项目关联的即时更新订阅服务器插入的存储过程名。ins_proc 的数据类型为 sysname，没有默认设置。

[@upd_proc =] 'upd_proc'

是支持与该项目关联的即时更新订阅服务器更新的存储过程名。upd_proc 的数据类型为 sysname，没有默认设置。

[@del_proc =] 'del_proc'

是支持与该项目关联的即时更新订阅服务器删除的存储过程名。del_proc 的数据类型为 sysname，没有默认设置。

[@autogen =] 'autogen'

指定是否自动生成存储过程。autogen 的数据类型为 nvarchar(5)，默认设置为 TRUE。

[@upd_trig =] 'update_trigger'

仅限内部使用。

返回代码值

0（成功）或 1（失败）

注释

sp_articlesynctranprocs 用于快照复制和事务复制。

权限

只有 sysadmin 固定服务器角色成员或 db_owner 固定数据库角色成员才能执行 sp_articlesynctranprocs。

请参见

系统存储过程


sp_articleview

在垂直或水平筛选表时创建项目的同步对象。该同步对象是一个视图，用作目的表的架构和数据的筛选源。只有未订阅项目才能由此存储过程修改。此存储过程在发布服务器的发布数据库上执行。

语法

sp_articleview [ @publication = ] 'publication'
, [ @article = ] 'article'
[ , [ @view_name = ] 'view_name']
[ , [ @filter_clause = ] 'filter_clause']
[ , [ @change_active = ] change_active ]
[ , [ @force_invalidate_snapshot = ] force_invalidate_snapshot ]
[ , [ @force_reinit_subscription = ] force_reinit_subscription ]

参数

[@publication =] 'publication'

是包含该项目的发布名。publication 的数据类型为 sysname，没有默认设置。

[@article = ] 'article'

是项目名。article 的数据类型为 sysname，没有默认设置。

[@view_name =] 'view_name'

是同步对象名。view_name 是 nvarchar(386) 类型，默认设置为 NULL。

[@filter_clause =] 'filter_clause'

是定义水平筛选的 (WHERE) 限制子句。当输入限制子句时，省略 WHERE 关键字。filter_clause 的数据类型为 ntext，默认设置为 NULL。

[@change_active = ] change_active

允许修改包含订阅的发布中的列。change_active 的数据类型为 int，默认设置为 0。如果是 0，则表示将不更改列。如果是 1，则表示可以在有订阅的活动项目上创建或重新创建视图。

[@force_invalidate_snapshot = ] force_invalidate_snapshot

确认此存储过程采取的操作可能使现有快照无效。force_invalidate_snapshot 的数据类型为 bit，默认设置为 0。0 指定对项目的更改不会导致快照无效。如果存储过程检测到更改确实需要新快照，则会发生错误，且不会进行任何更改。而 1 指定对项目所做的更改可能导致快照无效，而且如果现有订阅需要新的快照，则提供适当的权限，使现有快照被标记为废弃并生成新快照。

[@force_reinit_subscription = ] force_reinit_subscription

确认此存储过程采取的操作可能要求重新初始化现有的订阅。force_reinit_subscription 的数据类型为 bit，默认设置为 0。0 指定对项目的更改不会导致重新初始化订阅。如果存储过程检测到更改需要重新初始化订阅，则会发生错误，且不会进行任何更改。而 1 指定对项目的更改将导致重新初始化现有的订阅，且提供使订阅重新初始化发生的权限。

返回代码值

0（成功）或 1（失败）

注释

sp_articleview 创建视图并在 sysarticles 表的 sync_objid 列中插入同步对象（视图）的 ID，并且在 filter_clause 列中插入同步对象（视图）的 ID。如果所有列均已复制并且没有 filter_clause，则 sysarticles 表中的 sync_objid 设置为基表的 ID，并且无需使用 sp_articleview。

若要发布垂直筛选表（即筛选列），请首先不使用 sync_object 参数运行 sp_addarticle，为要复制的每一列都运行一次 sp_articlecolumn（定义垂直筛选），然后运行 sp_articleview 创建同步对象。

若要发布水平筛选表（即筛选行），请不使用 filter 参数运行 sp_addarticle。接着运行 sp_articlefilter，并提供包括 filter_clause 在内的全部参数。然后运行 sp_articleview，并提供包括相同的 filter_clause 在内的全部参数。

若要发布垂直筛选和水平筛选的表，请不带 sync_object 或 filter 参数运行 sp_addarticle。对要复制的每列运行一次 sp_articlecolumn，然后运行 sp_articlefilter 和 sp_articleview。

如果项目已经有同步对象（视图），则 sp_articleview 除去现有视图并自动创建新视图。如果视图是手动创建的（sysarticles 中的type 是 5），则不除去现有的视图。

如果手工地创建自定义筛选存储过程和同步对象，则不运行 sp_articleview。相反，将它们作为 filter 和 sync_object 参数，与适当的 type 值一起提供给 sp_addarticle。

权限

只有 sysadmin 固定服务器角色成员或 db_owner 固定数据库角色成员才能执行 sp_articleview。

请参见

sp_addarticle

sp_articlecolumn

sp_articlefilter

系统存储过程


sp_attachsubscription

将现有的订阅数据库附加到任何订阅服务器。此存储过程在新订阅服务器的主数据库上执行。

语法

sp_attachsubscription [ @dbname = ] 'dbname'
, [ @filename = ] 'filename'
[ , [ @subscriber_security_mode = ] 'subscriber_security_mode' ]
[ , [ @subscriber_login = ] 'subscriber_login' ]
[ , [ @subscriber_password = ] 'subscriber_password' ]

参数

[@dbname =] 'dbname'

是用名称指定现有数据库的字符串。dbname 的数据类型为 sysname，没有默认设置。

[@filename = ] 'filename'

是主 MDF（master 数据文件）的名称和物理位置。filename 的数据类型为 nvarchar(260)，没有默认设置。

[@subscriber_security_mode =] 'subscriber_security_mode'

是在同步时用于连接到订阅服务器的订阅服务器的安全模式。subscriber_security_mode 的数据类型为 int，默认设置为 NULL。如果是 0，则表示安全模式为 SQL Server 身份验证。如果是 1，则表示安全模式为 Windows 身份验证。

[@subscriber_login =] 'subscriber_login'

是在同步时用于连接到订阅服务器的订阅服务器的登录名。subscriber_login 的数据类型为 sysname，默认设置为 NULL。如果 subscriber_security_mode 是 0，则必须指定此参数。

[@subscriber_password =] 'subscriber_password'

是订阅服务器的密码。subscriber_password 的数据类型为 sysname，默认设置为 NULL。如果 SubscriberSecurityMode 是 0，则必须指定此参数。如果使用订阅服务器密码，则将自动加密该密码。

返回代码值

0（成功）或 1（失败）

注释

sp_attachsubscription 用于快照复制、事务复制和合并复制。

如果发布的发布保持期已满，则不能将订阅附加到发布中。如果指定一个保持期已满的订阅，则当附加该订阅或先对其进行同步处理时将发生错误。将忽略发布保持期为 0（永远不过期）的发布。

权限

只有 sysadmin 固定服务器角色成员或 db_owner 固定数据库角色成员才能执行 sp_attachsubscription。

请参见

可连接的订阅数据库

系统存储过程


sp_browsemergesnapshotfolder

返回为合并复制生成的最新快照的完整路径。此存储过程在发布服务器的发布数据库上执行。

语法

sp_browsesnapshotfolder [@publication = ] 'publication'

参数

[@publication =] 'publication'

是发布名。publication 的数据类型为 sysname，没有默认设置。

结果集
列名 | 数据类型 | 描述
snapshot_folder | nvarchar(2000) | 快照目录的完整路径。

注释

sp_browsemergesnapshotfolder 用于合并复制。

如果发布被设置为在发布服务器工作目录和发布服务器快照文件夹中都生成快照文件，则结果集将包含两行：第一行包含发布快照文件夹，而第二行包含发布服务器工作目录。

sp_browsemergesnapshotfolder 对确定生成合并快照文件的目录很有用。然后可以将此文件夹/路径及其内容复制到可移动媒体中，并使用快照从备用快照位置同步订阅。

权限

public 角色成员可以执行 sp_browsesnapshotfolder。

请参见

浏览快照

系统存储过程


sp_browsereplcmds

以存储在分发数据库中的复制命令的可读格式返回结果集。此存储过程在分发服务器的分发数据库上执行。

语法

sp_browsereplcmds [ [ @xact_seqno_start = ] 'xact_seqno_start' ]
[ , [ @xact_seqno_end = ] 'xact_seqno_end' ]
[ , [ @originator_id = ] 'originator_id' ]
[ , [ @publisher_database_id = ] 'publisher_database_id' ]
[ , [ @article_id = ] 'article_id' ]
[ , [ @command_id = ] command_id ]
[ , [ @results_table = ] 'results_table' ]

参数

[@xact_seqno_start =] 'xact_seqno_start'

指定要返回的最小值精确序号。xact_seqno_start 的数据类型为 nchar(22)，默认设置为 0x00000000000000000000。

[@xact_seqno_end =] 'xact_seqno_end'

指定返回最精确序号。xact_seqno_end 的数据类型为 nchar(22)，默认设置为 0xFFFFFFFFFFFFFFFFFFFF。

[@originator_id =] 'originator_id'

指定是否返回带有指定的 originator_id are 的命令。originator_id 的数据类型为 int，默认设置为 NULL。

[@publisher_database_id =] 'publisher_database_id'

指定是否返回带有指定的 publisher_database_id 的命令。publisher_database_id 的数据类型为 int，默认设置为 NULL。

[@article_id =] 'article_id'

指定是否返回带有指定的 article_id 的命令。article_id 的数据类型为 int，默认设置为 NULL。

[@command_id =] command_id

是要被解码的命令在 MSrepl_commands 中的位置。command_id 的数据类型为 int，默认设置为 NULL。如果指定了该参数，则也必须指定所有其它参数，而且 xact_seqno_start 必须与 xact_seqno_end 相同。

[@results_table = ] 'results_table'

指定将用此名称创建一个表，并且应该将结果集保存到此表而不是将其返回到客户端。results_table 的数据类型为 sysname，默认设置为 NULL。然后，此表可用于其它查询，如以不同顺序对结果集进行排序或进一步操作结果集。

结果集

sp_browsereplcmds 是一个诊断实用工具，用于检查存储在分发数据库中的复制命令。sp_browsereplcmds 返回下列结果集。

列名 | 数据类型 | 描述
xact_seqno | varbinary(16) | 命令的序列号。
originator_id | int | 命令创建人的 ID。
publisher_database_id | int | 发布服务器数据库的 ID。
article_id | int | 项目的 ID。
type | int | 命令的类型。
command | nvarchar(1024) | Transact-SQL 命令。

在结果集中，长命令可以拆分在几行上。

注释

sp_browsereplcmds 用于事务复制。

权限

只有 sysadmin 固定服务器角色成员才能执行 sp_browsereplcmds。

请参见

sp_dumpparamcmd

sp_replcmds

sp_replshowcmds

系统存储过程


sp_browsesnapshotfolder

返回为发布生成的最新快照的完整路径。此存储过程在发布服务器的发布数据库上执行。

语法

sp_browsesnapshotfolder [@publication = ] 'publication'
{ [ , [ @subscriber = ] 'subscriber' ]
[ , [ @subscriber_db = ] 'subscriber_db' ] }

参数

[@publication =] 'publication'

是包含该项目的发布名。publication 的数据类型为 sysname，没有默认设置。

[@subscriber =] 'subscriber'

是订阅服务器名。subscriber 的数据类型为 sysname，默认设置为 NULL。

[@subscriber_db=] 'subscriber_db'

是订阅数据库名称。subscriber_db 的数据类型为 sysname，默认设置为 NULL。

结果集
列名 | 数据类型 | 描述
snapshot_folder | nvarchar(512) | 快照目录的完整路径。

注释

sp_browsesnapshotfolder 用于快照复制和事务复制。

如果将 subscriber 和 subscriber_db 字段保留为 NULL，则此存储过程将返回它可以为发布找到的最新快照的快照文件夹。如果指定了 subscriber 和 subscriber_db 字段，则此存储过程将返回指定订阅的快照文件夹。如果没有为发布生成快照，则将返回空结果集。

如果发布被设置为在发布服务器工作目录和发布服务器快照文件夹中都生成快照文件，则结果集将包含两行：第一行包含发布快照文件夹，第二行包含发布服务器工作目录。sp_browsesnapshotfolder 对确定生成快照文件的目录很有用。

权限

public 角色成员可以执行 sp_browsesnapshotfolder。

请参见

浏览快照

系统存储过程


sp_change_agent_parameter

更改存储在 MSagent_parameters 中的复制代理程序配置参数。此存储过程在运行代理程序的分发服务器的任何数据库上执行。

语法

sp_change_agent_parameter [ @profile_id = ] profile_id
, [ @parameter_name = ] 'parameter_name'
, [ @parameter_value = ] 'parameter_value'

参数

[@profile_id =] profile_id,

是配置 ID。profile_id 的数据类型为 int，没有默认设置。

[@parameter_name =] 'parameter_name'

是参数名。parameter_name 的数据类型为 sysname，没有默认设置。对于系统配置文件，可更改的参数取决于代理程序的类型。若要查找 profile_id 所代表的代理程序类型，请在 Msagent_profiles 表中查找 profile_id，并注意 agent_type 字段值。对于快照代理程序（它的 agent_type 字段值为 1），下列属性可以更改：

  • bcpbatchsize

  • historyverboselevel

  • logintimeout

  • maxbcpthreads

  • querytimeout

    对于日志读取器代理程序（它的 agent_type 字段值为 2），下列属性可以更改：

  • historyverboselevel

  • logintimeout

  • pollinginterval

  • querytimeout

  • readbatchsize

  • readbatchthreshold

    对于分发代理程序（它的 agent_type 字段值为 3），下列属性可以更改：

  • bcpbatchsize

  • commitbatchsize

  • commitbatchthreshold

  • historyverboselevel

  • logintimeout

  • maxbcpthreads

  • maxdeliveredtransactions

  • pollinginterval

  • querytimeout

  • transactionsperhistory

  • skiperrors

    对于合并代理程序（它的 agent_type 字段值为 4），下列属性可以更改：

  • pollinginterval

  • validateinterval

  • logintimeout

  • querytimeout

  • maxuploadchanges

  • maxdownloadchanges

  • uploadgenerationsperbatch

  • downloadgenerationsperbatch

  • uploadreadchangesperbatch

  • downloadreadchangesperbatch

  • uploadwritechangesperbatch

  • downloadwritechangesperbatch

  • validate

  • fastrowcount

  • historyverboselevel

  • changesperhistory

  • bcpbatchsize

  • numdeadlockretries

    对于自定义配置文件，可更改的参数取决于已定义的参数。若要查看已定义的参数，请运行 sp_help_agent_profile 查看与 profile_id 相关联的 profile_name。然后对于适当的 profile_id，运行 sp_help_agent_parameters 以查看与配置文件相关联的参数。

[@parameter_value =] 'parameter_value'

是参数的新值。parameter_value 的数据类型为 nvarchar(255)，没有默认设置。

返回代码值

0（成功）或 1（失败）

注释

sp_change_agent_parameter 用于所有类型的复制。

权限

只有 sysadmin 固定服务器角色成员才能执行 sp_change_agent_parameter。

请参见

分发代理程序配置

日志读取器代理程序配置

合并代理程序配置

快照代理程序配置

sp_add_agent_parameter

sp_drop_agent_parameter

sp_help_agent_parameter

系统存储过程


sp_change_agent_profile

更改存储在 MSagent_profiles 中的复制代理程序配置参数。此存储过程在分发服务器的任何数据库上执行。

语法

sp_change_agent_profile [ @profile_id = ] profile_id
, [ @property = ] 'property'
, [ @value = ] 'value'

参数

[@profile_id = ] profile_id

是配置 ID。profile_id 的数据类型为 int，没有默认设置。

[@property =] 'property'

是属性名。property 的数据类型为 sysname，没有默认设置。

[@value =] 'value'

是属性的新值。value 的数据类型为 nvarchar(3000)，没有默认设置。

返回代码值

0（成功）或 1（失败）

注释

sp_change_agent_profile 用于所有类型的复制。

权限

只有 sysadmin 固定服务器角色成员才能执行 sp_change_agent_profile。

请参见

sp_add_agent_profile

sp_drop_agent_profile

sp_help_agent_profile

系统存储过程


sp_change_subscription_properties

更新 MSsubscription_properties 表中的安全信息。此存储过程在发布服务器的发布数据库上执行。

语法

sp_change_subscription_properties [ @publisher = ] 'publisher'
, [ @publisher_db = ] 'publisher_db'
, [ @publication = ] 'publication '
, [ @property = ] 'property'
, [ @value = ] 'value'
 [ , [ @publication_type = ] publication_type ]

参数

[@publisher =] 'publisher'

是发布服务器名。publisher 的数据类型为 sysname，没有默认设置。

[@publisher_db =] 'publisher_db'

是发布服务器数据库名。publisher_db 的数据类型为 sysname，没有默认设置。

[@publication =] 'publication'

是发布名。publication 的数据类型为 sysname，没有默认设置。

[@property =] 'property'

是要更改的属性。property 的数据类型为 sysname，可以是下列值之一。

值 | 描述
publisher_login | 发布服务器登录。
publisher_password | 发布服务器密码。
publisher_security_mode | 在发布服务器上实现的安全模式。可以是： 0 = SQL Server 身份验证 1 = Windows 身份验证
distributor_login | 分发服务器登录。
distributor_password | 分发服务器密码。
distributor_security_mode | 在分发服务器上实现的安全模式：可以是： 0 = SQL Server 身份验证 1 = Windows 身份验证
encrypted_distributor_password | 仅限内部使用。
ftp_address | 仅为保持向后兼容性。
ftp_port | 仅为保持向后兼容性。
ftp_login | 仅为保持向后兼容性。
ftp_password | 仅为保持向后兼容性。
alt_snapshot_folder | 指定快照的备用文件夹位置。alternate_snapshot_folder 的数据类型为 nvarchar(255)。如果为 NULL，则将从发布服务器指定的默认位置获取快照文件。
working_directory | 在通过 FTP 传输快照文件时用于临时存储发布的数据和架构文件的工作目录名。working_directory 的数据类型为 nvarchar(255)。
use_ftp | 指定使用 FTP 而不使用常规协议检索快照。如果为 1，则使用 FTP。use_ftp是一个 bit类型的字段。
ofload_agent | 指定是否可以远程地激活代理程序。如果为 0，则不能远程地激活代理程序。offload_agent 是一个 bit 类型的字段。
offload_server | 指定用于远程激活的服务器所在的网络名称。
dts_package_name | 指定 DTS 包的名称。只有当发布为事务发布或快照发布时才能指定该值。
dts_package_password | 指定如果有密码，则密码在包上。NULL 值表示包没有密码。只有当发布为事务发布或快照发布时才能指定该值。
dts_package_location | DTS 包存储的位置。只有当发布为事务发布或快照发布时才能指定该值。
dynamic_snapshot_location | 指定保存快照文件的文件夹的路径。只有当发布为合并发布时才能指定该值。

[@value =] 'value'

是属性的新值。value 的数据类型为 nvarchar(1000)，没有默认设置。

[@publication_type = ] publication_type

指定发布的复制类型。publication_type 的数据类型为 int，默认设置为 NULL。如果为 NULL，表示未知的发布类型和存储过程在所有事务表中查找此发布类型。因为存储过程必须查看多个表，所以此选项比指定精确发布类型 0、1 或 2 时要慢。如果是 0，则发布是事务类型。如果是 1，则表示发布是快照类型。如果是 2，则表示发布是合并类型。

返回代码值

0（成功）或 1（失败）

注释

sp_change_subscription_properties 用于所有类型的复制。

权限

只有 sysadmin 固定服务器角色成员或 db_owner 固定数据库角色成员才能执行 sp_change_subscription_properties。

请参见

系统存储过程


sp_changearticle

更改事务或快照发布中的项目属性。此存储过程在发布服务器的发布数据库上执行。

语法

sp_changearticle [ [@publication = ] 'publication' ]
[ , [ @article = ] 'article' ]
[ , [ @property = ] 'property' ]
[ , [ @value = ] 'value' ]
[ , [ @force_invalidate_snapshot = ] force_invalidate_snapshot ]
[ , [ @force_reinit_subscription = ] force_reinit_subscription ]

参数

[@publication =] 'publication'

是包含该项目的发布名。publication 的数据类型为 sysname，默认设置为 NULL。

[@article =] 'article'

是要更改其属性的项目名。article 的数据类型为 sysname，默认设置为 NULL。

[@property =] 'property'

是要更改的项目属性。property 的数据类型为 nvarchar(20)。

[@value =] 'value'

是项目属性的新值。value 的数据类型为 nvarchar(255)。

下表描述项目的属性和这些属性的值。

属性 | 值 | 描述
description |  | 发布作业的新描述项。
sync_object |  | 用于生成同步输出文件的表或视图的名称。默认设置为 NULL。
type | logbased（默认值）= 基于日志的项目。 Logbased manualfilter = 带手工筛选的基于日志的项目。 Logbased manualview = 带手工视图的基于日志的项目。 Logbased manualboth = 带手工筛选和手工视图的基于日志的项目。 | 项目类型。
ins_cmd |  | 要执行的 INSERT 语句，否则从日志构造。
del_cmd |  | 要执行的 DELETE 语句，否则从日志构造。
upd_cmd |  | 要执行的 UPDATE 语句，否则从日志构造。
filter |  | 要用于筛选表（水平筛选）的新存储过程。默认设置为 NULL。
dest_table |  | 新目的表。
dest_object |  | 为向后兼容性而提供。使用 dest_table。
creation_script |  | 用于创建目标表的项目架构脚本的路径和名称。默认设置为 NULL。
pre_creation_cmd |  | 可以在应用同步之前除去、删除或截断目的表的预创建命令。
 | none | 不使用命令。
 | drop | 除去目的表。
 | delete | 删除目的表。
 | truncate | 截断目的表。
status |  | 指定属性的新状态。
 | include column names | 在复制 INSERT 语句中允许有列名。
 | no column names | 在复制 INSERT 语句中不允许有列名。
 | owner qualified | 允许使用所有者限定的表名。
 | not owner qualified | 允许使用不是所有者限定的表名。
 | string literals | parameters | 指定日志读取器生成的命令是使用标准字符串文字命令格式还是新参数化命令格式。
schema_option |  | 指定给定项目的架构生成选项位图。schema_option 的数据类型为 binary(8)。如果该值是 NULL，则系统将为该项目自动生成有效架构选项。"注释"中给出的表显示基于项目类型和复制类型的组合而选择的值。另外，并非所有的 schema_option 值对每个复制类型和项目类型都有效。"注释"中给出的"有效架构选项"表显示可基于项目类型和复制类型的组合进行选择的有效架构选项。
 | 0x00 | 禁用由初始同步提供的脚本并使用提供的创建脚本。
 | 0x01 | 生成对象创建（CREATE TABLE、CREATE PROCEDURE 等）。
 | 0x10 | 生成对应的聚集索引。
 | 0x20 | 将用户定义数据类型转换为基本数据类型。
 | 0x40 | 生成对应的非聚集索引。
 | 0x80 | 在主键上包含声明引用完整性。
 | 0x100 | 如果已定义，则复制表项目上的用户触发器。
 | 0x200 | 复制外键约束。如果引用的表不是发布的一部分，则将不复制已发布表上的所有外键约束。
 | 0x400 | 复制检查约束。
 | 0x800 | 复制默认值。
 | 0x1000 | 复制列级排序规则。
 | 0x2000 | 复制与已发布项目源对象关联的扩展的属性。
 | 0x4000 | 如果在表项目上定义了唯一键，则复制唯一键。
 | 0x8000 | 使用 ALTER TABLE 语句将表项目上的主键和唯一键作为约束复制。
destination_owner | destination_owner | 目的对象所有者的名称。
NULL | NULL |

[@force_invalidate_snapshot = ] force_invalidate_snapshot

确认此存储过程采取的操作可能使现有快照无效。force_invalidate_snapshot 的数据类型为 bit，默认设置为 0。0 指定对项目的更改不会导致快照无效。如果存储过程检测到更改确实需要新快照，则会发生错误，且不会进行任何更改。而 1 指定对项目所做的更改可能导致快照无效，而且如果现有订阅需要新的快照，则提供适当的权限，使现有快照被标记为废弃并生成新快照。

[@force_reinit_subscription = ] force_reinit_subscription

确认此存储过程采取的操作可能要求重新初始化现有的订阅。force_reinit_subscription 的数据类型为 bit，默认设置为 0。0 指定对项目的更改不会导致重新初始化订阅。如果存储过程检测到更改需要重新初始化订阅，则会发生错误，且不会进行任何更改。而 1 指定对项目的更改将导致重新初始化现有的订阅，且提供使订阅重新初始化发生的权限。

返回代码值

0（成功）或 1（失败）

注释

sp_changearticle 用于快照复制和事务复制。

在现有发布内，不必除去然后重新创建整个发布，就可以使用 sp_changearticle 更改某个项目。

该表描述如果用户传递的是 NULL 值，则为存储过程选择的 @schema_option 默认值。默认值基于表的第一行中显示的复制类型和第一列中显示的项目类型。空单元表示无效的项目类型和复制类型对，因而没有默认值。

项目类型 | 复制类型
 | 事务复制 | 快照复制
logbased | 0xF3 | 0x71
logbased manualfilter | 0xF3 | 0x71
logbased manualview | 0xF3 | 0x71
indexed view logbased | 0xF3 | 0x71
indexed view logbased manualfilter | 0xF3 | 0x71
indexed view logbased manualview | 0xF3 | 0x71
indexed view logbase manualboth | 0xF3 | 0x71
proc exec | 0x01 | 0x01
serialized proc exec | 0x01 | 0x01
proc schema only | 0x01 | 0x01
view schema only | 0x01 | 0x01
func schema only | 0x01 | 0x01
indexed view schema only | 0x01 | 0x01
table |  |

说明 如果为排队更新启用了发布，则 @schema_option 值 0x8000 和 0x0080 将被添加到下表所显示的默认值中。

有效架构选项表

项目类型 | 复制类型
 | 事务复制 | 快照复制
logbased | 所有选项 | 除 0x02 之外的所有选项
logbased manualfilter | 所有选项 | 除 0x02 之外的所有选项
logbased manualview | 所有选项 | 除 0x02 之外的所有选项
indexed view logbased | 所有选项 | 除 0x02 之外的所有选项
indexed view logbased manualfilter | 所有选项 | 除 0x02 之外的所有选项
indexed view logbased manualview | 所有选项 | 除 0x02 之外的所有选项
indexed view logbase manualboth | 所有选项 | 除 0x02 之外的所有选项
proc exec | 0x01 和 0x2000 | 0x01 和 0x2000
serialized proc exec | 0x01 和 0x2000 | 0x01 和 0x2000
proc schema only | 0x01 和 0x2000 | 0x01 和 0x2000
view schema only | 0x01、0x0100 和 0x2000 | 0x01、0x0100 和 0x2000
func schema only | 0x01 和 0x2000 | 0x01 和 0x2000
indexed view schema only | 0x01、0x10、0x040、0x0100 和 0x2000 | 0x01、0x10、0x040、0x0100 和 0x2000
table |  |

说明 对于排队更新发布，必须启用 @schema_option 值 0x8000 和 0x80。

权限

只有 sysadmin 固定服务器角色成员或 db_owner 固定数据库角色成员才能执行 sp_changearticle。

请参见

sp_addarticle

sp_addpublication

sp_articlecolumn

sp_changepublication

sp_droparticle

sp_droppublication

sp_enumfullsubscribers

sp_helparticle

sp_helparticlecolumns

sp_helppublication

系统存储过程


sp_changedistpublisher

更改分发发布者的属性。此存储过程在分发服务器的任何数据库上执行。

语法

sp_changedistpublisher [ @publisher = ] 'publisher'
[ , [ @property = ] 'property' ]
[ , [ @value = ] 'value' ]

参数

[@publisher =] 'publisher'

是发布服务器名。publisher 的数据类型为 sysname，没有默认设置。

[@property =] 'property'

是要更改的给定发布服务器属性。property 的数据类型为 sysname，可以是下列值之一。

值 | 描述
active | 活动状态值。
distribution_db | 分发数据库状态值。
login | 登录状态值。
password | 密码状态值。
security_mode | 安全模式状态值。
working_directory | 工作目录状态值。
NULL（默认值） | 输出所有可用的 property 选项。

[@value =] 'value'

是给定属性的值。value 的数据类型为 nvarchar(255)，默认设置为 NULL。

返回代码值

0（成功）或 1（失败）

注释

sp_changedistpublisher 用于所有类型的复制。

权限

只有 sysadmin 固定服务器角色成员才能执行 sp_changedistpublisher。

请参见

sp_adddistpublisher

sp_dropdistpublisher

sp_helpdistpublisher

系统存储过程


sp_changedistributiondb

更改分发数据库的属性。此存储过程在分发服务器的分发数据库上执行。

语法

sp_changedistributiondb [ @database = ] 'database'
[ , [ @property = ] 'property' ]
[ , [ @value = ] 'value' ]

参数

[@database =] 'database'

是数据库名。database 的数据类型为 sysname，没有默认设置。

[@property =] 'property'

是要更改的给定数据库属性。property 的数据类型为 sysname，可以是下列值之一。

值 | 描述
history_retention | 历史记录表保持期。
max_distretention | 最大分发保持期。该值必须大于或等于分发数据库中的所有事务发布的保持期。
min_distretention | 最小分发保持期。
NULL（默认值） | 输出所有可用的 property 值。

[@value =] 'value'

是指定属性的新值。value 的数据类型为 nvarchar(255)，默认设置为 NULL。

返回代码值

0（成功）或 1（失败）

注释

sp_changedistributiondb 用于所有类型的复制。

权限

只有 sysadmin 固定服务器角色成员才能执行 sp_changedistributiondb。

请参见

sp_adddistributiondb

sp_dropdistributiondb

sp_helpdistributiondb

系统存储过程


sp_changedistributor_password

更改分发服务器的密码。此存储过程在发布服务器的分发数据库上执行。

语法

sp_changedistributor_password [ @password = ] 'password'

参数

[@password = ] 'password'

是新密码。password 的数据类型为 sysname，没有默认设置。如果分发服务器是本地服务器，则更改 distributor_admin 系统登录的密码。

返回代码值

0（成功）或 1（失败）

注释

sp_changedistributor_password 用于所有类型的复制。

权限

只有 sysadmin 固定服务器角色成员才能执行 sp_changedistributor_password。

请参见

系统存储过程


sp_changedistributor_property

更改分发服务器的属性。此存储过程在分发服务器的分发数据库上执行。

语法

sp_changedistributor_property [ [ @property = ] 'property' ]
[ , [ @value = ] 'value' ]

参数

[@property =] 'property'

是给定分发服务器的属性。property 的数据类型为 sysname，可以是下列值之一。

值 | 描述
heartbeat_interval | 在不记录进度消息的情况下代理程序可以运行的最大分钟数。
NULL（默认值） | 输出所有可用的 property 值。

[@value =] 'value'

是给定分发服务器属性的值。value 的数据类型为 varchar(255)，默认设置为 NULL。

返回代码值

0（成功）或 1（失败）

注释

sp_changedistributor_property 用于所有类型的复制。

权限

只有 sysadmin 固定服务器角色成员才能执行 sp_changedistributor_property。

请参见

sp_adddistributor

sp_dropdistributor

sp_helpdistributor

系统存储过程


sp_changemergearticle

更改合并项目的属性。此存储过程在发布服务器的发布数据库上执行。

语法

sp_changemergearticle [ @publication = ] 'publication'
, [ @article = ] 'article'
[ , [ @property = ] 'property' ]
[ , [ @value = ] 'value' ]
[ , [ @force_invalidate_snapshot = ] force_invalidate_snapshot ]
[ , [ @force_reinit_subscription = ] force_reinit_subscription ]

参数

[@publication =] 'publication'

是包含该项目的发布名。publication 的数据类型为 sysname，没有默认设置。

[@article =] 'article'

是要更改的项目名。article 的数据类型为 sysname，没有默认设置。

[@property =] 'property'

是要为给定项目和发布更改的属性。property 的数据类型为 nvarchar(30)，可以是表中所列值之一。

[@value =] 'value'

是用于指定的属性的新值。value 的数据类型为 nvarchar(1000)，可以是下表中所列值之一。

下表描述项目的属性和这些属性的值。

属性 | 值 | 描述
description |  | 项目的描述项。
pre_creation_command | none：如果表已在订阅服务器上存在，则不采取任何操作。 drop：根据子集筛选中的 WHERE 子句发出删除命令。 delete：重新创建表之前先除去表。 truncate：与 delete 相同，但是删除页而非行。不要使用 WHERE 子句。 | 指定当应用快照时如果表存在于订阅服务器上则系统应采取的操作。
creation_script |  | 用于创建目标表的项目架构脚本的路径和名称。
column_tracking | true 或 false | 列级跟踪的设置。true 打开列级跟踪。而 false 关闭列级跟踪并在行级保留冲突检测。如果表已在其它合并发布中发布，则列级跟踪必须与基于该表的现有项目所使用的值相同。该参数只专用于表项目。
article_resolver |  | 项目的自定义冲突解决程序。
resolver_info |  | 用作自定义冲突解决程序的存储过程名。
status | active 或 unsynced，或 | 项目状态。如果是 active，则表示发布表的初始处理脚本已运行。如果是 unsynced，则表示发布表的初始处理脚本在下一次运行快照代理程序时运行。
subset_filterclause |  | 用于指定水平筛选的 WHERE 子句。
schema_option | 0x00：禁止快照代理程序编写脚本，并使用 creation_script 中提供的脚本。 0x01：生成对象创建（CREATE TABLE、CREATE PROCEDURE 等）。 0x10：生成对应的聚集索引。 0x20：将用户定义数据类型转换为基本数据类型。 0x40：生成对应的非聚集索引。 0x80：在主键上包含声明引用完整性。 0x100：如果已定义，则复制表项目上的用户触发器。 0x200：复制外键约束。如果引用的表不是发布的一部分，则将不复制已发布表上的所有外键约束。 0x400：复制检查约束。 0x800：复制默认值。 0x1000：复制列级排序规则。 0x2000：复制与已发布项目源对象关联的扩展的属性。 0x4000：如果在表项目上定义，则复制唯一键。 0x8000：使用 ALTER TABLE 语句将表项目上的主键和唯一键作为约束复制。 | 给定项目的架构生成选项位图。如果该值是 NULL，则系统将为该项目自动生成有效架构选项。"注释"中给出的表显示基于项目类型和复制类型的组合而选择的值。另外，并非所有的 @schema_option 值对每个复制类型和项目类型都有效。"注释"中给出的"有效架构选项"表显示可基于项目类型和复制类型的组合进行选择的有效架构选项。
destination_owner |  | 订阅数据库中的对象所有者名称（如果不是'dbo'）。
destination_object |  | 目的对象的新名称，'' 或 NULL。如果是 NULL 或 ''，则将重置该值，使之等同于项目的 source_object 属性中的当前值。 仅对于合并存储过程、视图和 UDF 架构项目有效。修改合并表项目的 destination_object 将导致错误。
pub_identity_range |  | 如果项目将 auto_identity_range 设置为 true，则在发布服务器上的范围大小。仅应用于表项目。
identity_range |  | 如果项目将 auto_identity_range 设置为 true，则为在订阅服务器上的范围大小。仅应用于表项目。
threshold |  | 控制合并代理程序何时指派新标识范围的百分比值。如果使用了在阈值中指定的百分比值，合并代理程序将创建新的标识范围。当 auto_identity_range 设置为 true时，使用该属性。仅应用于表项目。
verify_resolver_signature | 0 或 1 | 指定在合并复制中使用冲突解决程序之前是否验证数字签名的 bit 值。值 0 指定不验证签名。值 1 指定将验证签名以查看签名是否来自信任源。
allow_interactive_resolver | true 或 false | 在项目上启用或禁用交互式冲突解决程序的 bit 值。true 值启用在项目上使用交互式冲突解决程序；而 false 值禁用在项目上使用交互式冲突解决程序。
check_permissions | 0x00 值指定不会检查权限。 0x10 值指定在可上载 INSERT（已在订阅服务器上生成）之前，将在发布服务器上检查权限。 0x20 值指定上载 UPDATE（已在订阅服务器上生成）之前，将在发布服务器上检查权限。 0x40 值指定上载 DELETE（已在订阅服务器上生成）之前，将在发布服务器上检查权限。 | 当合并代理程序将更改应用于发布服务器时将验证表级权限的位图。如果合并进程所使用的发布服务器登录/用户帐户没有正确的表权限，则将无效更改记录为冲突。check_permissions 的数据类型为 int。
NULL（默认值） |  |

[@force_invalidate_snapshot = ] force_invalidate_snapshot

确认此存储过程采取的操作可能使现有快照无效。force_invalidate_snapshot 的数据类型为 bit，默认设置为 0。0 指定对项目的更改不会导致快照无效。如果存储过程检测到更改确实需要新快照，则会发生错误，且不会进行任何更改。而 1 指定对项目所做的更改可能导致快照无效，而且如果现有订阅需要新的快照，则提供适当的权限，使现有快照被标记为废弃并生成新快照。

[@force_reinit_subscription = ] force_reinit_subscription

确认此存储过程采取的操作可能要求现有的订阅重新初始化。force_reinit_subscription 的数据类型为 bit，默认设置为 0。0 指定对合并项目的更改不会导致订阅重新初始化。如果存储过程检测到更改需要重新初始化订阅，则会发生错误，且不会进行任何更改。而 1 指定对合并项目的更改将导致现有的订阅重新初始化，并提供使订阅重新初始化发生的权限。

返回代码值

0（成功）或 1（失败）

注释

sp_changemergearticle 用于合并复制。

该表描述如果用户传递的是 NULL 值，则为存储过程选择的 @schema_option 默认值。默认值基于表的第一行中显示的复制类型和第一列中显示的项目类型。空单元表示无效的项目类型和复制类型组合，因而没有默认值。

项目类型 | 复制类型
 | 合并
logbased |
logbased manualfilter |
logbased manualview |
indexed view logbased |
indexed view logbased manualfilter |
indexed view logbased manualview |
indexed view logbase manualboth |
proc exec |
serialized proc exec |
proc schema only | 0x01
view schema only | 0x01
func schema only | 0x01
indexed view schema only | 0x01
table | 0xCFF1

有效架构选项表

项目类型 | 复制类型
 | 合并
logbased |
logbased manualfilter |
logbased manualview |
indexed view logbased |
indexed view logbased manualfilter |
indexed view logbased manualview |
indexed view logbase manualboth |
proc exec | 0x01 和 0x2000
serialized proc exec | 0x01 和 0x2000
proc schema only | 0x01 和 0x2000
view schema only | 0x01、0x0100 和 0x2000
func schema only | 0x01 和 0x2000
indexed view schema only | 0x01、0x10、0x040、0x0100 和 0x2000
table | 除 0x02 和 0x8000 外的所有选项

权限

只有 sysadmin 固定服务器角色成员或 db_owner 固定数据库角色成员才能执行 sp_changemergearticle。

请参见

sp_addmergearticle

sp_dropmergearticle

sp_helpmergearticle

系统存储过程


sp_changemergefilter

更改某些合并筛选属性。可更改的合并筛选属性包括 filtername 和 join_filterclause。此存储过程在发布服务器的发布数据库上执行。

语法

sp_changemergefilter [ @publication = ] 'publication'
, [ @article = ] 'article'
, [ @filtername = ] 'filtername'
, [ @property = ] 'property'
, [ @value = ] 'value'
 [ , [ @force_invalidate_snapshot = ] force_invalidate_snapshot ]
[ , [ @force_reinit_subscription = ] force_reinit_subscription ]

参数

[@publication =] 'publication'

是发布名。publication 的数据类型为 sysname，没有默认设置。

[@article = ]'article'

是项目名。article 的数据类型为 sysname，没有默认设置。

[@filtername = ] 'filtername'

是筛选的当前名称。filtername 的数据类型为 sysname，没有默认设置。

[@property =] 'property'

是要更改的属性名。property 的数据类型为 sysname，没有默认设置，可以是下列值之一。

值 | 描述
filtername | 筛选名。
join_filterclause | 筛选子句。
join_articlename | 联接项目名。

[@value =] 'value'

是指定属性的新值。value 的数据类型为 nvarchar(2000)，没有默认设置。

[@force_invalidate_snapshot = ] force_invalidate_snapshot

确认此存储过程采取的操作可能会使现有的快照无效。force_invalidate_snapshot 的数据类型为 bit，默认设置为 0。0 指定对合并项目的更改将不会导致快照无效。如果存储过程检测到更改确实需要新快照，则会发生错误，且不会进行任何更改。而 1 指定对合并项目的更改可能导致快照无效，而且如果有需要新快照的现有订阅，则值 1 将提供适当的权限，使现有快照被标记为废弃并生成新快照。

[@force_reinit_subscription = ] force_reinit_subscription

确认此存储过程采取的操作可能要求重新初始化现有的订阅。force_reinit_subscription 的数据类型为 bit，默认设置为 0。0 指定对项目的更改不会导致重新初始化订阅。如果存储过程检测到更改需要重新初始化订阅，则会发生错误，且不会进行任何更改。而 1 指定对项目的更改将导致重新初始化现有的订阅，且提供使订阅重新初始化发生的权限。

返回代码值

0（成功）或 1（失败）

注释

sp_changemergefilter 用于合并复制。

更改合并项目上的筛选需要重做快照（如果存在快照）。为此可将 @force_invalidate_snapshot 设置为 1。而且，如果该项目有订阅，则需要重新初始化订阅。也可以将 @force_reinit_subscription 设置为 1。

权限

只有 sysadmin 固定服务器角色成员或 db_owner 固定数据库角色成员才能执行 sp_changemergefilter。

请参见

sp_addmergefilter

sp_dropmergefilter

sp_helpmergefilter

系统存储过程


sp_changemergepublication

更改合并发布的属性。此存储过程在发布服务器的发布数据库上执行。

语法

sp_changemergepublication [ @publication = ] 'publication'
[ , [ @property = ] 'property' ]
[ , [ @value = ] 'value' ]
[ , [ @force_invalidate_snapshot = ] force_invalidate_snapshot ]
[ , [ @force_reinit_subscription = ] force_reinit_subscription ]

参数

[@publication =] 'publication'

是发布名。publication 的数据类型为 sysname，没有默认设置。

[@property =] 'property'

是要为给定项目更改的属性。property 的数据类型为 sysname，可以是下表所列值之一。

[@value =] 'value'

是用于指定的属性的新值。value 的数据类型为 nvarchar(255)，可以是下表所列值之一。

下表描述可以更改的发布属性和对这些属性值的限制。

属性 | 值 | 描述
description |  | 对发布的描述。
status | active 或 unsynced | 发布状态。
retention |  | 给定发布的更改的保存天数。
sync_mode | native 或 character | 发布的订阅服务器的初始同步模式。如果是 native，则表示生成所有表的本机模式大容量复制程序输出。如果是 character，则表示生成所有表的字符模式大容量复制程序输出。非 SQL Server 订阅服务器要求使用 character 模式。
Allow_push | true 或 false | 给定的发布允许强制订阅。
Allow_pull | true 或 false | 给定的发布允许请求订阅。
allow_anonymous | true 或 false | 给定的发布允许匿名订阅。
enabled_for_internet | true 或 false | 启用发布用于 Internet，并指定是否可以通过 FTP 向订阅服务器传输快照文件。如果是 true，则将发布的同步文件放入 C:\Program Files\Microsoft SQL Server\MSSQL\Repldata\ftp 目录中。
centalized_conflicts | true 或 false | 如果是 true，则将冲突记录存储在给定的发布服务器上。如果是 false，则将冲突记录存储在检测到冲突的服务器上，该服务器既可以是发布服务器也可以是订阅服务器。
snapshot_ready | true 或 false | 可使用用于发布的快照。
snapshot_in_defaultfolder | true 或 false | 指定是否将快照保存在默认文件夹中。如果是 true，则可以在默认文件夹中找到快照文件。如果是 false，则表示快照文件将存储在 alt_snapshot_folder 指定的备用位置中。注意该参数可以为 true，并且在 alt_snapshot_folder 参数中指定有位置。该组合指定将快照文件同时存储在默认位置和备用位置。
alt_snapshot_folder |  | 指定快照的备用文件夹的位置。
pre_snapshot_script |  | 指定指向 .sql 文件位置的指针。pre_snapshot_script 的数据类型为 nvarchar(255)，默认设置为 NULL。在订阅服务器上应用快照时，合并代理程序将在运行任何复制的对象脚本之前运行快照前脚本。
post_snapshot_script |  | 指定指向 .sql 文件位置的指针。分发代理程序或合并代理程序将在所有其它复制的对象脚本和数据已在初始同步过程中应用之后才运行快照后脚本。
compress_snapshot | true 或 false | 指定将写入 @alt_snapshot_folder 位置的快照压缩成 Microsoft® CAB 格式。compress_snapshot 的数据类型为 nvarchar(5)，默认设置为 FALSE。false 指定不压缩快照；而 true 指定将压缩快照。不能压缩默认文件夹中的快照。
ftp_address |  | 是分发服务器的 FTP 服务的网络地址。指定存储发布快照文件的位置。
ftp_port |  | 是分发服务器的 FTP 服务的端口号。指定存储发布快照文件的 FTP 站点的 TCP 端口号。
ftp_subdirectory |  | 指定在发布通过使用 FTP 支持传播快照时创建快照文件的位置。
ftp_login |  | 是连接到 FTP 服务的用户名。
ftp_password |  | 是连接到 FTP 服务的用户密码。
conflict_retention |  | 指定保留冲突的保持期（以天为单位）。
allow_subscription_copy | true 或 false | 启用或禁用复制订阅此发布的订阅数据库的能力。
allow_synctoalternate | true 或 false | 使可选同步伙伴与该发布服务器同步。
validate_subscriber_info |  | 列出正用于检索订阅服务器信息的函数，并验证正由订阅服务器用于验证信息分区是否一致的动态筛选准则。例如，如果 SUSER_SNAME() 用于动态筛选，则该参数应该指定为 @validate_subscriber_info=N'SUSER_SNAME()'。有关更多信息，请参见验证订阅服务器信息。
publish_to_activedirectory |  | 指定是否将发布信息发布到 Microsoft Active Directory™。只有运行 Windows® 2000 操作系统的服务器才能使用该功能。true 值将发布信息添加到 Microsoft Active Directory。
dynamic_filters | true 或 false | 指定是否在动态子句上筛选发布。
max_concurrent_merge |  | 最大并发合并进程数。该属性的 0 值表示对在任何给定时间运行的并发合并进程数没有限制。该属性对可以同时在合并发布上运行的并发合并进程数设置限制。如果同时调度的快照进程数比该值允许运行的快照进程数要多，则多出的作业被放入队列中，一直等到当前运行的合并进程结束。
max_concurrent_dynamic_snapshots |  | 在合并发布上可以运行的最大并发动态快照会话数。如果为 0，表示对在任意给定时间同时在发布上运行的并发动态快照会话数没有限制。该属性对可以同时在合并发布上运行的并发快照进程数设置限制。如果同时调度的快照进程数比该值允许运行的快照进程数要多，则多出的作业被放入队列中，一直等到当前运行的合并进程结束。
NULL（默认值） |  |

[@force_invalidate_snapshot = ] force_invalidate_snapshot

确认此存储过程采取的操作可能使现有快照无效。force_invalidate_snapshot 的数据类型为 bit，默认设置为 0。0 指定对项目的更改不会导致快照无效。如果存储过程检测到更改确实需要新快照，则会发生错误，且不会进行任何更改。而 1 指定对发布所做的更改可能导致快照无效，而且如果现有订阅需要新的快照，则值 1 提供适当的权限，使现有快照被标记为废弃并生成新快照。

[@force_reinit_subscription = ] force_reinit_subscription

确认此存储过程所采取的操作可能要求重新初始化现有的订阅。force_reinit_subscription 的数据类型为 bit，默认设置为 0。0 指定对项目的更改不会导致重新初始化订阅。如果存储过程检测到更改需要重新初始化订阅，则会发生错误，且不会进行任何更改。而 1 指定对项目的更改将导致重新初始化现有的订阅，且提供使订阅重新初始化发生的权限。

返回代码值

0（成功）或 1（失败）

注释

sp_changemergepublication 用于合并复制。

若要使用 @publish_to_active_directory 参数列出 Active Directory 的发布对象，必须已经在 Active Directory 中创建了 SQL Server 对象。有关更多信息，请参见 Active Directory 服务。

权限

只有 sysadmin 固定服务器角色成员或 db_owner 固定数据库角色成员才能执行 sp_changemergepublication。

请参见

sp_addmergepublication

sp_dropmergepublication

sp_helpmergepublication

系统存储过程


sp_changemergepullsubscription

更改合并请求订阅的属性。此存储过程在订阅服务器的订阅数据库上执行。

语法

sp_changemergepullsubscription [ [ @publication = ] 'publication' ]
[ , [ @publisher = ] 'publisher' ]
[ , [ @publisher_db = ] 'publisher_db' ]
[ , [ @property = ] 'property' ]
[ , [ @value = ] 'value' ]

参数

[@publication =] 'publication'

是发布名。publication 的数据类型为 sysname，默认设置为 %。

[@publisher =] 'publisher'

是发布服务器名称。publisher 的数据类型为 sysname，默认设置为 %。

[@publisher_db =] 'publisher_db'

是发布服务器数据库名称。publisher_db 的数据类型为 sysname，默认设置为 %。

[@property =] 'property'

是要更改的属性名。property 的数据类型为 sysname，可以是下表所列值之一。

[@value =] 'value'

是指定的属性的新值。value 的数据类型为 nvarchar(255)，可以是下表所列值之一。

属性 | 值 | 描述
sync_type | automatic 或 none | 是订阅同步类型。sync_type 的数据类型为 nvarchar(15)，默认设置为 automatic。可以是 automatic 或 none。如果是 automatic，则表示首先将已发布表的架构和初始数据传输到订阅服务器。如果是 none，则假定订阅服务器已有已发布表的架构和初始数据。始终传输系统表和数据。
priority |  | 仅用于向后兼容；改为在发布服务器上运行 sp_changemergesubscription 以修改订阅的优先级。
description |  | 对该合并请求订阅的描述。
publisher_login |  | 发布服务器上用于 SQL Server 身份验证的登录 ID。
publisher_password |  | 发布服务器上用于 SQL Server 身份验证的密码（加密）。
publisher_security_mode | 0 = SQL Server 身份验证 1 = Windows 身份验证 2 = 同步触发器使用静态 sysservers 项做 RPC，且发布服务器必须在 sysservers 表中定义为远程服务器或链接服务器。 | 在发布服务器上实现的安全模式。
distributor |  | 分发服务器的名称。
distributor_login |  | 分发服务器上用于 SQL Server 身份验证的登录 ID。
distributor_password |  | 分发服务器上用于 SQL Server 身份验证的密码（加密）。
distributor_security_mode | 0 = SQL 服务器身份验证 1 = Windows 身份验证 | 在分发服务器上实现的安全模式：
ftp_address |  | 仅用于向后兼容性。是分发服务器的 FTP 服务的网络地址。
ftp_port |  | 仅用于向后兼容性。是分发服务器的 FTP 服务的端口号。
ftp_login |  | 仅用于向后兼容性。是连接到 FTP 服务的用户名。
ftp_password |  | 仅用于向后兼容性。是连接到 FTP 服务的用户密码。
alt_snapshot_folder |  | 快照文件夹存储的位置，如果该位置在默认位置以外或除它之外的位置
working_directory |  | 到目录（为指定该选项时使用 FTP 传输快照文件的位置）的完全合法的路径。
use_ftp |  | 订阅正通过 Internet 订阅发布，且已配置 FTP 寻址属性。如果为 0，则订阅不使用 FTP。如果为 1，则订阅使用 FTP。
use_interactive_resolver | 0 或 1 | 确定在协调过程中是否使用交互式冲突解决程序。如果为 0，则不使用交互式冲突解决程序。
offload_agent | 0 或 1 bit | 指定是否可以远程激活和运行代理程序。如果为 0，则不能远程激活代理程序。
offload_server |  | 用于远程激活的服务器的名称。
dynamic_snapshot_location |  | 保存快照文件的文件夹的路径。
NULL（默认值） |  |

返回代码值

0（成功）或 1（失败）

注释

sp_changemergepullsubscription 用于合并复制。

假定当前服务器和当前数据库分别是订阅服务器和订阅服务器数据库。

权限

只有 sysadmin 固定服务器角色成员或 db_owner 固定数据库角色成员才能执行 sp_changemergepullsubscription。

请参见

sp_addmergepullsubscription

sp_dropmergepullsubscription

sp_helpmergepullsubscription

系统存储过程


sp_changemergesubscription

更改合并强制订阅或请求订阅。此存储过程在发布服务器的发布数据库上执行。

语法

sp_changemergesubscription [ [ @publication = ] 'publication' ]
[ , [ @subscriber = ] 'subscriber'
[ , [ @subscriber_db = ] 'subscriber_db' ]
[ , [ @property = ] 'property' ]
[ , [ @value = ] 'value' ]

参数

[@publication =] 'publication'

是要更改发布名。publication 的数据类型为 sysname，默认设置为 NULL。发布必须已经存在且必须符合标识符的规则。

[@subscriber =] 'subscriber'

是订阅服务器名。subscriber 的数据类型为 sysname，默认设置为 NULL。

[@subscriber_db =] 'subscriber_db'

是订阅数据库名称。subscriber_db 的数据类型为 sysname，默认设置为 NULL。

[@property =] 'property'

是要更改的给定发布属性。property 的数据类型为 sysname，可以是下表所列值之一。

[@value =] 'value'

是用于指定的属性的新值。value 的数据类型为 nvarchar(255)，可以是下表所列值之一。

属性 | 值 | 描述
sync_type | automatic 或 none | 是订阅同步类型。sync_type 的数据类型为 nvarchar(15)，默认设置为 automatic。可以是 automatic 或 none。如果是 automatic，则表示首先将已发布表的架构和初始数据传输到订阅服务器。如果是 none，则假定订阅服务器已有已发布表的架构和初始数据。始终传输系统表和数据。
priority |  | 是订阅优先级。在检测到冲突时，默认的冲突解决程序使用该优先级挑选入选方。
description |  | 对该合并订阅的描述。
NULL（默认值） | NULL（默认值） |

返回代码值

0（成功）或 1（失败）

注释

sp_changemergesubscription 用于合并复制。

权限

只有 sysadmin 固定服务器角色成员或 db_owner 固定数据库角色成员才能执行 sp_changemergesubscription。

请参见

sp_addmergesubscription

sp_dropmergesubscription

sp_helpmergesubscription

系统存储过程


sp_changepublication

更改发布的属性。此存储过程在发布服务器的发布数据库上执行。

语法

sp_changepublication [ [ @publication = ] 'publication' ]
[ , [ @property = ] 'property' ]
[ , [ @value = ] 'value' ]
[ , [ @force_invalidate_snapshot = ] force_invalidate_snapshot ]
[ , [ @force_reinit_subscription = ] force_reinit_subscription ]

参数

[@publication =] 'publication'

是发布名。publication 的数据类型为 sysname，默认值为 NULL。

[@property =] 'property'

是要更改的发布属性。property 的数据类型为 nvarchar(20)，可以是下列值之一。

值 | 描述
taskid | 使用 sp_addtask 创建的唯一调度任务 ID。仅为保持向后兼容性。
sync_method | 同步方法。可以是： native = 生成所有表的本机模式大容量复制输出 character = 生成所有表的字符模式大容量复制输出 concurrent = 在快照期间生成所有表的本机模式大容量复制程序输出但不锁定表 concurrent_c = 在快照期间生成所有表的字符模式大容量复制程序输出但不锁定表。 注意值 concurrent 和 concurrent_c 可用于事务复制和合并复制，但不可用于快照复制。
repl_freq | 复制频率。可以是 continuous（提供所有基于日志的事务输出）或 snapshot（只生成已调度同步事件）。
description | 用于描述发布的可选项。
status | 发布状态。可以是 inactive（第一次创建订阅时，发布数据不能由订阅服务器使用）或 active（发布数据可由订阅服务器立即使用）。
independent_agent | 指定是否有用于该发布的单独的分发代理程序。如果是 true，则表示有用于该发布的独立分发代理程序。如果是 false，则发布使用共享分发代理程序，且每个发布服务器数据库/订阅服务器数据库对都有共享代理程序。
immediate_sync | 指定是否每次快照代理程序运行时都创建发布的同步文件。如果是 true，则表示每次快照代理程序运行时都创建或重新创建同步文件。如果在完成订阅之前已完成一次快照代理程序，则订阅服务器能够在接收订阅之后立即接收同步文件。新订阅获得最后一次执行快照代理程序所生成的最新同步文件。要想使 immediate_sync 为 true，independent_agent 必须为 true。如果是 false，则表示只有存在新订阅时才创建同步文件。订阅服务器不能在接收订阅之后接收同步文件，直到启动并完成快照代理程序。
enabled_for_internet | 指定是否为 Internet 启用发布。如果是 true，则表示该发布的同步文件放在 \Repldata\Ftp 目录内。
allow_push | 指定是否可以为给定发布创建强制订阅。如果是 true，则表示允许在该发布上使用强制订阅。
allow_pull | 指定是否可以为给定发布创建请求订阅。如果是 true，则表示允许在该发布上使用请求订阅。
allow_anonymous | 指定是否可以为给定发布创建匿名订阅。如果是 true，则 immediate_sync 也必须设置为 true。如果是 true，则表示允许在该发布上使用匿名订阅。
retention | 订阅活动的保持期（以小时为单位）。如果订阅在保持期内不活动，则将其删除。
snapshot_in_ defaultfolder | 指定是否将快照文件存储在默认文件夹中。snapshot_in_defaultfolder 的数据类型为 nvarchar(5)。如果是 true，则可以在默认文件夹中找到快照文件。如果是 false，则表示快照文件已存储在 alt_snapshot_folder 所指定的备用位置中。备用位置可以在另一台服务器、一个网络驱动器或可移动媒体（如光盘或可移动磁盘）上。也可以将快照文件保存到文件传输协议 (FTP) 站点以供订户以后检索。注意该参数可以为 true，并且在 @alt_snapshot_folder 参数中仍有位置。该组合指定将快照文件同时存储在默认位置和备用位置。
alt_snapshot_folder | 指定快照的备用文件夹位置。alternate_snapshot_folder 的数据类型为 nvarchar(255)。
pre_snapshot_script | 指定指向 .sql 文件位置的指针。pre_snapshot_script 的数据类型为 nvarchar(255)。在订阅服务器上应用快照时，分发代理程序将在运行任何复制的对象脚本之前运行快照前脚本。
post_snapshot_script | 指定指向 .sql 文件位置的指针。post_snapshot_script 的数据类型为 nvarchar(255)。分发代理程序将在初始同步过程中已应用所有其它复制的对象脚本和数据之后才运行快照后脚本。
compress_snapshot | 指定将写入 @alt_snapshot_folder 位置的快照压缩成 Microsoft® CAB 格式。compress_snapshot 的数据类型为 nvarchar(5)，默认设置为 FALSE。false 指定不压缩快照；而 true 指定将压缩快照。不能压缩默认文件夹中的快照。
ftp_address | 是分发服务器 FTP 服务的网络地址。ftp_address 的数据类型为 sysname。指定供订阅服务器的分发代理程序或合并代理程序获取的发布快照文件的位置。因为要为每个发布存储该属性，所以每个发布可以有不同的 ftp_address。发布必须支持通过 FTP 传播快照。有关更多信息，请参见配置发布以允许订阅服务器使用 FTP 检索快照。
ftp_port | 是分发服务器的 FTP 服务的端口号。ftp_port 的数据类型为 int。默认设置为 21。指定供订阅服务器的分发代理程序或合并代理程序获取的发布快照文件的位置。因为要为每个发布存储该属性，所以每个发布可以有自己的 ftp_port。
ftp_subdirectory | 如果发布支持通过 FTP 传播快照，指定可供订阅服务器的分发代理程序或合并代理程序获取的快照文件的位置。ftp_subdirectory 的数据类型为 nvarchar(255)。因为要为每个发布存储该属性，所以每个发布可以有自己的 ftp_subdirctory，或选择没有子目录，如 NULL 值表示的那样。
ftp_login | 是用于连接到 FTP 服务的用户名。ftp_login 的数据类型为 sysname。允许使用值 ANONYMOUS。
ftp_password | 是用于连接到 FTP 服务的用户密码。ftp_password 的数据类型为 sysname。
conflict_policy | 指定在使用排队更新订阅服务器选项时应遵从的冲突解决策略。conflict_policy 的数据类型为 nvarchar(100)，可以是下列值之一： pub wins = 发布服务器在冲突中取胜。 sub reinit = 重新初始化订阅。 sub wins = 订阅服务器在冲突中取胜。 NULL = 如果是 NULL 且该发布是快照发布，则默认策略变成 sub reinit。如果是 NULL 且发布不是快照发布，则默认策略变成 pub wins。 只有在没有活动订阅时才能更改该属性。
centralized_conflicts | 指定是否在发布服务器上存储冲突记录。centralized_conflicts 的数据类型为 nvarchar(5)。如果是 true，则表示冲突记录存储在发布服务器上。如果是 false，则在引起冲突的发布服务器和订阅服务器上都存储冲突记录。 只有在没有活动订阅时才能更改该属性。
conflict_retention | 指定冲突保持期（以天为单位）。conflict_retention 的数据类型为 int。默认保持期一般为 14 天。
queue_type | 指定使用的队列类型。queue_type 的数据类型为 nvarchar(10)，可以是下列值之一： msmq = 使用 Microsoft 消息队列存储事务。 sql = 使用 SQL Server 存储事务。 NULL = 默认设置为 sql，指定使用 SQL Server 存储事务。 只有在没有活动订阅时才能更改该属性。
publish_to_ ActiveDirectory | 指定是否将发布信息发布到 Microsoft Active Directory™。add_to_active_directory 的数据类型为 nvarchar(10)。只有在运行 Microsoft Windows® 2000 操作系统的服务器上才能使用该功能。有效值为： true = 发布发布信息。 false = 不发布发布信息。
NULL（默认值） |

[@value =] 'value'

是新属性值。value 的数据类型为 nvarchar(255)，默认设置为 NULL。

[@force_invalidate_snapshot = ] force_invalidate_snapshot

确认此存储过程采取的操作可能使现有快照无效。force_invalidate_snapshot 的数据类型为 bit，默认设置为 0。0 指定对项目的更改不会导致快照无效。如果存储过程检测到更改确实需要新快照，则会发生错误，且不会进行任何更改。而 1 指定对项目所做的更改可能导致快照无效，而且如果现有订阅需要新的快照，则提供适当的权限，使现有快照被标记为废弃并生成新快照。

[@force_reinit_subscription = ] force_reinit_subscription

确认此存储过程采取的操作可能要求重新初始化现有的订阅。force_reinit_subscription 的数据类型为 bit，默认设置为 0。0 指定对项目的更改不会导致重新初始化订阅。如果存储过程检测到更改需要重新初始化订阅，则会发生错误，且不会进行任何更改。而 1 指定对项目的更改将导致重新初始化现有的订阅，且提供使订阅重新初始化发生的权限。

返回代码值

0（成功）或 1（失败）

注释

sp_changepublication 用于快照复制和事务复制。

若要使用 @publish_to_Active_Directory 参数列出 Active Directory 中的发布对象，必须已经在 Active Directory 中创建了 SQL Server 对象。有关更多信息，请参见 Active Directory 服务。

权限

只有 sysadmin 固定服务器角色成员或 db_owner 固定数据库角色成员才能执行 sp_changepublication。

请参见

sp_addarticle

sp_addpublication

sp_articlecolumn

sp_changearticle

sp_droparticle

sp_droppublication

sp_enumfullsubscribers

sp_helparticle

sp_helparticlecolumns

sp_helppublication

系统存储过程


sp_changesubscriber

更改订阅服务器的选项。更新针对此发布服务器的订阅服务器的任何分发任务。此存储过程写入分发数据库中的 MSsubscriber_info 表。此存储过程在发布服务器的发布数据库上执行。

语法

sp_changesubscriber [ @subscriber = ] 'subscriber'
[ , [ @type = ] type ]
[ , [ @login = ] 'login' ]
[ , [ @password = ] 'password' ]
[ , [ @commit_batch_size = ] commit_batch_size ]
[ , [ @status_batch_size = ] status_batch_size ]
[ , [ @flush_frequency = ] flush_frequency ]
[ , [ @frequency_type = ] frequency_type ]
[ , [ @frequency_interval = ] frequency_interval ]
[ , [ @frequency_relative_interval = ] frequency_relative_interval ]
[ , [ @frequency_recurrence_factor = ] frequency_recurrence_factor ]
[ , [ @frequency_subday = ] frequency_subday ]
[ , [ @frequency_subday_interval = ] frequency_subday_interval ]
[ , [ @active_start_time_of_day = ] active_start_time_of_day ]
[ , [ @active_end_time_of_day = ] active_end_time_of_day ]
[ , [ @active_start_date = ] active_start_date ]
[ , [ @active_end_date = ] active_end_date ]
[ , [ @description = ] 'description' ]
[ , [ @security_mode = ] security_mode ]

参数

[@subscriber =] 'subscriber'

是在其上更改这些选项的订阅服务器名称。subscriber 的数据类型为 sysname，没有默认设置。

[@type =] type

是订阅服务器的类型。type 的数据类型为 tinyint，默认设置为 NULL。0 表示 Microsoft® SQL Server™ 订阅服务器。而 1 指定非 SQL Server 或其它 ODBC 数据源服务器订阅服务器。

[ @login = ] 'login'

是 SQL Server 身份验证登录 ID。login 的数据类型为 sysname，默认设置为 NULL。

[@password = ] 'password'

是 SQL Server 身份验证密码。password 的数据类型为 sysname，默认设置为 %。% 表示未对密码属性进行更改。

[@commit_batch_size =] commit_batch_size

仅为保持向后兼容性。

[@status_batch_size =] status_batch_size

仅为保持向后兼容性。

[@flush_frequency =] flush_frequency

仅为保持向后兼容性。

[@frequency_type =] frequency_type

是调度分发任务所使用的频率。frequency_type 的数据类型为 int，可以是下列值之一。

值 | 描述
1 | 一次
2 | 按需
4 | 每天
8 | 每周
16 | 每月
32 | 每月相对信息
64 | 自动启动
128 | 反复出现
NULL（默认值） |

[@frequency_interval =] frequency_interval

是 frequency_type 的间隔。frequency_interval 的数据类型为 int，默认设置为 NULL。

[@frequency_relative_interval =] frequency_relative_interval

是分发任务运行的日期。当 frequency_type 设置为 32（每月相对信息）时使用该参数。frequency_relative_interval 的数据类型为 int，可以是下列值之一。

值 | 描述
1 | 第一个
2 | 秒
4 | 第三个
8 | 第四个
16 | 最后一个
NULL（默认值） |

[@frequency_recurrence_factor =] frequency_recurrence_factor

是分发任务在定义的 frequency_type 内重复的频率。frequency_recurrence_factor 的数据类型为 int，默认设置为 NULL。

[@frequency_subday =] frequency_subday

是在定义的周期内重新调度的频率。frequency_subday 的数据类型为 int，可以是下列值之一。

值 | 描述
1（默认值） | 一次
2 | 秒
4 | 分钟
8 | 小时

[@frequency_subday_interval =] frequency_subday_interval

是 frequency_subday 的间隔。frequency_subday_interval 的数据类型为 int，默认设置为 NULL。

[@active_start_time_of_day =] active_start_time_of_day

是第一次调度分发任务的时间，格式为 HHMMSS。active_start_time_of_day 的数据类型为 int，默认设置为 NULL。

[@active_end_time_of_day =] active_end_time_of_day

是停止调度分发任务的时间，格式为 HHMMSS。active_end_time_of_day 的数据类型为 int，默认设置为 NULL。

[@active_start_date =] active_start_date

是第一次调度分发任务的日期，格式为 YYYYMMDD。active_start_date 的数据类型为 int，默认设置为 NULL。

[@active_end_date =] active_end_date

是停止调度分发任务的日期，格式为 YYYYMMDD。active_end_date 的数据类型为 int，默认设置为 NULL。

[@description =] 'description'

是可选的文本描述。description 的数据类型为 nvarchar(255)，默认设置为 NULL。

[@security_mode =] security_mode

是实现的安全模式。security_mode 的数据类型为 int，可以是下列值之一。

值 | 描述
0 | SQL Server 身份验证
1 | Windows 身份验证
NULL（默认值） |

返回代码值

0（成功）或 1（失败）

注释

sp_changesubscriber 用于所有类型的复制。

权限

只有 sysadmin 固定服务器角色成员才能执行 sp_changesubscriber。

请参见

sp_addsubscriber

sp_dropsubscriber

sp_helpdistributiondb

sp_helpserver

sp_helpsubscriberinfo

系统存储过程


sp_changesubscriber_schedule

更改订阅服务器的分发代理程序或合并代理程序调度。此存储过程在发布服务器的任何数据库上执行。

语法

sp_changesubscriber_schedule [ @subscriber = ] 'subscriber'
, [ @agent_type = ] type
[ , [ @frequency_type = ] frequency_type ]
[ , [ @frequency_interval = ] frequency_interval ]
[ , [ @frequency_relative_interval = ] frequency_relative_interval ]
[ , [ @frequency_recurrence_factor = ] frequency_recurrence_factor ]
[ , [ @frequency_subday = ] frequency_subday ]
[ , [ @frequency_subday_interval = ] frequency_subday_interval ]
[ , [ @active_start_time_of_day = ] active_start_time_of_day ]
[ , [ @active_end_time_of_day = ] active_end_time_of_day ]
[ , [ @active_start_date = ] active_start_date ]
[ , [ @active_end_date = ] active_end_date ]

参数

[@subscriber =] 'subscriber'

是订阅服务器名。subscriber 的数据类型为 sysname。订阅服务器名在数据库内必须唯一，不能已存在，而且不能为 NULL。

[@agent_type =] type

是代理程序的类型。agent_type 的数据类型为 smallint，默认设置为 0。0 表示分发代理程序。1 表示合并代理程序。

[@frequency_type =] frequency_type

是调度分发任务所使用的频率。frequency_type 的数据类型为 int，默认设置为 64。有 10 个调度列。

[@frequency_interval =] frequency_interval

是应用于 frequency_type 所设置频率的值。frequency_interval 的数据类型为 int，默认设置为 1。

[@frequency_relative_interval =] frequency_relative_interval

是分发任务运行的日期。frequency_relative_interval 的数据类型为 int，默认设置为 1。

[@frequency_recurrence_factor =] frequency_recurrence_factor

是 frequency_type 使用的重复因子。frequency_recurrence_factor 的数据类型为 int，默认设置为 0。

[@frequency_subday =] frequency_subday

是在定义的周期内重新调度的频率（以分钟为单位）。frequency_subday 的数据类型为 int，默认设置为 4。

[@frequency_subday_interval =] frequency_subday_interval

是 frequency_subday 的间隔。frequency_subday_interval 的数据类型为 int，默认设置为 5。

[@active_start_time_of_day =] active_start_time_of_day

是第一次调度分发任务的时间。active_start_time_of_day 的数据类型为 int，默认设置为 0。

[@active_end_time_of_day =] active_end_time_of_day

是停止调度分发任务的时间。active_end_time_of_day 的数据类型为 int，默认设置为 235959，表示 24 小时制的 11:59:59 P.M.。

[@active_start_date =] active_start_date

是第一次调度分发任务的日期，格式为 YYYYMMDD。active_start_date 的数据类型为 int，默认设置为 0。

[@active_end_date =] active_end_date

是停止调度分发任务的日期，格式为 YYYYMMDD。active_end_date 的数据类型为 int，默认设置为 99991231，表示 9999 年 12 月 31 日。

返回代码值

0（成功）或 1（失败）

注释

sp_changesubscriber_schedule 用于所有类型的复制。

权限

只有 sysadmin 固定服务器角色成员才能执行 sp_changesubscriber_schedule。

请参见

sp_addsubscriber_schedule

系统存储过程


sp_changesubscriptiondtsinfo

更改订阅的 DTS 包属性。此存储过程在订阅服务器的订阅数据库上执行。

语法

sp_changesubscriptiondtsinfo [ [ @job_id = ] job_id ]
[ , [ @dts_package_name = ] 'dts_package_name' ]
[ , [ @dts_package_password = ] 'dts_package_password' ]
[ , [ @dts_package_location = ] 'dts_package_location' ]

参数

[@job_id =] job_id

是强制订阅的分发代理程序作业 ID。job_id 的数据类型为 varbinary(16)，没有默认设置。若要查找分发作业 ID，请运行 sp_helpsubscription 或 sp_helppullsubscription。

[@dts_package_name = ] 'dts_package_name'

指定 DTS 包的名称。dts_package_name 的数据类型为 sysname，默认设置为 NULL。例如，若要指定 DTSPub_Package 包，则该参数将是 @dts_package_name = N'DTSPub_Package'。

[@dts_package_password = ] 'dts_package_password'

指定如果有密码，则密码在包上。dts_package_password 的数据类型为 sysname，默认设置为 NULL，它表示不更改密码属性。如果在该参数中放入空字符串，则将指定 DTS 包没有密码。

[@dts_package_location = ] 'dts_package_location'

指定包位置。dts_package_location 的数据类型为 nvarchar(12)，默认设置为 NULL，指定不更改包位置。包的位置可以更改为 distributor 或 subscriber。

返回代码值

0（成功）或 1（失败）

注释

sp_changesubscriptiondtsinfo 用于仅作为强制订阅的快照复制和事务复制。

权限

只有 sysadmin 固定服务器角色成员才能执行 sp_changesubscriptiondtsinfo。


sp_changesubstatus

更改现有订阅服务器的状态。此存储过程在发布服务器的发布数据库上执行。

语法

sp_changesubstatus [ [ @publication = ] 'publication' ]
[ , [ @article = ] 'article' ]
[ , [ @subscriber = ] 'subscriber' ]
, [ @status = ] 'status'
[ , [ @previous_status = ] 'previous_status' ]
[ , [ @destination_db = ] 'destination_db' ]
[ , [ @frequency_type = ] frequency_type ]
[ , [ @frequency_interval = ] frequency_interval ]
[ , [ @frequency_relative_interval = ] frequency_relative_interval ]
[ , [ @frequency_recurrence_factor = ] frequency_recurrence_factor ]
[ , [ @frequency_subday = ] frequency_subday ]
[ , [ @frequency_subday_interval = ] frequency_subday_interval ]
[ , [ @active_start_time_of_day = ] active_start_time_of_day ]
[ , [ @active_end_time_of_day = ] active_end_time_of_day ]
[ , [ @active_start_date = ] active_start_date ]
[ , [ @active_end_date = ] active_end_date ]
[ , [ @optional_command_line = ] 'optional_command_line' ]
[ , [ @distribution_jobid = ] distribution_jobid ]
[ , [ @from_auto_sync = ] from_auto_sync ]
[ , [ @ignore_distributor = ] ignore_distributor ]
[ , [ @offloadagent = ] remote_agent_activation ]
[ , [ @offloadserver = ] 'remote_agent_server_name' ]
[ , [ @dts_package_name = ] 'dts_package_name' ]
[ , [ @dts_package_password = ] 'dts_package_password' ]
[ , [ @dts_package_location = ] dts_package_location ]
[ , [ @schemastabilityonly = ] schema_stability_only ]
[ , [ @distribution_job_name = ] 'distribution_job_name' ]

参数

[@publication =] 'publication'

是发布名。publication 的数据类型为 sysname，默认设置为 %。如果未指定 publication，则表示所有发布。

[@article =] 'article'

是项目名。该名称对于发布必须唯一。article 的数据类型为 sysname，默认设置为 %。如果未指定 article，则表示所有项目。

[@subscriber =] 'subscriber'

是要更改其状态的订阅服务器名。subscriber 的数据类型为 sysname，默认设置为 %。如果未指定 subscriber，则所有订阅服务器的状态都将更改为指定的项目。

[@status =] 'status'

是 syssubscriptions 表中的订阅状态。status 的数据类型为 sysname，没有默认设置，可以是下列值之一。

值 | 描述
active | 订阅服务器已进行同步处理且正接收数据。
inactive | 没有订阅但存在订阅服务器项。
subscribed | 订阅服务器正请求数据，但尚未进行同步处理。

[@previous_status =] 'previous_status'

是订阅的前一个状态。previous_status 的数据类型为 sysname，默认设置为 NULL。该参数使您得以更改当前具有该状态的任何订阅，因此允许在特定的订阅集上执行分组功能（例如，将所有活动订阅设置回 subscribed 状态）。

[@destination_db =] 'destination_db'

是目的数据库名。destination_db 的数据类型为 sysname，默认值为 %。

[@frequency_type =] frequency_type

是调度分发任务所使用的频率。frequency_type 的数据类型为 int，默认设置为 NULL。如果没有为 frequency_type 提供任何值，则 sp_changesubstatus 使用 sp_addsubscriber 所使用的 frequency_type 值。

[@frequency_interval =] frequency_interval

是应用于 frequency_type 所设置频率的值。frequency_interval 的数据类型为 int，默认设置为 NULL。

[@frequency_relative_interval =] frequency_relative_interval

是分发任务运行的日期。当 frequency_type 设置为 32（每月相对信息）时使用该参数。frequency_relative interval 的数据类型为 int，可以是下列值之一。

值 | 描述
1 | 第一个
2 | 秒
4 | 第三个
8 | 第四个
16 | 最后一个
NULL（默认值） |

[@frequency_recurrence_factor =] frequency_recurrence_factor

是 frequency_type 使用的重复因子。frequency_recurrence_factor 的数据类型为 int，默认设置为 0。

[@frequency_subday =] frequency_subday

是在定义的周期内重新调度的频率（以分钟为单位）。frequency_subday 的数据类型为 int，可以是下列值之一。

值 | 描述
1 | 一次
2 | 秒
4 | 分钟
8 | 小时
NULL（默认值） |

[@frequency_subday_interval =] frequency_subday_interval

是 frequency_subday 的间隔。frequency_subday_interval 的数据类型为 int，默认设置为 NULL。

[@active_start_time_of_day =] active_start_time_of_day

是第一次调度分发任务的时间，格式为 HHMMSS。active_start_time_of_day 的数据类型为 int，默认设置为 NULL。

[@active_end_time_of_day =] active_end_time_of_day

是停止调度分发任务的时间，格式为 HHMMSS。active_end_time_of_day 的数据类型为 int，默认设置为 NULL。

[@active_start_date =] active_start_date

是第一次调度分发任务的日期，格式为 YYYYMMDD。active_start_date 的数据类型为 int，默认设置为 NULL。

[@active_end_date =] active_end_date

是停止调度分发任务的日期，格式为 YYYYMMDD。active_end_date 的数据类型为 int，默认设置为 NULL。

[@optional_command_line =] 'optional_command_line'

是可选的命令提示符。optional_command_line 的数据类型为 nvarchar(4000)，默认设置为 NULL。

[@distribution_jobid =] distribution_jobid

是当订阅状态从非活动更改为活动时，该订阅在分发服务器上的分发代理程序作业 ID。其它情况下，不定义该作业 ID。如果对此存储过程的单个调用中涉及多个分发代理程序，则不定义结果。distribution_jobid 的数据类型为 binary(16)，默认设置为 NULL。

[@from_auto_sync =] from_auto_sync

仅限内部使用。

[@ignore_distributor =] ignore_distributor

仅限内部使用。

[@offloadagent = ] remote_agent_activation

指定可以远程地激活代理程序。remote_agent_activation 的数据类型为 bit，默认设置为 0。0 指定不能远程地激活代理程序。而 1 指定可以远程地激活代理程序，并且是在 remote_agent_server_name 所指定的远程计算机上激活。

[@offloadserver = ] 'remote_agent_server_name'

指定用于远程激活的服务器的网络名。remote_agent_server_name 的数据类型为 sysname，默认设置为 NULL。

[@dts_package_name = ] 'dts_package_name'

指定 DTS 包的名称。dts_package_name 的数据类型为 sysname，默认设置为 NULL。例如，若要指定 DTSPub_Package 包，则该参数将是 @dts_package_name = N'DTSPub_Package'。

[@dts_package_password = ] 'dts_package_password'

指定如果有密码，则密码在包上。dts_package_password 的数据类型为 sysname，默认设置为 NULL，它表示包上没有密码。

[@dts_package_location = ] dts_package_location

指定包的位置。dts_package_location 的数据类型为 int，默认设置为 0。如果是 0，则表示包位置是在分发服务器上。如果是 1，则表示包位置是在订阅服务器上。包的位置可以是 distributor 或 subscriber。

[@schemastabilityonly = ] schema_stability_only

仅限内部使用。

[@distribution_job_name = ] 'distribution_job_name'

是分发作业的名称。distribution_job_name 的数据类型为 sysname，默认设置为 NULL。

返回代码值

0（成功）或 1（失败）

注释

sp_changesubstatus 用于快照复制和事务复制。

sp_changesubstatus 在 syssubscriptions 表中用已更改的状态更改订阅服务器的状态。如有必要，它将更新 sysarticles 表中的项目状态以显示活动或非活动。如有必要，它将在 sysobjects 表中将已复制表的复制标志设置为 on 或 off。

权限

只有 sysadmin 固定服务器角色成员、db_owner 固定数据库角色成员或订阅创建者才能执行 sp_changesubstatus。

请参见

sp_addsubscription

sp_dropsubscription

sp_helpdistributor

sp_helpsubscription

系统存储过程


sp_check_for_sync_trigger

确定用户定义触发器或存储过程是否正在可更新订阅的上下文中被调用。该存储过程在发布服务器的发布数据库上执行。

语法

sp_check_for_sync_trigger [ @tabid = ] 'tabid'
[ , [ @trigger_op = ] 'trigger_output_parameters' OUTPUT ]

参数

[@tabid = ] 'tabid'

是正对其进行即时更新触发器检查的表对象 ID。tabid 的数据类型为 int，没有默认设置。

[@trigger_op = ] 'trigger_output_parameters' OUTPUT

指定输出参数是否返回其正调用的触发器类型。trigger_output_parameters 的数据类型为 char(10)，可以是下列值之一。

值 | 描述
Ins | INSERT 触发器
Upd | UPDATE 触发器
Del | DELETE 触发器
NULL（默认值） |

返回代码值

0 表示在即时更新触发器的上下文中未调用该存储过程。1 表示在即时更新触发器的上下文中正调用该存储过程，而且该存储过程是 @trigger_op 中所返回的触发器类型。

注释

sp_check_for_sync_trigger 用于快照复制和事务复制。

权限

public 角色成员可以执行 sp_check_for_sync_trigger。

请参见

系统存储过程


sp_copymergesnapshot

将指定发布的快照文件夹复制到 @destination_folde r 中列出的文件夹。该存储过程在发布服务器的发布数据库上执行。

语法

sp_copymergesnapshot [ @publication = ] 'publication'
, [ @destination_folder = ] 'destination_folder'

参数

[@publication =] 'publication'

是将复制其快照内容的发布名称，publication 的数据类型为 sysname，没有默认设置。

[@destination_folder = ] 'destination_folder'

是将在其中复制发布快照内容的文件夹名称。destination_folder 的数据类型为 nvarchar(255)，没有默认设置。destination_folder 可位于备用位置，例如另一台服务器、网络驱动器或可移动媒体（如光盘或可移动磁盘）。

返回代码值

0（成功）或 1（失败）

注释

sp_copymergesnapshot 用于合并复制。运行 Microsoft® SQL Server™ 7.0 版及其早期版本的订阅服务器不能使用备用快照位置。

权限

public 角色成员可以执行 sp_copymergesnapshot。

请参见

备用快照位置

系统存储过程


sp_copysnapshot

将指定发布的快照文件夹复制到 @destination_folder 中列出的文件夹。该存储过程在发布服务器的发布数据库上执行。该存储过程用于将快照复制到可移动媒体（如 CD-ROM）上。

语法

sp_copysnapshot [ @publication = ] 'publication'
, [ @destination_folder = ] 'destination_folder' ]
[ , [ @subscriber = ] 'subscriber' ]
[ , [ @subscriber_db = ] 'subscriber_db' ]

参数

[@publication = ] 'publication'

是将复制其快照内容的发布名称，publication 的数据类型为 sysname，没有默认设置。

[@destination_folder = ] 'destination_folder'

是将在其中复制发布快照内容的文件夹名称。destination_folder 的数据类型为 nvarchar(255)，没有默认设置。destination_folder 可位于备用位置，例如另一台服务器、网络驱动器或可移动媒体（如光盘或可移动磁盘）。

[@subscriber = ] 'subscriber'

是订阅服务器名称。subscriber 的数据类型为 sysname，默认设置为 NULL。

[@subscriber_db = ] 'subscriber_db'

是订阅数据库名称。subscriber_db 的数据类型为 sysname，默认设置为 NULL。

返回代码值

0（成功）或 1（失败）

注释

sp_copysnapshot 用于所有类型的复制。运行 Microsoft® SQL Server™ 7.0 版及其早期版本的订阅服务器不能使用备用快照位置。

权限

public 角色成员可以执行 sp_copysnapshot。

请参见

备用快照位置

系统存储过程


sp_copysubscription

复制具有请求订阅但无强制订阅的订阅数据库。仅可复制单个文件数据库。该存储过程在订阅服务器的订阅数据库上执行。

语法

sp_copysubscription [ @filename = ] 'file name'
[ , [ @temp_dir = ] 'temp_dir' ]
[ , [ @overwrite_existing_file = ] overwrite_existing_file]

参数

[@filename = ] 'file name'

是指定保存数据文件 (.mdf) 复本的完整路径（包括文件名）。filename 的数据类型为 nvarchar(260)，没有默认设置。

[@temp_dir = ] 'temp_dir'

是包含临时文件的目录名。temp_dir 的数据类型为 nvarchar(260)，默认设置为 NULL。如果为 NULL，则使用 SQL Server 的默认数据目录。该目录应有足够空间容纳具有组合的所有订阅服务器数据库文件大小的文件。

[@overwrite_existing_file = ] 'overwrite_existing_file'

是可选的布尔型标志，该标志可指定是否重写与 @filename 中指定的名称相同的现有文件。overwrite_existing_file 的数据类型为 bit，默认设置为 0。如果为 1，则它将重写 @filename 所指定的文件（如果该文件存在）。如果为 0，则该存储过程将失败（如果文件存在），并且该文件未被重写。

返回代码值

0（成功）或 1（失败）

注释

sp_copysubscription 用于所有类型的复制，可将订阅数据库复制到一个备用文件中，以便在订阅服务器上应用快照。必须将数据库配置为仅支持请求订阅。具有适当权限的用户可制作订阅数据库的复本，然后将订阅文件 (.msf) 用电子邮件发送、复制或传送到另一台订阅服务器，这样它就可在该订阅服务器上作为订阅附加。

该技术用于复制高度自定义的数据库，这类数据库包含触发器、存储过程、视图、UDF 等用户定义的对象以及默认值和规则这样的对象，这些对象本来不能通过复制传送。

权限

public 角色成员可以执行 sp_copysubscription。

请参见

备用快照位置

系统存储过程


sp_deletemergeconflictrow

删除冲突表或 msmerge_delete_conflicts 表中的行。该存储过程在存储有冲突表的计算机的任何数据库中执行。

语法

sp_deletemergeconflictrow [ [ @conflict_table = ] 'conflict_table' ]
[ , [ @source_object = ] 'source_object' ]
{ , [ @rowguid = ] 'rowguid'
, [ @origin_datasource = ] 'origin_datasource' ] }
[ , [ @drop_table_if_empty = ] 'drop_table_if_empty' ]

参数

[@conflict_table =] 'conflict_table'

是冲突表名。conflict_table 的数据类型为 sysname，默认设置为 %。如果将 conflict_table 指定为 NULL 或 %，则假定冲突为删除冲突，并从 MSmerge_delete_conflicts 表中删除与 rowguid 和origin_datasource 及 source_object 相匹配的行。

[@source_object = ] 'source_object'

是源表名。source_object 的数据类型为 nvarchar(386)，默认设置为 NULL。

[@rowguid = ] 'rowguid'

是删除冲突的行标识符。rowguid 的数据类型为 uniqueidentifier，没有默认设置。

[@origin_datasource =] 'origin_datasource'

是冲突的起点。origin_datasource 的数据类型为 varchar(255)，没有默认设置。

[@drop_table_if_empty =] 'drop_table_if_empty'

是表示如果 conflict_table 为空要将其除去的标志。drop_table_if_empty 的数据类型为 varchar(10)，默认设置为 FALSE。

返回代码值

0（成功）或 1（失败）

注释

sp_deletemergeconflictrow 用于合并复制。

MSmerge_delete_conflicts 是系统表，即使为空也不将其从数据库中删除。

权限

只有 sysadmin 固定服务器角色成员或 db_owner 固定数据库角色成员才能执行 sp_deletemergeconflictrow。

请参见

系统存储过程


sp_disableagentoffload

禁用由 @job_id 参数标识的复制强制代理程序的远程强制代理程序激活。该存储过程在发布服务器的发布数据库上执行。

语法

sp_disableagentoffload [ @job_id = ] job_id
[ , [ @offloadserver = ] 'remote_agent_server_name' ]
[ , [ @agent_type = ] 'agent_type' ]

参数

[@job_id = ] 'job_id'

指定从远程激活禁用复制代理程序的 SQL Server 代理程序作业标识符。job_id 的数据类型为 varbinary(16)，没有默认设置。

[@offloadserver = ] 'remote_agent_server_name'

指定用于远程代理程序激活的服务器的网络名称。remote_agent_server_name 的数据类型为 sysname，默认设置为 NULL。如果是 NULL，则使用 MSDistribution_agents 表中的当前 offload_server。

是代理程序类型。agent_type 的数据类型为 sysname，默认设置为 NULL，用以指定系统将确定代理程序类型是 distribution 还是 merge。有效值为 distribution、merge 或 NULL。

返回代码值

0（成功）或 1（失败）

注释

sp_disableagentoffload 用于删除在另一台服务器上运行分发代理程序或合并代理程序处理的能力。

成功完成 sp_disableagentoffload 后，将立即从复制代理程序命令行删除 –Offload offloadserver 参数。另外，MSDistribution_agents 中用于代理程序的 offload_enabled 字段将设置为 0，offload-server 字段将更新为 'remote_agent_server_name' 中指定的新值（如果提供了新值）。

权限

只有 sysadmin 固定服务器角色成员、db_owner 固定数据库角色成员或者指定代理程序的订阅所有者才能执行 sp_disableagentoffload。

请参见

DTS 包详细信息

MSmerge_delete_conflicts

远程代理程序激活

sp_enableagentoffload

系统存储过程


sp_drop_agent_parameter

从 MSagent_parameters 表内的配置中除去一个或全部参数。该存储过程在运行代理程序的分发服务器上的任何数据库中执行。

语法

sp_drop_agent_parameter [ @profile_id = ] profile_id
[ , [ @parameter_name = ] 'parameter_name' ]

参数

[@profile_id = ] profile_id

是要除去其参数的配置 ID。profile_id 的数据类型为 int，没有默认设置。

[@parameter_name = ] 'parameter_name'

是要除去的参数名。parameter_name 的数据类型为 sysname，默认设置为 %。如果是 %，则表示除去指定配置的全部参数。

返回代码值

0（成功）或 1（失败）

注释

sp_drop_agent_parameter 用于所有类型的复制。

权限

只有 sysadmin 固定服务器角色成员才能执行 sp_drop_agent_parameter。

请参见

sp_add_agent_parameter

sp_help_agent_parameter

系统存储过程


sp_drop_agent_profile

从 MSagent_profiles 表中除去配置。该存储过程在分发服务器的任何数据库上执行。

语法

sp_drop_agent_profile [ @profile_id = ] profile_id

参数

[@profile_id = ] profile_id

是要除去的配置 ID。profile_id 的数据类型为 int，没有默认设置。

返回代码值

0（成功）或 1（失败）

注释

sp_drop_agent_profile 用于所有类型的复制。

给定配置的参数也将从 MSagent_parameters 表中除去。

权限

只有 sysadmin 固定服务器角色成员才能执行 sp_drop_agent_profile。

请参见

sp_add_agent_profile

sp_change_agent_profile

sp_help_agent_profile

系统存储过程


sp_dropanonymouseagent

从发布服务器中除去分发服务器上的匿名复制代理程序。该存储过程在发布服务器的任何数据库上执行。

语法

sp_dropanonymousagent [ @subid = ] sub_id
, [ @type = ] type

参数

[@subid = ] sub_id

是匿名订阅的全局标识符。sub_id 的数据类型为 uniqueidentifier，没有默认设置。可以使用 sp_helppullsubscription 在订阅服务器上检索该标识符。返回的结果集中 subid 字段内的值为该全局标识符。

[@type = ] type

是订阅类型。type 的数据类型为 int，没有默认设置。有效值为 1 或 2。如果是使用分发代理程序的快照复制或事务复制，则指定 1。如果是使用合并代理程序的合并复制，则指定 2。

返回代码值

0（成功）或 1（失败）

注释

sp_dropanonymousagent 用于所有类型的复制。

该存储过程只用于除去匿名订阅代理程序，而不能用于除去众所周知的订阅。

权限

只有 sysadmin 固定服务器角色成员、db_owner 固定数据库角色成员或启动首次运行该代理程序的用户登录才能执行 sp_dropanonymousagent。


sp_droparticle

除去快照发布或事务发布中的项目。如果一个项目有一个或多个订阅存在，则不能删除该项目。该存储过程在发布服务器的发布数据库上执行。

语法

sp_droparticle [ @publication = ] 'publication'
, [ @article = ] 'article'
[ , [ @ignore_distributor = ] ignore_distributor ]
 [ , [ @force_invalidate_snapshot = ] force_invalidate_snapshot ]

参数

[@publication =] 'publication'

是包含要除去的项目的发布名称。publication 的数据类型为 sysname，没有默认设置。

[@article =] 'article'

是要除去的项目名。article 的数据类型为 sysname，没有默认设置。

[@ignore_distributor = ] ignore_distributor

仅限内部使用。

返回代码值

0（成功）或 1（失败）

注释

sp_droparticle 用于所有类型的复制。

对于水平筛选的项目，sp_droparticle 检查项目在 sysarticles 表内的 type 列，以决定视图或筛选是否也应被除去。如果视图或筛选是自动生成的，则将与项目一起除去。如果是由手动创建的，则不除去。

权限

只有 sysadmin 固定服务器角色成员或 db_owner 固定数据库角色成员才能执行 sp_droparticle。

请参见

sp_addarticle

sp_addpublication

sp_articlecolumn

sp_changearticle

sp_changepublication

sp_droppublication

sp_enumfullsubscribers

sp_helparticle

sp_helparticlecolumns

sp_helppublication

系统存储过程


sp_dropdistpublisher

除去分发发布者。该存储过程在分发服务器的任何数据库上执行。

语法

sp_dropdistpublisher [ @publisher = ] 'publisher'
[ , [ @no_checks = ] no_checks ]

参数

[@publisher =] 'publisher'

是要除去的发布服务器。publisher 的数据类型为 sysname，没有默认设置。

[@no_checks =] no_checks

指定 sp_dropdistpublisher 是否进行检查以确保发布服务器已卸载用作分发服务器的服务器。no_checks 的数据类型为 bit，默认设置为 0。如果是 0 且分发发布者是远程服务器，则该存储过程将验证远程发布服务器已卸载用作分发服务器的本地服务器。如果是 0 且分发发布者是本地服务器，则该存储过程将验证没有发布对象或分发对象保留在本地服务器上。如果是 1，则表示除去所有与分发发布者关联的复制对象。完成此操作后，远程发布服务器必须使用带 @ignore_distributor = 1 参数的 sp_dropdistributor 卸载复制。

返回代码值

0（成功）或 1（失败）

注释

sp_dropdistpublisher 用于所有类型的复制。

权限

只有 sysadmin 固定服务器角色成员才能执行 sp_dropdistpublisher。

请参见

sp_adddistpublisher

sp_changedistpublisher

sp_helpdistpublisher

系统存储过程


sp_dropdistributiondb

除去分发数据库。如果一个数据库所用的物理文件未由另一个数据库使用，则除去这些文件。该存储过程在分发服务器的任何数据库上执行。

语法

sp_dropdistributiondb [ @database = ] 'database'

参数

[@database =] 'database'

是要除去的数据库。database 的数据类型为 sysname，没有默认设置。

返回代码值

0（成功）或 1（失败）

注释

sp_dropdistributiondb 用于所有类型的复制。

必须先执行 sp_dropdistributor 除去分发服务器后再执行该存储过程。

权限

只有 sysadmin 固定服务器角色成员才能执行 sp_dropdistributiondb。

请参见

sp_adddistributiondb

sp_changedistributiondb

sp_helpdistributiondb

系统存储过程


sp_dropdistributor

卸载分发服务器。该存储过程在分发服务器的任何数据库上执行。

语法

sp_dropdistributor [ [ @no_checks = ] no_checks ]
[ , [ @ignore_distributor = ] ignore_distributor ]

参数

[@no_checks =] no_checks

表示在除去分发服务器前是否检查相关对象。no_checks 的数据类型为 bit，默认设置为 0。如果是 0，则表示 sp_dropdistributor 将进行检查以确保不仅除去分发服务器，还除去所有发布对象和分发对象。如果是 1，则表示 sp_dropdistributor 不进行检查即除去所有发布对象和分发对象。

[@ignore_distributor =] ignore_distributor

表示是否在不连接到分发服务器的情况下执行该存储过程。ignore_distributor 的数据类型为 bit，默认设置为 0。如果是 0，则表示 sp_dropdistributor 连接到分发服务器并删除所有复制对象。如果 sp_dropdistributor 不能连接到分发服务器，则该存储过程失败。如果是 1，则表示不与分发服务器建立连接，也不删除复制对象。如果分发服务器正卸载或永久脱机，则使用该设置。不会删除分发服务器上的发布服务器对象，直到在将来的某个时间重新安装分发服务器。

返回代码值

0（成功）或 1（失败）

注释

sp_dropdistributor 用于所有类型的复制。

如果在服务器上有其它的发布服务器或分发对象，则 sp_dropdistributor 将失败，除非 @no_checks 设置为 1。

必须先执行 sp_dropdistributiondb 除去分发数据库后再执行该存储过程。

权限

只有 sysadmin 固定服务器角色成员才能执行 sp_dropdistributor。

请参见

sp_adddistributor

sp_changedistributor_property

sp_helpdistributor

系统存储过程


sp_dropmergealternatepublisher

删除合并发布中的备用发布服务器。该存储过程在订阅服务器的订阅数据库上执行。

语法

sp_dropmergealaternatepublisher [ @publisher = ] 'publisher'
, [ @publisher_db = ] 'publisher_db'
, [ @publication = ] 'publication'
, [ @alternate_publisher = ] 'alternate_publisher'
, [ @alternate_publisher_db = ] 'alternate_publisher_db'
, [ @alternate_publication = ] 'alternate_publication'

参数

[@publisher =] 'publisher'

是当前发布服务器的名称。publisher 的数据类型为 sysname，没有默认设置。

[@publisher_db =] 'publisher_db'

是当前发布数据库的名称。publisher_db 的数据类型为 sysname，没有默认设置。

[@publication = ] 'publication'

是当前发布的名称。publication 的数据类型为 sysname，没有默认设置。

[@alternate_publisher =] 'alternate_publisher'

是要作为可选同步伙伴除去的备用发布服务器的名称。alternate_publisher 的数据类型为 sysname，没有默认设置。

[@alternate_publisher_db =] 'alternate_publisher_db'

是作为可选同步伙伴发布数据库除去的发布数据库的名称。alternate_publisher_db 的数据类型为 sysname，没有默认设置。

[@alternate_publication =] 'alternate_publication'

将作为可选同步伙伴发布除去的发布的名称。alternate_publication 的数据类型为 sysname，没有默认设置。

返回代码值

0（成功）或 1（失败）

注释

sp_dropmergealternatepublisher 用于合并复制。

权限

只有 sysadmin 固定服务器角色成员或 db_owner 固定数据库角色成员才能执行 sp_dropmergelternatepublisher。


sp_dropmergearticle

删除合并发布中的项目。该存储过程在发布服务器的发布数据库上执行。

语法

sp_dropmergearticle [ @publication = ] 'publication'
, [ @article = ] 'article'
[ , [ @ignore_distributor = ] ignore_distributor
[ , [ @reserved = ] reserved
[ , [ @force_invalidate_snapshot = ] force_invalidate_snapshot ]

参数

[@publication =] 'publication'

是要从中除去项目的发布名称。publication 的数据类型为 sysname，没有默认设置。

[@article =] 'article'

是要从给定发布中除去的项目名。article 的数据类型为 sysname，没有默认设置。如果是 all，则表示删除指定合并发布中的所有现有项目。即使 article 为 all，发布仍然必须与项目分开除去。

[@ignore_distributor =] ignore_distributor

表示是否在不连接到分发服务器的情况下执行该存储过程。ignore_distributor 的数据类型为 bit，默认设置为 0。

[@reserved = ] reserved

保留以备将来使用。reserved 的数据类型为 nvarchar(20)，默认设置为 NULL。

[@force_invalidate_snapshot = ] force_invalidate_snapshot

启用或禁用使快照无效的能力。force_invalidate_snapshot 的数据类型为 bit，默认设置为 0。0 指定对合并项目的更改将不会导致快照无效。1 表示对合并项目的更改可能导致快照无效，并且如果如此，值 1 将赋予新快照发生的权限。

返回代码值

0（成功）或 1（失败）

注释

sp_dropmergearticle 用于合并复制。仅当没有当前发布的活动订阅时才允许 sp_dropmergearticle。如果存在现有的订阅，则不允许除去一个或多个项目。

权限

只有 sysadmin 固定服务器角色成员或 db_owner 固定数据库角色成员才能执行 sp_dropmergearticle。

请参见

sp_addmergearticle

sp_changemergearticle

sp_helpmergearticle

系统存储过程


sp_dropmergefilter

除去合并筛选。sp_dropmergefilter 除去在要除去的合并筛选上定义的所有合并筛选列。该存储过程在发布服务器的发布数据库上执行。

语法

sp_dropmergefilter [ @publication = ] 'publication'
, [ @article = ] 'article'
, [ @filtername = ] 'filtername'
[ , [ @force_invalidate_snapshot = ] force_invalidate_snapshot ]

参数

[@publication =] 'publication'

是发布名称。publication 的数据类型为 sysname，没有默认设置。

[@article =] 'article'

是项目名。article 的数据类型为 sysname，没有默认设置。

[@filtername =] 'filtername'

是要除去的筛选名。filtername 的数据类型为 sysname，没有默认设置。

[@force_invalidate_snapshot = ] force_invalidate_snapshot

启用或禁用使快照无效的能力。force_invalidate_snapshot 的数据类型为 bit，默认设置为 0。0 指定对合并项目的更改将不会导致快照无效。1 表示对合并项目的更改可能导致快照无效，并且如果如此，值 1 将赋予新快照发生的权限。

返回代码值

0（成功）或 1（失败）

注释

sp_dropmergefilter 用于合并复制。

权限

只有 sysadmin 固定服务器角色成员或 db_owner 固定数据库角色成员才能执行 sp_dropmergefilter。

请参见

sp_addmergefilter

sp_changemergefilter

sp_helpmergefilter

系统存储过程


sp_dropmergepublication

除去合并发布及其关联的快照代理程序。在除去合并发布之前必须除去所有的订阅。发布中的项目将自动除去。该存储过程在发布服务器的发布数据库上执行。

语法

sp_dropmergepublication [ @publication = ] 'publication'
[ , [ @ignore_distributor = ] ignore_distributor ]
[ , [ @reserved = ] reserved ]

参数

[@publication =] 'publication'

是要除去的发布名称。publication 的数据类型为 sysname，没有默认设置。如果为 all，则表示删除所有现有的合并发布及其关联快照。如果指定其它值，则除去与该发布关联的快照代理程序。

[@ignore_distributor = ] ignore_distributor

ignore_distributor 的数据类型为 bit，默认设置为 0。该参数可用于除去发布但不清除分发服务器上的任务。如果不得不重新安装分发服务器，该参数也很有用。

[@reserved = ] reserved

保留以备将来使用。reserved 的数据类型为 bit，默认设置为 0。

返回代码值

0（成功）或 1（失败）

注释

sp_dropmergepublication 用于合并复制。

权限

只有 sysadmin 固定服务器角色成员或 db_owner 固定数据库角色成员才能执行 sp_dropmergepublication。

请参见

sp_addmergepublication

sp_changemergepublication

sp_helpmergepublication

系统存储过程


sp_dropmergepullsubscription

除去合并请求订阅。该存储过程在订阅服务器的订阅数据库上执行。

语法

sp_dropmergepullsubscription [ [ @publication = ] 'publication' ]
[ , [ @publisher = ] 'publisher' ]
[ , [ @publisher_db = ] 'publisher_db' ]
    [ , [ @reserved = ] 'reserved' ]

参数

[@publication =] 'publication'

是发布名称。publication 的数据类型为 sysname，默认值为 NULL。

[@publisher =] 'publisher'

是发布服务器名称。publisher 的数据类型为 sysname，默认设置为 NULL。

[@publisher_db =] 'publisher_db'

是发布服务器数据库名。publisher_db 的数据类型为 sysname，默认设置为 NULL。

[@reserved = ] reserved

保留以备将来使用。reserved 的数据类型为 bit，默认设置为 0。

返回代码值

0（成功）或 1（失败）

注释

sp_dropmergepullsubscription 用于合并复制。

sp_dropmergepullsubscription 除去合并请求订阅的合并代理程序，但是合并代理程序不是在 sp_addmergepullsubscription 中创建的。也请注意此时假定本地服务器和当前数据库为 subscriber 和 subscriber_db。

权限

只有 sysadmin 固定服务器角色成员或 db_owner 固定数据库角色成员才能执行 sp_dropmergepullsubscription。

请参见

sp_addmergepullsubscription

sp_changemergepullsubscription

sp_helpmergepullsubscription

系统存储过程


sp_dropmergesubscription

除去对合并发布的订阅及其关联的合并代理程序。该存储过程在发布服务器的发布数据库上执行。

语法

sp_dropmergesubscription [ [ @publication = ] 'publication' ]
[ , [ @subscriber = ] 'subscriber'
[ , [ @subscriber_db = ] 'subscriber_db' ]
[ , [ @subscription_type =] 'subscription_type']
[ , [ @ignore_distributor = ] ignore_distributor ]
[ , [ @reserved = ] reserved ]

参数

[@publication =] 'publication'

是发布名称。publication 的数据类型为 sysname，默认设置为 NULL。发布必须已存在而且必须遵从标识符规则。

[@subscriber =] 'subscriber'

是订阅服务器名。subscriber 的数据类型为 sysname，默认设置为 NULL。

[@subscriber_db = ] 'subscriber_db'

是订阅数据库名。subscription_database 的数据类型为 sysname，默认设置为 NULL。

[@subscription_type =] 'subscription_type'

是订阅的类型。subscription_type 的数据类型为 nvarchar(15)，可以是下列值之一。

值 | 描述
push | 强制订阅。
pull | 请求订阅。
both（默认值） | 强制订阅和请求订阅。

[@ignore_distributor =] ignore_distributor

表示是否在不连接到分发服务器的情况下执行该存储过程。ignore_distributor 的数据类型为 bit，默认设置为 0。该参数可用于除去订阅但不清除分发服务器上的任务。如果不得不重新安装分发服务器，该参数也很有用。

[@reserved = ] reserved

保留以备将来使用。reserved 的数据类型为 bit，默认设置为 0。

返回代码值

0（成功）或 1（失败）

注释

sp_dropmergesubscription 用于合并复制。

权限

只有 sysadmin 固定服务器角色成员或 db_owner 固定数据库角色成员才能执行 sp_dropmergesubscription。

请参见

sp_addmergesubscription

sp_changemergesubscription

sp_helpmergesubscription

系统存储过程


sp_droppublication

除去发布及其关联的项目。该存储过程在发布服务器的发布数据库上执行。

语法

sp_droppublication [ @publication = ] 'publication'
[ , [ @ignore_distributor = ] ignore_distributor ]

参数

[@publication =] 'publication'

是要除去的发布名称。publication 的数据类型为 sysname，没有默认设置。如果指定 all，则表示从发布数据库中除去所有发布，但含有订阅的发布除外。

[@ignore_distributor =] ignore_distributor

仅限内部使用。

返回代码值

0（成功）或 1（失败）

注释

sp_droppublication 用于快照复制和事务复制。

sp_droppublication 递归除去所有与发布关联的项目，然后除去发布本身。如果发布含有一个或更多的订阅，则不能删除该发布。关联的同步任务也将除去。

权限

只有 sysadmin 固定服务器角色成员或 db_owner 固定数据库角色成员才能执行 sp_droppublication。

请参见

sp_addarticle

sp_addpublication

sp_articlecolumn

sp_changearticle

sp_changepublication

sp_droparticle

sp_enumfullsubscribers

sp_helparticle

sp_helparticlecolumns

sp_helppublication

系统存储过程


sp_droppullsubscription

在订阅服务器的当前数据库上除去订阅。该存储过程在订阅服务器的请求订阅数据库上执行。

语法

sp_droppullsubscription [ @publisher = ] 'publisher'
, [ @publisher_db = ] 'publisher_db'
, [ @publication = ] 'publication'
[ , [ @reserved = ] reserved ]

参数

[@publisher =] 'publisher'

是远程服务器名。publisher 的数据类型为 sysname，没有默认设置。如果为 all，则表示在所有发布服务器上除去订阅。

[@publisher_db =] 'publisher_db'

是发布服务器数据库名。publisher_db 的数据类型为 sysname，没有默认设置。all 表示所有的发布服务器数据库。

[@publication =] 'publication'

是发布名称。publication 的数据类型为 sysname，没有默认设置。如果为 all，则表示除去对所有发布的订阅。

[@reserved = ] reserved

仅限内部使用。

返回代码值

0（成功）或 1（失败）

注释

sp_droppullsubscription 用于快照复制和事务复制。

sp_droppullsubscription 删除 MSreplication_subscriptions 表内相应的行以及订阅服务器上相应的分发服务器代理程序。如果在 Msreplication_subscriptions 内没有剩下任何行，则将除去该表。

权限

只有 sysadmin 固定服务器角色成员或 db_owner 固定数据库角色成员才能执行 sp_droppullsubscription。

请参见

sp_addpullsubscription

系统存储过程


sp_dropsubscriber

从已注册的服务器中删除订阅服务器指派。该存储过程在发布服务器的发布数据库上执行。

语法

sp_dropsubscriber [ @subscriber = ] 'subscriber'
[ , [ @reserved = ] 'reserved' ]
    [ , [ @ignore_distributor = ] ignore_distributor ]

参数

[@subscriber = ] 'subscriber'

是要除去的订阅服务器名。subscriber 的数据类型为 sysname，没有默认设置。

[@reserved = ] 'reserved'

仅限内部使用。

[@ignore_distributor =] ignore_distributor

仅限内部使用。

返回代码值

0（成功）或 1（失败）

注释

sp_dropsubscriber 用于所有类型的复制。

该存储过程删除服务器 sub 选项，还删除到 repl_subscriber 的系统管理员远程登录映射。

权限

只有 sysadmin 固定服务器角色成员才能执行 sp_dropsubscriber。

请参见

sp_addsubscriber

sp_changesubscriber

sp_dboption

sp_helpdistributor

sp_helpserver

sp_helpsubscriberinfo

系统存储过程


sp_dropsubscription

除去对发布服务器上的特定项目、发布或订阅集的订阅。该存储过程在发布服务器的发布数据库上执行。

语法

sp_dropsubscription [ [ @publication = ] 'publication' ]
[ , [ @article = ] 'article' ]
[ @subscriber = ] 'subscriber'
[ , [ @destination_db = ] 'destination_db' ]
[ , [ @ignore_distributor = ] ignore_distributor ]
[ , [ @reserved = ] 'reserved' ]

参数

[@publication =] 'publication'

是关联的发布名称。publication 的数据类型为 sysname，默认设置为 NULL。如果为 all，则表示取消指定订阅服务器的所有发布的所有订阅。

[@article =] 'article'

是项目名。article 的数据类型为 sysname，默认设置为 NULL。如果为 all，则表示除去对各指定发布和订阅服务器的所有项目的订阅。如果没有提供 article，则表示除去发布中的所有项目的订阅。对即时同步发布使用 all。

[@subscriber = ] 'subscriber'

是要除去订阅的订阅服务器名。subscriber 的数据类型为 sysname，没有默认设置。如果为 all，则表示除去所有订阅服务器的所有订阅。

[@destination_db = ] 'destination_db'

是目的数据库名。destination_db 的数据类型为 sysname，默认设置为 NULL。如果为 NULL，则表示从该订阅服务器中除去所有订阅。

[@ignore_distributor =] ignore_distributor

仅限内部使用。

[@reserved = ] 'reserved'

仅限内部使用。

返回代码值

0（成功）或 1（失败）

注释

sp_dropsubscription 用于快照复制和事务复制。

如果除去即时同步发布中的一个项目上的订阅，则不能将其添加回来，除非是除去发布中所有项目上的订阅并将它们同时添加回来。

权限

只有 sysadmin 固定服务器角色成员或 db_owner 固定数据库角色成员才能执行 sp_dropsubscription。来自订阅服务器的远程连接可以除去对现有发布或项目的订阅。

请参见

sp_addsubscription

sp_changesubstatus

sp_helpsubscription

系统存储过程


sp_dsninfo

从与当前服务器关联的分发服务器返回 ODBC 或 OLE DB 数据源信息。该存储过程在分发服务器的任何数据库上执行。

语法

sp_dsninfo [@dsn =] 'dsn'
[, [@infotype =] 'info_type']
[ , [ @login =] 'login']
[ , [ @password =] 'password']
[, [@dso_type =] dso_type]

参数

[@dsn =] 'dsn'

是 ODBC DSN 或 OLE DB 链接服务器名。dsn 的数据类型为 varchar(128)，没有默认设置。

[@infotype =] 'info_type'

是要返回的信息类型。如果没有指定 info_type 或指定了 NULL，则表示返回所有的信息类型。info_type 的数据类型为 varchar(128)，默认设置为 NULL，可以是下列值之一。

值 | 描述
DBMS_NAME | 指定数据源供应商名。
DBMS_VERSION | 指定数据源版本。
DATABASE_NAME | 指定数据库名。
SQL_SUBSCRIBER | 指定数据源可以是订阅服务器。

[@login = ] 'login'

是数据源的登录。如果数据源包含登录，则指定 NULL 或省略该参数。login 的数据类型为 varchar(128)，默认设置为 NULL。

[@password = ] 'password'

是登录密码。如果数据源包含登录，指则定 NULL 或省略该参数。password 的数据类型为 varchar(128)，默认设置为 NULL。

[@dso_type =] dso_type

是数据源类型。dso_type 的数据类型为 int，可以是下列值之一。

值 | 描述
1（默认值） | ODBC 数据源
3 | OLE DB 数据源

返回代码值

0（成功）或 1（失败）

结果集
列名 | 数据类型 | 描述
Information Type | nvarchar(64) | 信息类型，例如 DBMS_NAME、DBMS_VERSION、DATABASE_NAME、SQL_SUBSCRIBER。
Value | nvarchar(512) | 关联信息类型的值。

注释

sp_dsninfo 用于所有类型的复制。

sp_dsninfo 检索 ODBC 或 OLE DB 数据源信息，这些信息显示数据库是否可以用于复制或查询。

权限

只有 sysadmin 固定服务器角色成员才能执行 sp_dsninfo。

请参见

sp_enumdsn

系统存储过程


sp_dumpparamcmd

返回存储在分发数据库中的参数化命令的详细信息。该存储过程在分发服务器的分发数据库上执行。

语法

sp_dumpparamcmd [ @originator_id =] 'originator_id'
, [ @publisher_database_id =] 'publisher_database_id'
, [ @article_id =] 'article_id'
, [ @xact_seqno =] 'xact_seqno'

参数

[@originator_id =] 'originator_id'

是要返回其参数化命令的 originator_id。originator_id 的数据类型为 int，没有默认设置。

[@publisher_database_id =] 'publisher_database_id'

是要返回其参数化命令的 publisher_database_id。publisher_database_id 的数据类型为 int，没有默认设置。

[@article_id = ] 'article_id'

是要返回其参数化命令的 article_id。article_id 的数据类型为 int，没有默认设置。

[@xact_seqno =] 'xact_seqno'

是要显示其参数化命令的精确序列号。xact_seqno 的数据类型为 nchar(22)，没有默认设置。

结果集

sp_dumpparamcmd 是一个诊断过程，用于在单个事务内检索有关参数化命令的详细信息。sp_dumpparamcmd 为事务内的各参数化命令返回两个结果集。

列名 | 数据类型 | 描述
bytes | int | Transact-SQL 的字节数。
params | smallint | 语句中的参数个数。
command | nvarchar(1024) | Transact-SQL 命令。

说明 在结果集内，长命令可以拆分在几行上。在结果集内，长的值也可以拆分在几行上。

第二个结果集包含各参数的一个或多个行。

列名 | 数据类型 | 描述
paramid | smallint | 参数的 ID。
offset | int | 数据流内的字节偏移量。
repltype | nvarchar(20) | 类型信息。
storage | nvarchar(20) | 存储信息。
align | int | 数据的对齐。
ctype | nvarchar(20) | ODBC C 类型信息。
sqltype | nvarchar(20) | ODBC SQL 类型信息。
prec | int | 值的精度。
scale | smallint | 值的小数位数。
token_fragment | nvarchar(1024) | 显示以文本格式存储在该令牌内的值。

注释

sp_dumpparamcmd 用于事务复制。

权限

只有 sysadmin 固定服务器角色成员才能执行 sp_ dumpparamcmd。

请参见

sp_browsereplcmds

sp_replcmds

sp_replshowcmds

系统存储过程


sp_enableagentoffload

启用由 @job_id 参数标识的复制强制代理程序的远程代理程序激活。该存储过程在当前作为远程代理服务器的计算机上运行。该存储过程在发布服务器的发布数据库上执行。

语法

sp_enableagentoffload [ @job_id = ] job_id
[ , [ @offloadserver = ] 'remote_agent_server_name' ]
[ , [ @agent_type = ] 'agent_type' ]

参数

[@job_id = ] 'job_id'

指定从远程激活启用复制代理程序的 SQL Server 代理程序作业标识符。job_id 的数据类型为 varbinary(16)，没有默认设置。

[@offloadserver = ] 'remote_agent_server_name'

指定用于远程代理程序激活的服务器的网络名称。remote_agent_server_name 的数据类型为 sysname，默认设置为 NULL。如果是 NULL，则使用 MSDistribution_agents 表中的当前 offload_server。

[@agent_type = ] 'agent_type'

是代理程序类型。agent_type 的数据类型为 sysname，默认设置为 NULL，用以指定系统将确定代理程序类型是 distribution 还是 merge。有效值为 distribution、merge 或 NULL。

返回代码值

0（成功）或 1（失败）

注释

sp_enableagentoffload 用于在其它服务器上启用分发代理程序或合并代理程序。

成功完成 sp_enableagentoffload 后，–Offload offloadserver 参数将被立即附加到复制代理程序命令行，或者如果 –Offload offloadserver 参数已经存在于命令行，则用新的 remote_agent_server_name 更新 –Offload offloadserver 参数。

同样，MSDistribution_agents 中用于代理程序的 offload_enabled 字段将设置为 1，并将用 'remote_agent_server_name' 中指定的新值（如果有）更新 offload-server 字段。

权限

只有 sysadmin 固定服务器角色成员、db_owner 固定数据库角色成员或指定代理程序的订阅所有者才能执行 sp_enableagentoffload。

请参见

DTS 包详细信息

远程代理程序激活

系统存储过程


sp_enumcustomresolvers

返回所有可用的自定义冲突解决程序的列表。该存储过程在发布服务器的任何数据库上执行。

语法

sp_enumcustomresolvers [[@distributor =] 'distributor']

参数

[@distributor = ] 'distributor'

是自定义冲突解决程序所在的分发服务器名。distributor 的数据类型为 sysname，默认设置为 NULL。

结果集
列名 | 数据类型 | 描述
value | ntext | 自定义冲突解决程序的名称。
data | ntext | 自定义冲突解决程序的类 ID。

返回代码值

0（成功）或 1（失败）

注释

sp_enumcustomresolvers 用于合并复制。

权限

只有 sysadmin 固定服务器角色成员和 db_owner 固定数据库角色成员才能执行 sp_enumcustomresolvers。

请参见

系统存储过程


sp_enumdsn

返回运行于特定 Microsoft® Windows NT® 用户帐户下的服务器的所有已定义 ODBC 和 OLE DB 数据源名称列表。该存储过程在发布服务器的任何数据库上执行。

语法

sp_enumdsn

返回代码值

0（成功）或 1（失败）

结果集
列名 | 数据类型 | 描述
Data Source Name | sysname | 数据源的名称。
Description | varchar(255) | 对数据源的描述。
Type | int | 数据源类型： 1 = ODBC DSN 3 = OLE DB 数据源
Provider Name | varchar(255) | OLE DB 提供程序的名称。ODBC DSN 的值为 NULL。

注释

每一个 Microsoft SQL Server™ 服务都有用户上下文。用户上下文是一组注册表项，其中包含用户的 ODBC 数据源定义。用户上下文由 SQL Server 正在其下运行的用户名提供。

例如，如果服务器在系统帐户用户上下文下运行，则返回的 DSN 将全部是与系统帐户关联的系统 DSN。如果服务器在专用用户帐户下运行，则只返回为该用户的专用帐户定义的 DSN。

权限

只有 sysadmin 固定服务器角色成员才能执行 sp_enumdsn。

请参见

sp_dsninfo

系统存储过程


sp_enumfullsubscribers

返回已订阅指定发布中的所有项目的订阅服务器列表。该存储过程在发布服务器的发布数据库上执行。

语法

sp_enumfullsubscribers [[@publication =] 'publication']

参数

[@publication = ] 'publication'

是发布名称。publication 的数据类型为 sysname，默认设置为 %。如果未指定 publication，则返回所有发布。

返回代码值

0（成功）或 1（失败）

结果集
列名 | 数据类型 | 描述
subscriber | sysname | 订阅服务器名

注释

sp_enumfullsubscribers 用于快照复制、事务复制和合并复制。

权限

只有 sysadmin 固定服务器角色成员或 db_owner 固定数据库角色成员才能执行 sp_enumfullsubscribers。

请参见

sp_addarticle

sp_addpublication

sp_articlecolumn

sp_changearticle

sp_changepublication

sp_droparticle

sp_droppublication

sp_helparticle

sp_helparticlecolumns

sp_helppublication

系统存储过程


sp_expired_subscription_cleanup

定期检查每个发布的所有订阅状态，并标识过期的订阅。该存储过程在发布服务器的任何数据库上执行。

语法

sp_expired_subscription_cleanup

返回代码值

0（成功）或 1（失败）

注释

sp_expired_subscription_cleanup 用于所有类型的复制。

sp_expired_subscription_cleanup 每隔 24 小时检查一次所有订阅的状态。如果有任何订阅过期，也就是说，已经有太长的时间与发布服务器失去联系，则声明发布已过期并在发布服务器上清除该订阅的跟踪。

权限

只有 sysadmin 固定服务器角色成员或 db_owner 固定数据库角色成员才能执行 sp_expired_subscription_cleanup。

请参见

sp_mergesubscription_cleanup

sp_subscription_cleanup

系统存储过程


sp_generatefilters

当复制指定的表时在外键表上创建筛选。该存储过程在发布服务器的发布数据库上执行。

语法

sp_generatefilters [@publication =] 'publication'

参数

[@publication =] 'publication'

是要筛选的发布名称。publication 的数据类型 sysname，没有默认设置。

返回代码值

0（成功）或 1（失败）

注释

sp_generatefilters 用于合并复制。

权限

只有 sysadmin 固定服务器角色成员或 db_owner 固定数据库角色成员才能执行 sp_generatefilters。

请参见

sp_bindsession

系统存储过程


sp_get_distributor

确定是否在服务器上安装分发服务器。该存储过程在正在查找的分发服务器所在的计算机中的任何数据库上执行。

语法

sp_get_distributor

结果集
列名 | 数据类型 | 描述
installed | int | 0 = 否 1 = 是
distribution server | sysname | 分发服务器名
distribution db installed | int | 0 = 否 1 = 是
is distribution publisher | int | 0 = 否 1 = 是
has remote distribution publisher | int | 0 = 否 1 = 是

注释

sp_get_distributor 主要由 Microsoft SQL Server 企业管理器用于快照复制、事务复制和合并复制。

权限

public 角色成员可以执行 sp_get_distributor。

请参见

系统存储过程


sp_getagentoffloadinfo

从分发服务器中检索有关代理程序卸载状态的信息。该存储过程在发布服务器的发布数据库上执行。

语法

sp_getagentoffloadinfo [ @job_id = ] job_id

参数

[@job_id =] job_id

是复制代理程序作业 ID。job_id 的数据类型为 varbinary(16)，没有默认设置。

结果集
列名 | 数据类型 | 描述
offload_enabled | int | 指定复制代理程序的卸载执行是否被设置为在订阅服务器上运行。如果是 0，则代理程序在发布服务器上运行。如果是 1，则代理程序在订阅服务器上运行。
offload_server | sysname | 在其中运行代理程序的服务器名称。

返回代码值

0（成功）或 1（失败）

注释

sp_getagentoffloadinfo 用于所有类型的复制，但只能用在强制订阅上。

权限

只有 sysadmin 固定服务器角色成员或 db_owner 固定数据库角色成员才能执行 sp_getagentoffloadinfo。


sp_getmergedeletetype

返回合并删除的类型。该存储过程在发布服务器的发布数据库上或在订阅服务器的订阅数据库上执行。

语法

sp_getmergedeletetype [ @source_object =] 'source_object'
, [ @rowguid =] 'rowguid'
, [ @delete_type =] delete_type OUTPUT

参数

[@source_object = ] 'source_object'

是源对象名。source_object 的数据类型为 nvarchar(386)，没有默认设置。

[@rowguid =] 'rowguid'

是删除类型的行标识符。rowguid 的数据类型为 uniqueidentifier，没有默认设置。

[@delete_type =] delete_type OUTPUT

是表示删除类型的代码。delete_type 的数据类型为 int，没有默认设置。delete_type 还是 OUTPUT 参数，并且可以是下列值之一。

值 | 描述
1 | 用户删除
5 | 部分删除
6 | 系统删除

注释

sp_getmergedeletetype 用于合并复制。

权限

只有 sysadmin 固定服务器角色成员或 db_owner 固定数据库角色成员才能执行 sp_getmergedeletetype。

请参见

系统存储过程


sp_getqueuedrows

在订阅服务器上检索在队列中有未决更新的行。该存储过程在订阅服务器的订阅数据库上执行。

语法

sp_getqueuedrows [ @tablename = ] 'tablename'
[ , [ @owner = ] 'owner'
[ , [ @tranid = ] 'transaction_id' ]

参数

[@tablename = ] 'tablename'

是表名。tablename 的数据类型为 sysname，没有默认设置。该表必须是排队订阅的一部分。

[@owner = ] 'owner'

是订阅所有者。owner 的数据类型为 sysname，默认设置为 NULL。

[@tranid = ] 'transaction_id'

允许用事务 ID 筛选输出。transaction_id 的数据类型为 nvarchar(70)，默认设置为 NULL。如果已指定，则显示与排队命令关联的事务 ID。如果是 NULL，则显示队列中的所有命令。

返回代码值

0（成功）或 1（失败）

结果集

显示所有当前对订阅表至少有一个排队事务的行。

列名 | 数据类型 | 描述
Action | nvarchar(10) | 同步发生时采取的操作类型。INS = 插入 DEL = 删除 UPD = 更新
Tranid | nvarchar(70) | 执行命令的事务 ID。
table column1...n |  | tablename 中指定的表中每列的值。
msrepl_tran_version | uniqueidentifier | 该列用于跟踪对已复制数据的更改以及在发布服务器上执行冲突检测。该列自动添加到表中。

注释

sp_getqueuedrows 用于参与排队更新的订阅服务器。

sp_getqueuedrows 查找订阅数据库上的给定表中已参与排队更新但当前还没有由排队读取器代理程序解析的行。

权限

public 角色成员可以执行 sp_getqueuedrows。

请参见

即时更新

即时更新考虑事项

排队更新冲突检测和解决

系统存储过程


sp_getsubscriptiondtspackagename

在将数据发送到订阅服务器之前返回用于转换数据的 DTS 包名称。该存储过程在发布服务器的任何数据库上执行。

语法

sp_getsubscriptiondtspackagename [ @publication = ] 'publication'
[ , [ @subscriber = ] 'subscriber' ]

参数

[@publication =] 'publication'

是发布名称。'publication' 的数据类型为 sysname，没有默认设置。

[@subscriber= ] 'subscriber'

是订阅服务器名称。subscriber 的数据类型为 sysname，默认设置为 NULL。

返回代码值

0（成功）或 1（失败）

结果集
列名 | 数据类型 | 描述
new_package_name | sysname | 显示 DTS 包的名称。

注释

sp_getsubscriptiondtspackagename 用于快照复制和事务复制。

权限

public 角色成员可以执行 sp_getsubscriptiondtspackagename。

请参见

如何转换已发布数据

系统存储过程

转换已发布的数据


sp_grant_publication_access

向发布的访问列表中添加登录。该存储过程在发布服务器的发布数据库上执行。

语法

sp_grant_publication_access [ @publication = ] 'publication'
, [ @login = ] 'login'
[ , [ @reserved = ] 'reserved' ]

参数

[@publication =] 'publication'

是要访问的发布名称。'publication' 的数据类型为 sysname，没有默认设置。

[ @login = ] 'login'

是登录 ID。'login' 的数据类型为 sysname，没有默认设置。

[@reserved = ] 'reserved'

仅限内部使用。

返回代码值

0（成功）或 1（失败）

注释

sp_grant_publication_access 用于快照复制、事务复制和合并复制。

该存储过程可以重复调用。

权限

只有 sysadmin 固定服务器角色成员或 db_owner 固定数据库角色成员才能执行 sp_grant_publication_access。

请参见

sp_help_publication_access

sp_revoke_publication_access

系统存储过程


sp_help_agent_default

检索作为参数传递的代理程序类型的默认配置 ID。该存储过程在分发服务器的任何数据库上执行。

语法

sp_help_agent_default [ @profile_id = ] profile_id OUTPUT
, [ @agent_type = ] agent_type

参数

[@profile_id =] profile_id OUTPUT

是代理程序类型的默认配置 ID。profile_id 的数据类型为 int，没有默认设置。profile_id 还是 OUTPUT 参数，并返回代理程序类型的默认配置 ID。

[@agent_type = ] 'agent_type'

是代理程序的类型。agent_type 的数据类型为 int，无默认值，可以是下列值之一。

Value | 描述
1 | 快照代理程序。
2 | 日志读取器代理程序。
3 | 分发代理程序。
4 | 合并代理程序。

注释

sp_help_agent_default 用于所有类型的复制。

权限

执行权限默认授予 public 角色。

请参见

系统存储过程


sp_help_agent_parameter

从 MSagent_parameters 系统表返回配置的所有参数。该存储过程在运行代理程序的分发服务器中的任何数据库上执行。

语法

sp_help_agent_parameter [ [ @profile_id = ] profile_id ]

参数

[@profile_id = ] profile_id

是 MSagent_profiles 表中的配置 ID。profile_id 的数据类型为 int，默认设置为 –1，表示返回所有参数。

结果集
列名 | 数据类型 | 描述
profile_id | int | 代理程序配置 ID。
parameter_name | sysname | 参数的名称。
value | nvarchar(255) | 参数值。

注释

sp_help_agent_parameter 用于所有类型的复制。

权限

执行权限默认授予 public 角色。

请参见

sp_add_agent_parameter

sp_drop_agent_parameter

系统存储过程


sp_help_agent_profile

显示指定代理程序的配置。该存储过程在分发服务器的任何数据库上执行。

语法

sp_help_agent_profile [ [ @agent_type = ] agent_type ]
[ , [ @profile_id = ] profile_id ]

参数

[@agent_type =] agent_type

是代理程序的类型。agent_type 的数据类型为 int，默认设置为 0，可以是下列值之一。

值 | 描述
1 | 快照代理程序
2 | 日志读取器代理程序
3 | 分发代理程序
4 | 合并代理程序

[@profile_id = ] profile_id

是要显示的配置 ID。profile_id 的数据类型为 int，默认设置为 –1，表示返回 MSagent_profiles 表中的所有配置。

结果集
列名 | 数据类型 | 描述
profile_id | int | 配置 ID。
profile_name | sysname | 对代理程序类型唯一。
agent_type | int | 1 = 快照代理程序 2 = 日志读取器代理程序 3 = 分发代理程序 4 = 合并代理程序
Type | int | 0 = 系统 1 = 自定义
description | varchar(3000) | 对配置的描述。
def_profile | bit | 指定该配置是否为该代理程序类型的默认设置。

注释

sp_help_agent_profile 用于所有类型的复制。

权限

执行权限默认授予 public 角色。

请参见

系统存储过程


sp_help_publication_access

返回发布的所有授权登录的列表。该存储过程在发布服务器的发布数据库上执行。

语法

sp_help_publication_access [ @publication = ] 'publication'
[ , [ @return_granted = ] 'return_granted' ]
[ , [ @login = ] 'login' ]
[ , [ @initial_list = ] initial_list ]

参数

[@publication =] 'publication'

是要访问的发布名称。publication 的数据类型为 sysname，无默认值。

[@return_granted =] 'return_granted'

是登录 ID。return_granted 的数据类型为 bit，默认设置为 1。如果指定 0 并使用 SQL Server 身份验证，则返回出现在发布服务器而非分发服务器上的可用登录。如果为 0 并使用 Windows 身份验证，则返回未在发布服务器或分发服务器上明确拒绝访问的登录。

[ @login = ] 'login'

是标准安全登录 ID。login 的数据类型为 sysname，默认设置为 %。

[@initial_list =] initial_list

指定是否获得新发布的初始发布访问列表。initial_list 的数据类型为 bit，默认设置为 0。如果为 1，则返回发布访问列表，该列表包括当前登录以及在分发服务器上具有有效登录的所有 sysadmin 成员。

结果集
列名 | 数据类型 | 描述
Loginname | nvarchar(256) | 实际登录名。
Isntname | int | 0 = 登录是 Microsoft SQL Server 登录。 1 = 登录是 Windows® 用户或组。
Isntgroup | int | 0 = 登录是 Microsoft SQL Server 登录。 1 = 登录是 Windows 用户或组。

注释

sp_help_publication_access 用于所有类型的复制。

权限

执行权限默认授予 public 角色。

请参见

sp_grant_publication_access

sp_revoke_publication_access

系统存储过程


sp_helparticle

显示有关项目的信息。该存储过程在发布服务器的发布数据库上执行。

语法

sp_helparticle [ @publication = ] 'publication'
[ , [ @article = ] 'article' ]
[ , [ @returnfilter = ] returnfilter ]

参数

[@publication = ] 'publication'

是发布名称。publication 的数据类型为 sysname，没有默认设置。

[@article =] 'article'

是发布中的项目名。article 的数据类型为 sysname，默认设置为 %。如果未提供 article，则返回有关指定发布中的所有项目的信息。

[@returnfilter =] returnfilter

指定是否应返回筛选子句。returnfilter 的数据类型为 bit，默认设置为 1，表示返回筛选子句。

结果集
列名 | 数据类型 | 描述
article id | int | 项目的 ID。
article name | sysname | 项目名。
base object | nvarchar(257) | 项目或存储过程所表示的基础表的名称。
destination object | sysname | 如果目的表与 source_table 或存储过程不同，则为目的（订阅）表的名称。
synchronization object | nvarchar(257) | 用于生成同步输出文件的表或视图的名称。
type | tinyint | 项目类型。
status | tinyint | 项目名的位掩码： 0 = 仅限内部使用。 1 = 活动。 8 = 在插入语句中包含列名。 16 = 使用参数化语句。 24 = 在 INSERT 语句中包含列名并使用参数化语句。
filter | nvarchar(257) | 用于筛选表（水平筛选）的存储过程（用 FOR REPLICATION 创建）。
description | nvarchar(255) | 项目的描述项。
insert_command | nvarchar(255) | 对在插入时执行的存储过程的调用。
update_command | nvarchar(255) | 对在更新时执行的存储过程的调用。
delete_command | nvarchar(255) | 对在删除时执行的存储过程的调用。
creation script path | nvarchar(255) | 用于创建目标表的项目架构脚本的路径和名称。
vertical partition | bit | 要复制的列。
pre_creation_cmd | tinyint | DROP TABLE、DELETE TABLE 或 TRUNCATE TABLE 的预创建命令。
filter_clause | ntext | 用于指定水平筛选的 WHERE 子句。
schema_option | binary(8) | 给定项目的架构生成选项位图。
dest_owner | sysname | 目的对象所有者的名称。
source_owner | sysname | 源对象所有者。
unqualified_source_object | sysname | 源对象的名称，不含所有者名称。
sync_object_owner | sysname | 同步对象所有者。
unqualified_sync_object | sysname | 同步对象的名称，不含所有者名称。
filter_owner | sysname | 筛选所有者。
unqualified_filter | sysname | 筛选名，不含所有者名称。
auto_identity_range | int | 用于表示在创建发布时是否在发布上打开了自动标识范围处理功能的标记。1 表示启用自动标识范围；0 表示禁用。注意标识范围管理只适用于允许即时更新或排队更新的快照发布或事务发布。
publisher_identity_range | int | 如果项目将 auto_identity_range 设置为 true，则为发布服务器上的标识范围的范围大小。
identity_range | bigint | 如果项目将 auto_identity_range 设置为 true，则是订阅服务器上的标识范围的范围大小。
threshold | bigint | 表示分发代理程序何时指派新标识范围的百分比值。

注释

sp_helparticle 用于快照复制和事务复制。

权限

执行权限默认授予 public 角色。

请参见

sp_addarticle

sp_addpublication

sp_articlecolumn

sp_changearticle

sp_changepublication

sp_droparticle

sp_droppublication

sp_enumfullsubscribers

sp_helppublication

系统存储过程


sp_helparticlecolumns

返回基础表中的所有列。该存储过程在发布服务器的发布数据库上执行。

语法

sp_helparticlecolumns [ @publication = ] 'publication'
, [ @article = ] 'article'

参数

[@publication = ] 'publication'

是包含该项目的发布名称。publication 的数据类型为 sysname，没有默认设置。

[@article =] 'article'

是要返回列的项目名。article 的数据类型为 sysname，没有默认设置。

返回代码值

0（不发布的列）或 1（发布的列）

结果集
列名 | 数据类型 | 描述
column id | int | 该列所属的表对象 ID。
column | sysname | 列名。
published | bit | 是否发布列： 0 = 否 1 = 是

注释

sp_helparticlecolumns 用于快照复制和事务复制。

sp_helparticlecolumns 在检查垂直分区时很有用。

权限

执行权限默认授予 public 角色。

请参见

sp_addarticle

sp_addpublication

sp_articlecolumn

sp_changearticle

sp_changepublication

sp_droparticle

sp_droppublication

sp_enumfullsubscribers

sp_helppublication

系统存储过程


sp_helparticledts

用于获取使用 Visual Basic® 创建转换订阅时所使用的正确自定义任务名的信息。该存储过程在发布服务器的发布数据库上执行。

语法

sp_helparticledts [ @publication = ] 'publication'
, [ @article = ] 'article'

参数

[@publication = ] 'publication'

是发布名称。publication 的数据类型为 sysname，没有默认设置。

[@article =] 'article'

是发布中的项目名称。article 的数据类型为 sysname，没有默认设置。

结果集
列名 | 数据类型 | 描述
pre_script_ignore_error_task_name | sysname | 在复制快照数据之前发生的编程任务的任务名，并且如果遇到脚本错误，程序将继续执行。
pre_script_task_name | sysname | 在复制快照数据之前发生的编程任务的任务名。遇到错误时程序将停止执行。
transformation_task_name | sysname | 使用数据驱动的查询任务时编程任务的任务名。
post_script_ignore_error_task_name | sysname | 复制快照数据之后发生的编程任务的任务名，如果遇到脚本错误，程序将继续执行。
post_script_task_name | sysname | 复制快照数据之后发生的编程任务的任务名。遇到错误时程序将停止执行。

注释

sp_helparticledts 用于快照复制和事务复制。

有一些命名规则是复制代理程序所需的，在命名复制 DTS 程序中的任务时必须遵从这些命名规则。对于自定义任务（如执行 SQL 任务），名称是由项目名称、前缀和可选部分组成的串联字符串。编写代码时，如果不能确定任务名，则结果集将给出应使用的任务名。有关更多信息，请参见使用 VisualBasic 创建可转换订阅。

权限

执行权限默认授予 public 角色。

请参见

使用 Visual Basic 创建可转换订阅

如何转换已发布数据

系统存储过程

转换已发布的数据


sp_helpdistpublisher

返回本身也作为分发服务器的发布服务器的属性。该存储过程在分发服务器的任何数据库上执行。

语法

sp_helpdistpublisher [[@publisher =] 'publisher']
[ , [ @check_user = ] check_user

参数

[@publisher =] 'publisher'

是返回其属性的发布服务器。publisher 的数据类型为 sysname，默认设置为 %。

[@check_user = ] check_user

仅限内部使用。

结果集
列名 | 数据类型 | 描述
name | sysname | 发布服务器名。
distribution_db | sysname | 指定发布服务器的分发数据库。
security_mode | int | 复制代理程序在强制订阅中连接到发布服务器时所使用的安全模式。
login | sysname | 复制代理程序在强制订阅中连接到发布服务器时所使用的登录名。
password | sysname | 返回的密码（以简单加密格式）。对于 sysadmin 以外的用户，密码为 NULL。
active | bit | 远程发布服务器是否将本地服务器用作分发服务器： 0 = 否 1 = 是
working_directory | nvarchar(255) | 工作目录名。
trusted | bit | 在分发服务器上实现的安全模式： 0 = SQL Server 身份验证 1 = Windows 身份验证
thirdparty_flag | bit | 发布是否为 Microsoft® SQL Server™ 数据库： 0 = Microsoft SQL Server 1 =Microsoft SQL Server 以外的数据源

注释

sp_helpdistpublisher 用于所有类型的复制。

对于非 sysadmin 登录，sp_helpdistpublisher 不在结果集中显示发布服务器登录或密码。

权限

执行权限默认授予 public 角色。

请参见

sp_adddistpublisher

sp_changedistpublisher

sp_dropdistpublisher

系统存储过程


sp_helpdistributiondb

返回指定分发数据库的属性。该存储过程在分发服务器的分发数据库上执行。

语法

sp_helpdistributiondb [ [ @database = ] 'database_name' ]

参数

[@database =] 'database_name'

是为其返回属性的数据库名称。database_name 的数据类型为 sysname，所有数据库的默认设置都为 %。

结果集
列名 | 数据类型 | 描述
distribution_database | sysname | 数据库的名称。
min_distretention | int | 事务被删除前的最小保持期（以小时为单位）。
max_distretention | int | 事务被删除前的最大保持期（以小时为单位）。
history retention | int | 保留历史记录的小时数。
history_cleanup_agent | sysname | 历史记录清除代理程序的名称。
distribution_cleanup_agent | sysname | 分发清除代理程序的名称。
status | int | 不支持。
data_folder | nvarchar(255) | 用于存储数据库文件的目录名。
data_file | nvarchar(255) | 数据库文件名。
data_file_size | int | 以兆字节为单位的数据文件初始大小。
log_folder | nvarchar(255) | 数据库日志文件的目录名。
log_file | nvarchar(255) | 日志文件名。
log_file_size | int | 以兆字节为单位的日志文件初始大小。

注释

sp_helpdistributiondb 用于所有类型的复制。

权限

执行权限默认授予 public 角色。

请参见

sp_adddistributiondb

sp_changedistributiondb

sp_dropdistributiondb

系统存储过程


sp_helpdistributor

列出有关分发服务器、分发数据库、工作目录和 SQL Server 代理程序用户帐户的信息。该存储过程在分发服务器的任何数据库上执行。

语法

sp_helpdistributor [[@distributor =] 'distributor' OUTPUT]
[ , [ @distribdb = ] 'distribdb' OUTPUT ]
[ , [ @directory = ] 'directory' OUTPUT ]
[ , [ @account = ] 'account' OUTPUT ]
[ , [ @min_distretention = ] min_distretention OUTPUT ]
[ , [ @max_distretention = ] max_distretention OUTPUT ]
[ , [ @history_retention = ] history_retention OUTPUT ]
[ , [ @history_cleanupagent = ] 'history_cleanupagent' OUTPUT ]
[ , [ @distrib_cleanupagent = ] 'distrib_cleanupagent' OUTPUT ]
[ , [ @publisher = ] 'publisher' ]
[ , [ @local = ] 'local' ]
[ , [ @rpcsrvname = ] 'rpcsrvname' OUTPUT ]

参数

[@distributor =] 'distributor' OUTPUT

是分发服务器名。distributor 的数据类型为 sysname，默认设置为 %，该值是返回结果集的唯一值。

[@distribdb =] 'distribdb' OUTPUT

是分发数据库名。distribdb 的数据类型为 sysname，默认设置为 %，该值是返回结果集的唯一值。

[@directory =] 'directory' OUTPUT

是工作目录。directory 的数据类型为 nvarchar(255)，默认设置为 %，该值是返回结果集的唯一值。

[@account =] 'account' OUTPUT

是 Windows NT® 用户帐户。account 的数据类型为 nvarchar(255)，默认设置为 %，该值是返回结果集的唯一值。

[@min_distretention = ] min_distretention OUTPUT

是以小时为单位的最小分发保持期。min_distretention 的数据类型为 int，默认设置为 –1。

[@max_distretention =] max_distretention OUTPUT

是以小时为单位的最大分发保持期。max_distretention 的数据类型为 int，默认设置为 –1。

[@history_retention =] history_retention OUTPUT

是以小时为单位的历史记录保持期。history_retention 的数据类型为 int，默认设置为 –1。

[@history_cleanupagent =] 'history_cleanupagent' OUTPUT

是历史记录清除代理程序的名称。history_cleanupagent 的数据类型为 nvarchar(100)，默认设置为 %，该值是返回结果集的唯一值。

[@distrib_cleanupagent =] 'distrib_cleanupagent' OUTPUT

是历史记录清除代理程序的名称。distrib_cleanupagent 的数据类型为 nvarchar(100)，默认设置为 %，该值是返回结果集的唯一值。

[@publisher =] 'publisher'

是发布服务器名称。publisher 的数据类型为 sysname，默认设置为 NULL。

[@local =] 'local'

是 Microsoft® SQL Server™ 是否应获得本地服务器值。local 的数据类型为 nvarchar(5)，默认设置为 NULL。

[@rpcsrvname =] 'rpcsrvname' OUTPUT

是发出远程过程调用的服务器名。rpcsrvname 的数据类型为 sysname，默认设置为 %，该值是返回结果集的唯一值。

结果集
列名 | 数据类型 | 描述
Distributor | sysname | 分发服务器的名称。
distribution database | sysname | 分发数据库的名称。
Directory | nvarchar(255) | 工作目录名。
Account | nvarchar(255) | Windows 用户帐户的名称。
min distrib retention | int | 最小分发保持期。
max distrib retention | int | 最大分发保持期。
history retention | int | 历史记录保持期。
history cleanup agent | nvarchar(100) | 历史记录清除代理程序的名称。
distribution cleanup agent | nvarchar(100) | 分发清除代理程序的名称。
rpc server name | sysname | 远程分发服务器或本地分发服务器的名称。
rpc login name | sysname | 用于对远程分发服务器的远程过程调用的登录。

如果没有安装分发数据库，则返回 NULL 值。

注释

sp_helpdistributor 用于所有类型的复制。

权限

执行权限默认授予 public 角色。

请参见

sp_adddistpublisher

sp_addsubscriber

sp_changesubscriber

sp_changesubstatus

sp_dboption

sp_dropsubscriber

sp_helpserver

sp_helpsubscriberinfo

系统存储过程


sp_helpmergealternatepublisher

返回作为合并发布的备用发布服务器启用的所有服务器列表。该存储过程在订阅服务器的订阅数据库上执行。

语法

sp_helpmergealternatepublisher [ [ @publisher = ] 'publisher' ]
, [ @publisher_db = ] 'publisher_db'
, [ @publication = ] 'publication'

参数

[@publisher =] 'publisher'

是备用发布服务器的名称。publisher 的数据类型为 sysname，没有默认设置。

[@publisher_db =] 'publisher_db'

是发布数据库名称。publisher_db 的数据类型为 sysname，没有默认设置。

[@publication =] 'publication'

是发布名称。publication 的数据类型为 sysname，没有默认设置。

结果集
列名 | 数据类型 | 描述
alternate publisher | sysname | 备用发布服务器的名称。
alternate publisher db | sysname | 发布数据库的名称。
alternate publication | sysname | 发布名称。
alternate distributor | sysname | 分发服务器的名称。
friendly name | nvarchar(255) | 对备用发布服务器的描述
enabled | bit | 指定服务器是否为备用发布服务器。1 指定将发布服务器启用为备用发布服务器。0 指定不启用服务器。

注释

sp_helpmergealternatepublisher 用于合并复制。

在每个合并会话过程中，系统向发布服务器和订阅服务器查询它们各自的备用发布服务器列表。发布服务器和订阅服务器上的备用发布服务器列表包含适当添加或除去的项。

权限

执行权限默认授予 public 角色。

请参见

系统存储过程


sp_helpmergearticle

返回有关项目的信息。该存储过程在发布服务器的发布数据库上执行。

语法

sp_helpmergearticle [ [ @publication = ] 'publication' ]
[ , [ @article = ] 'article' ]

参数

[@publication =] 'publication'

是要检索其信息的发布名称。publication 的数据类型为 sysname，默认设置为 %，表示返回有关当前数据库中所有发布所包含的所有合并项目的信息。

[@article =] 'article'

是返回其信息的项目名。article 的数据类型为 sysname，默认设置为 %，表示返回有关给定发布中的所有合并项目的信息。

结果集
列名 | 数据类型 | 描述
name | sysname | 项目名。
source_object_owner | sysname | 源对象所有者的名称。
source_object | sysname | 从其中添加项目的源对象的名称。
sync_object_owner | sysname | 同步对象所有者的名称。
sync_object | sysname | 用于建立分区初始数据的自定义对象的名称。
description | nvarchar(255) | 对项目的描述。
status | tinyint | 项目状态。
creation_script | nvarchar(127) | 项目的可选预创建脚本。
conflict_table | nvarchar(258) | 存储插入或更新冲突的表名。
pre_creation_command | tinyint | 预创建方法。
schema_option | binary(8) | 项目的架构生成选项位图。
type | tinyint | 项目类型。
column_tracking | int | 列级跟踪的设置。
article_resolver | nvarchar(255) | 项目的自定义冲突解决程序。
subset_filterclause | nvarchar(2000) | 用于指定水平筛选的 WHERE 子句。
resolver_info | sysname | 项目冲突解决程序名。
destination_object | sysname | 目的对象的名称。只适用于合并存储过程、视图和 UDF 架构项目。

注释

sp_helpmergearticle 用于合并复制。

权限

执行权限默认授予 public 角色。

请参见

sp_addmergearticle

sp_changemergearticle

sp_dropmergearticle

系统存储过程


sp_helpmergearticlecolumn

返回合并发布的指定表或视图项目中的列列表。存储过程没有列，因此如果将存储过程指定为项目，则该存储过程会返回错误。该存储过程在发布服务器的发布数据库上执行。

语法

sp_helpmergearticlecolumn [ @publication = ] 'publication' ]
, [ @article = ] 'article' ]

参数

[@publication =] 'publication'

是发布名称。publication 的数据类型为 sysname，没有默认设置。

[@article =] 'article'

是检索有关项目信息的表或视图的名称。article 的数据类型为 sysname，没有默认设置。

结果集
列名 | 数据类型 | 描述
column_id | sysname | 是列的标识号。
column_name | sysname | 是表或视图的列名。
published | bit | 指定是否发布列名称。1 指定正在发布列。0 指定不发布列。

注释

sp_helpmergearticlecolumn 用于合并复制。

权限

执行权限默认授予 public 角色。

请参见

系统存储过程


sp_helpmergearticleconflicts

返回发布中有冲突的项目。该存储过程在发布服务器的发布数据库上或在订阅服务器的合并订阅数据库上执行。

语法

sp_helpmergearticleconflicts [ [ @publication = ] 'publication' ]
[ , [ @publisher = ] 'publisher' ]
[ , [ @publisher_db = ] 'publsher_db' ]

参数

[@publication =] 'publication'

是合并发布的名称。publication 的数据类型为 sysname，默认设置为 %，该默认设置返回数据库中有冲突的所有项目。

[@publisher =] 'publisher'

是发布服务器名称。publisher 的数据类型为 sysname，默认设置为 NULL。

[@publisher_db =] 'publisher_db'

是发布服务器数据库名称。publisher_db 的数据类型为 sysname，默认设置为 NULL。

结果集
列名 | 数据类型 | 描述
article | sysname | 项目名。
source_object | nvarchar(386) | 源对象的名称。
conflict_table | nvarchar(258) | 存储插入或更新冲突的表名。
guidcolname | sysname | 源对象的 RowGuidCol 名称。
centralized_conflicts | int | 冲突记录是否存储在给定发布服务器上。

如果项目只有删除冲突而没有 conflict_table 行，则 conflict_table 在结果集中的名称为 NULL。

注释

sp_helpmergearticleconflicts 用于合并复制。

权限

执行权限默认授予 public 角色。

请参见

系统存储过程


sp_helpmergeconflictrows

返回指定冲突表中的行。该存储过程在存储有冲突表的计算机上运行。

语法

sp_helpmergeconflictrows [ [ @publication = ] 'publication' ]
, [ @conflict_table = ] 'conflict_table'
[ , [ @publisher = ] 'publisher' ]
[ , [ @publisher_db = ] 'publsher_db' ]

参数

[@publication =] 'publication'

是发布名称。publication 的数据类型为 sysname，默认设置为 %。如果已指定发布，则返回由该发布限定的全部冲突。例如，如果 Conflict_Customers 表有 WA 和 CA 发布的冲突行，则传递发布名称 CA 将只检索属于 CA 发布的冲突。

[@conflict_table =] 'conflict_table'

是冲突表名。conflict_table 的数据类型为 sysname，没有默认设置。

[@publisher =] 'publisher'

是发布服务器名称。publisher 的数据类型为 sysname，默认设置为 NULL。

[@publisher_db =] 'publisher_db'

是发布服务器数据库名称。publisher_db 的数据类型为 sysname，默认设置为 NULL。

结果集

sp_helpmergeconflictrows 返回由基表结构和下列附加列组成的结果集。

列名 | 数据类型 | 描述
origin_datasource | varchar(255) | 冲突的原始数据源。
conflict_type | int | 表示冲突类型的代码： 1 = UpdateConflict：在行级上检测到冲突。 2 = ColumnUpdateConflict：在列级上检测到冲突。 3 = UpdateDeleteWinsConflict：删除在冲突中获胜。 4 = UpdateWinsDeleteConflict：在该表中记录在冲突中失败的已删除 rowguid。 5 = UploadInsertFailed：来自订阅服务器的插入不能应用于发布服务器。 6 = DownloadInsertFailed：来自发布服务器的插入不能应用于订阅服务器。 7 = UploadDeleteFailed：来自订阅服务器的删除不能应用于发布服务器。 8 = DownloadDeleteFailed：来自发布服务器的删除不能下载到订阅服务器。 9 = UploadUpdateFailed：来自订阅服务器的更新不能应用于发布服务器。 10 = DownloadUpdateFailed：来自发布服务器的更新不能应用于订阅服务器。
reason_code | int | 可能与上下文相关的错误代码。
reason_text | varchar(720) | 可能与上下文相关的错误描述。
Pubid | uniqueidentifier | 发布标识符。

注释

sp_helpmergeconflictrows 用于合并复制。

权限

执行权限默认授予 public 角色。

请参见

系统存储过程


sp_helpmergedeleteconflictrows

返回指定的 msmerge_delete_conflicts 表中的行。该存储过程在发布服务器的合并发布数据库上执行。

语法

sp_helpmergedeleteconflictrows [[@publication =] 'publication']
[ , [ @source_object = ] 'source_object']
[ , [ @publisher =] 'publisher'
[ , [ @publisher_db =] 'publsher_db'

参数

[@publication =] 'publication'

是发布名称。publication 的数据类型为 sysname，默认设置为 %。如果已指定发布，则返回由该发布限定的全部冲突。例如，如果msmerge_delete_conflicts 表有 WA 和 CA 发布的冲突行，则传递发布名称 CA 将只检索属于 CA 发布的冲突。

[@source_object = ] 'source_object'

是源对象名。source_object 的数据类型为 nvarchar(386)，默认设置为 NULL。

[@publisher =] 'publisher'

是发布服务器名称。publisher 的数据类型为 sysname，默认设置为 NULL。

[@publisher_db =] 'publisher_db'

是发布服务器数据库名称。publisher_db 的数据类型为 sysname，默认设置为 NULL。

结果集
列名 | 数据类型 | 描述
source_object | nvarchar(386) | 删除冲突的源对象。
rowguid | uniqueidentifier | 删除冲突的行标识符。
conflict_type | Int | 表示冲突类型的代码： 1 = UpdateConflict：在行级上检测到冲突。 2 = ColumnUpdateConflict：在列级上检测到冲突。 3 = UpdateDeleteWinsConflict：删除在冲突中获胜。 4 = UpdateWinsDeleteConflict：在该表中记录在冲突中失败的已删除 rowguid。 5 = UploadInsertFailed：来自订阅服务器的插入不能应用于发布服务器。 6 = DownloadInsertFailed：来自发布服务器的插入不能应用于订阅服务器。 7 = UploadDeleteFailed：来自订阅服务器的删除不能应用于发布服务器。 8 = DownloadDeleteFailed：来自发布服务器的删除不能下载到订阅服务器。 9 = UploadUpdateFailed：来自订阅服务器的更新不能应用于发布服务器。 10 = DownloadUpdateFailed：来自发布服务器的更新不能应用于订阅服务器。
reason_code | Int | 可能与上下文相关的错误代码。
reason_text | varchar(720) | 可能与上下文相关的错误描述。
origin_datasource | varchar(255) | 冲突的原始数据源。
pubid | uniqueidentifier | 发布标识符。

注释

sp_helpmergedeleteconflictrows 用于合并复制。

权限

执行权限默认授予 public 角色。

请参见

系统存储过程


sp_helpmergefilter

返回有关合并筛选的信息。该存储过程在发布服务器的发布数据库上执行。

语法

sp_helpmergefilter [ @publication =] 'publication'
[ , [ @article = ] 'article']
[ , [ @filtername =] 'filtername']

参数

[@publication =] 'publication'

是发布名称。publication 的数据类型为 sysname，没有默认设置。

[@article =] 'article'

是项目名。article 的数据类型为 sysname，默认设置为 %，表示返回所有项目名。

[@filtername =] 'filtername'

是要返回其信息的筛选名。filtername 的数据类型为 sysname，默认设置为 %，表示返回有关在项目或发布上定义的所有筛选的信息。

结果集
列名 | 数据类型 | 描述
join_filterid | int | 联接筛选的 ID。
filtername | sysname | 筛选名。
join article name | sysname | 联接项目名。
join_filterclause | nvarchar(2000) | 用于限定联接的筛选子句。
join_unique_key | int | 表示是否在唯一键上联接。
base table owner | sysname | 基表所有者的名称。
base table name | sysname | 基表的名称。
join table owner | sysname | 与基表联接的表所有者的名称。
join table name | sysname | 与基表联接的表名。
article name | sysname | 项目名。

注释

sp_helpmergefilter 用于合并复制。

权限

执行权限默认授予 public 角色。

请参见

sp_addmergefilter

sp_changemergefilter

sp_dropmergefilter

系统存储过程


sp_helpmergepublication

返回有关合并复制的信息。该存储过程在发布服务器的发布数据库上执行。

语法

sp_helpmergepublication [[@publication =] 'publication']
[ , [ @found = ] 'found'OUTPUT]
[ , [ @publication_id = ] 'publication_id' OUTPUT]
[ , [ @reserved =] 'reserved' ]

参数

[@publication =] 'publication'

是发布名称。publication 的数据类型为 sysname，默认设置为 %，表示返回有关当前数据库内所有合并发布的信息。

[@found =] 'found' OUTPUT

是表示返回行的标志。found 的数据类型为 int 而且是 OUTPUT 参数，默认设置为 NULL。1 表示已找到发布。0 表示未找到发布。

[@publication_id = ] 'publication_id' OUTPUT

是发布标识号。publication_id 的数据类型为 uniqueidentifier 而且是 OUTPUT 参数，默认设置为 NULL。

[@reserved = ] 'reserved'

保留以备将来使用。reserved 的数据类型为 nvarchar(20)，默认设置为 NULL。

结果集
列名 | 数据类型 | 描述
id | int | 发布在列表中的连续顺序。
name | sysname | 发布名称。
description | nvarchar(255) | 对发布的描述。
status | tinyint | 发布数据的可用时间。
retention | int | 为给定的发布保存的更改量（以天为单位）。
sync_mode | tinyint | 该发布的同步模式： 0 = 本机大容量复制程序（bcp 实用工具） 1 = 字符大容量复制
allow_push | int | 表示是否可以为给定的发布创建强制订阅。0 表示不允许强制订阅。
allow_pull | int | 表示是否可以为给定的发布创建请求订阅。0 表示不允许请求订阅。
allow_anonymous | int | 表示是否可以为指定的发布创建匿名订阅。0 表示不允许匿名订阅。
centralized_conflicts | int | 表示是否在给定的发布服务器上存储冲突记录： 0 = 将冲突记录存储在引起冲突的发布服务器和订阅服务器中。 1 = 将所有冲突记录都存储在发布服务器上。
priority | float(8) | 环回订阅的优先级。
snapshot_ready | tinyint | 表示该发布的快照是否已准备好使用： 0 = 快照已准备好使用。 1 = 快照未准备好使用。
publication_type | int | 发布类型： 0 = 快照。 1 = 事务。 2 = 合并。
pubid | uniqueidentifier | 该发布的唯一标识符。
snapshot_jobid | binary(16) | 快照代理程序的作业 ID。
enabled_for_internet | int | 表示是否启用该发布以用在 Internet 上。如果是 1，则将发布的同步文件放入 C:\Program Files\Microsoft SQL Server\MSSQL\Repldata\Ftp 目录中。用户必须创建 Ftp 目录。如果是 0，则不为 Internet 访问启用该发布。
dynamic_filter | int | 表示是否使用动态筛选。0 表示不使用动态筛选。
has_subscription | bit | 表示发布是否含有任何订阅。0 表示当前没有对该发布的订阅。
snapshot_in_default_folder | Bit | 指定快照文件是否存储在默认文件夹中。如果是 0，则可以在默认文件夹中找到快照文件。如果是 1，则表示快照文件将存储在 alt_snapshot_folder 所指定的备用位置中。备用位置可以在另一台服务器、网络驱动器或可移动媒体（如 CD-ROM 或可移动磁盘）上。也可以将快照文件保存到文件传输协议 (FTP) 站点以供订户以后检索。注意该参数可为 ture，而且在 @alt_snapshot_folder 参数中仍有一个位置。这个组合指定将快照文件存储在默认位置和备用位置。
alt_snapshot_folder | nvarchar(255) | 指定快照的备用文件夹的位置。
pre_snapshot_script | nvarchar(255) | 指定指向某个 .sql 文件的指针，在订阅服务器上应用快照时，合并代理程序在运行任何已复制对象脚本之前先运行该文件。
post_snapshot_script | nvarchar(255) | 指定指向某个 .sql 文件的指针，在订阅服务器上应用快照时，合并代理程序在运行了所有其它的已复制对象脚本和数据之后再运行该文件。
compress_snapshot | Bit | 指定将写入 @alt_snapshot_folder 位置的快照压缩为 Microsoft® CAB 格式。
ftp_address | sysname | 是分发服务器 FTP 服务的网络地址。指定供合并代理程序挑选的发布快照文件所在的位置。
ftp_port | int | 是分发服务器的 FTP 服务的端口号。ftp_port 的默认值为 21。指定供合并代理程序挑选的发布快照文件所在的位置。
ftp_subdirectory | nvarchar(255) | 指定可供合并代理程序挑选的快照文件所在的位置。
ftp_login | sysname | 是用来连接到 FTP 服务的用户名。
conflict_retention | int | 指定保留冲突的保持期（以天为单位）。指定的天数过去后，冲突行将从冲突表中清除掉。
keep_partition_changes | int | 指定是否对此发布进行同步优化。keep_partition_changes 的默认值为0。0 表示不进行同步优化，并且某个分区中的数据更改时，将验证发送到所有订阅服务器的分区。1 表示进行同步优化，而且只有在更改的分区中包含行的订阅服务器才受影响。有关更多信息，请参见优化同步。
allow_subscription_copy | int | 指定是否已启用复制订阅该发布的订阅数据库的能力。0 表示不允许复制。
allow_synctoalternate | int | 指定是否允许可选同步伙伴与该发布服务器同步。0 表示不允许同步伙伴。
validate_subscriber_info | nvarchar(500) | 列出正用于检索订阅服务器信息和验证订阅服务器上的动态筛选准则的功能。有助于验证信息分区是否与每个合并一致。
backward_comp_level | int | 数据库兼容级别（60、65、70 和 80）。
publish_to_activedirectory | bit | 指定是否将发布信息发布到 Microsoft Active Directory™。0 表示无法从 Microsoft Active Directory 获得发布信息。
max_concurrent_merge | int | 并发合并进程数。该属性为 0 值表示对任何特定时刻运行的并发合并进程数没有限制。
max_concurrent_dynamic_snapshots | int | 可以在合并发布上运行的最大并发动态快照会话数。如果是 0，则不限制任何特定时刻在该发布上运行的最大并发动态快照会话数。

注释

sp_helpmergepublication 用于合并复制。

权限

执行权限默认授予 public 角色。

请参见

sp_addmergepublication

sp_changemergepublication

sp_dropmergepublication

系统存储过程


sp_helpmergepullsubscription

返回有关请求订阅的信息。该存储过程在订阅服务器的订阅数据库上执行。

语法

sp_helpmergepullsubscription [[@publication =] 'publication']
[ , [ @publisher = ] 'publisher' ]
[ , [ @publisher_db =] 'publisher_db']
[ , [ @subscription_type =] 'subscription_type']

参数

[@publication =] 'publication'

是发布名称。publication 的数据类型为 sysname，默认设置为 %。如果 publication 为 %，则表示返回有关当前数据库内所有合并发布和订阅的信息。

[@publisher =] 'publisher'

是发布服务器名。publisher 的数据类型为 sysname，默认设置为 %。

[@publisher_db =] 'publisher_db'

是发布服务器数据库名称。publisher_db 的数据类型为 sysname，默认设置为 %。

[@subscription_type =] 'subscription_type'

是是否显示请求订阅。subscription_type 的数据类型为 nvarchar(10)，默认设置为 'pull'。有效值为 'push'、'pull' 或 'both'。

结果集
列名 | 数据类型 | 描述
subscription_name | nvarchar(1000) | 订阅名。
publication | sysname | 发布名称。
publisher | sysname | 发布服务器名。
publisher_db | sysname | 发布服务器数据库名。
subscriber | sysname | 订阅服务器名。
subscription_db | sysname | 订阅数据库的名称。
status | Int | 订阅状态： 0 = 所有作业正等待启动 1 = 一个或多个作业正在启动 2 = 所有作业已成功执行 3 = 至少一个作业正在执行 4 = 所有作业都已调度并处于空闲 5 = 在以前的失败后至少有一个作业正在尝试执行 6 = 至少一个作业未能成功执行
subscriber_type | int | 订阅服务器的类型： 1 = 全局 2 = 本地 3 = 匿名
subscription_type | int | 订阅的类型： 0 = 强制 1 = 请求 2 = 匿名
priority | float(8) | 订阅优先级。该值必须小于 100.00。
sync_type | tinyint | 订阅同步类型： 1 = 自动 2 = Nosync
description | nvarchar(255) | 对该请求订阅的简短描述。
merge_jobid | binary(16) | 合并代理程序的作业 ID。
enabled_for_synmgr | int | 表示能否通过 Microsoft 同步管理器使订阅同步。
last_updated | nvarchar(26) | 上次更新发布的日期。
publisher_login | sysname | 发布服务器登录名。
publisher_password | sysname | 发布服务器密码。
publisher_security_mode | int | 指定发布服务器的安全模式： 0 = SQL Server 身份验证 1 = Windows 身份验证
distributor | sysname | 分发服务器的名称。
distributor_login | sysname | 分发服务器登录名。
distributor_password | sysname | 分发服务器密码。
distributor_security_mode | int | 指定分发服务器的安全模式： 0 = SQL Server 身份验证 1 = Windows 身份验证
ftp_address | sysname | 仅可用于向后兼容性。是分发服务器 FTP 服务的网络地址。
ftp_port | int | 仅可用于向后兼容性。是分发服务器 FTP 服务的端口号。
ftp_login | sysname | 仅可用于向后兼容性。是用来连接到 FTP 服务的用户名。
ftp_password | sysname | 仅可用于向后兼容性。是用来连接到 FTP 服务的用户密码。
alt_snapshot_folder | nvarchar(255) | 默认位置以外的存储快照文件夹的位置。
working_directory | nvarchar(255) | 目录完全合法的路径，当指定该选项时在目录中使用 FTP 传输快照文件。
use_ftp | bit | 订阅正在订阅 Internet 上的发布，并且配置 FTP 的寻址属性。如果为 0，则订阅未使用 FTP。如果 1，则订阅正在使用 FTP。
offload_agent | bit | 指定是否可激活并远程运行该代理程序。如果为 0，则表示无法远程激活该代理程序。
offload_server | sysname | 用于远程激活的服务器名称。
use_interactive_resolver |  | 返回在调节过程中是否使用交互式冲突解决程序。如果为 0，则不使用交互式冲突解决程序。
subid | uniqueidentifier | 订阅服务器的 ID。
dynamic_snapshot_location | nvarchar(255) | 在其中保存快照文件的文件夹路径。
last_sync_status | int | 订阅状态： 0 = 所有作业正等待启动 1 = 一个或多个作业正在启动 2 = 所有作业已成功执行 3 = 至少一个作业正在执行 4 = 所有作业都已调度并处于空闲 5 = 在以前的失败后至少有一个作业正在尝试执行 6 = 至少一个作业未能成功执行
last_sync_summary | sysname | 对上次同步结果的描述。

注释

sp_helpmergepullsubscription 用于合并复制。在结果集中，last_updated 中返回的数据格式化为 YYYYMMDD hh:mm:ss.fff。

权限

执行权限默认授予 public 角色。

请参见

sp_addmergepullsubscription

sp_changemergepullsubscription

sp_dropmergepullsubscription

系统存储过程


sp_helpmergesubscription

返回有关强制订阅的信息。该存储过程在发布服务器的发布数据库上执行。

语法

sp_helpmergesubscription [[@publication =] 'publication']
[ , [ @subscriber =] 'subscriber']
[ , [ @subscriber_db = ] 'subscriber_db' ]
[ , [ @publisher = ] 'publisher' ]
[ , [ @publisher_db =] 'publisher_db']
[ , [ @subscription_type =] 'subscription_type']
[ , [ @found =] 'found' OUTPUT]

参数

[@publication =] 'publication'

是发布名称。publication 的数据类型为 sysname，默认设置为 %。发布必须已存在而且必须遵从标识符规则。如果为 NULL 或 %，则表示返回有关当前数据库内所有合并发布和订阅的信息。

[@subscriber = ] 'subscriber'

是订阅服务器名。subscriber 的数据类型为 sysname，默认设置为 NULL。如果为 NULL 或 %，则表示返回有关给定发布的所有订阅的信息。

[@subscriber_db = ] 'subscriber_db'

是订阅数据库名。subscriber_db 的数据类型为 sysname，默认设置为 %，表示返回有关所有订阅数据库的信息。

[@publisher =] 'publisher'

是发布服务器的名称。发布服务器必须是有效的服务器。publisher 的数据类型为 sysname，默认设置为 %，表示返回有关所有发布服务器的信息。

[@publisher_db =] 'publisher_db'

是发布服务器数据库名称。publisher_db 的数据类型为 sysname，默认设置为 %，表示返回有关所有发布服务器数据库的信息。

[@subscription_type =] 'subscription_type'

是订阅的类型。subscription_type 的数据类型为 nvarchar(15)，可以是下列值之一。

值 | 描述
push（默认值） | 强制订阅。
Pull | 请求订阅。
Both | 强制订阅和请求订阅。

[@found = ] 'found' OUTPUT

是表示返回行的标志。found 的数据类型为 int 而且是 OUTPUT 参数，默认设置为 NULL。1 表示已找到发布。0 表示未找到发布。

结果集
列名 | 数据类型 | 描述
subscription_name |  | 订阅名。
Publication | sysname | 发布名称。
Publisher | sysname | 发布服务器名。
publisher_db | sysname | 发布服务器数据库名。
Subscriber | sysname | 订阅服务器名。
subscriber_db | sysname | 订阅数据库的名称。
Status | int | 订阅的状态： 0 = 所有作业正等待启动 1 = 一个或多个作业正在启动 2 = 所有作业已成功执行 3 = 至少一个作业正在执行 4 = 所有作业都已调度并处于空闲 5 = 在以前的失败后至少有一个作业正在尝试执行 6 = 至少一个作业不能成功执行
subscriber_type | int | 订阅服务器类型。
subscription_type | int | 订阅的类型： 0 = 强制 1 = 请求 2 = 强制和请求
Priority | float(8) | 表示订阅优先级的数字。
sync_type | tinyint | 订阅同步类型。
description | nvarchar(255) | 对该合并订阅的简短描述。
merge_jobid | binary(16) | 合并代理程序的作业 ID。
full_publication | tinyint | 表示订阅是完全发布还是筛选发布。
offload_enabled |  | 指定复制代理程序的卸载执行是否被设置为在订阅服务器上运行。若为 NULL，执行将在发布服务器上运行。
offload_server |  | 在其中运行代理程序的服务器名。
use_interactive_resolver |  | 返回在调节过程中是否使用交互式冲突解决程序。如果为 0，则不使用交互式冲突解决程序。

注释

sp_helpmergesubscription 用于合并复制。

权限

执行权限默认授予 public 角色。

请参见

sp_addmergesubscription

sp_changemergesubscription

sp_dropmergesubscription

系统存储过程


sp_helppublication

返回有关发布的信息。该存储过程在发布服务器的发布数据库上执行。

语法

sp_helppublication [ [ @publication = ] 'publication' ]
[ , [ @found =] found OUTPUT]

参数

[@publication =] 'publication'

是要查看的发布名称。publication 的数据类型为 sysname，默认设置为 %，表示返回有关所有发布的信息。

[@found =] 'found' OUTPUT

是表示返回行的标记。found 的数据类型为 int，而且是 OUTPUT 参数，默认值为 23456。1 表示已找到发布。0 表示未找到发布。

结果集
列名 | 数据类型 | 描述
pubid | int | 发布的 ID。
name | sysname | 发布名称。
restricted | int | 未使用，设置为 0。
status | tinyint | 发布数据的可用时间。
task |  | 用于向后兼容。
replication frequency | tinyint | 复制频率的类型： 0 = 基于事务 1 = 已调度表刷新
synchronization method | tinyint | 同步模式： 0 = 本机大容量复制程序（bcp 实用工具） 1 = 字符大容量复制 3 = 并发，表示使用本机大容量复制（bcp 实用工具），但在快照期间不锁定表 4 = Concurrent_c，表示使用字符大容量复制，但在快照期间不锁定表
description | nvarchar(255) | 对发布的可选描述。
immediate_sync | bit | 表示每次快照代理程序运行时是否创建或重新创建同步文件。
enabled_for_internet | bit | 表示是否通过 FTP 和其它服务将发布的同步文件表现在 Internet 上。
allow_push | bit | 表示是否允许在发布上使用强制订阅。
allow_pull | bit | 表示是否允许在发布上使用请求订阅。
allow_anonymous | bit | 表示是否允许在发布上使用匿名订阅。
independent_agent | bit | 表示是否有用于该发布的独立分发代理程序。
immediate_sync_ready | bit | 表示快照代理程序是否生成了准备由新订阅使用的快照。只有当发布被设置为始终有可用于新订阅或重新初始化订阅的快照，才定义该参数。
allow_sync_tran | bit | 表示是否允许在发布上使用即时更新订阅。
autogen_sync_procs | bit | 表示是否自动生成存储过程以支持即时更新订阅。
snapshot_jobid | binary(16) | 已调度任务 ID。
retention | int | 为给定的发布保存的更改量（以小时为单位）。

注释

sp_helppublication 用于快照复制和事务复制。

权限

执行权限默认授予 public 角色。

请参见

sp_addarticle

sp_addpublication

sp_articlecolumn

sp_changepublication

sp_changearticle

sp_droparticle

sp_droppublication

sp_enumfullsubscribers

sp_helparticle

sp_helparticlecolumns

系统存储过程


sp_helppullsubscription

显示有关订阅服务器上的一个或多个订阅的信息。此存储过程在订阅服务器的订阅数据库上执行。

语法

sp_helppullsubscription [[@publisher =] 'publisher']
[ , [ @publisher_db = ] 'publisher_db' ]
[ , [ @publication = ] 'publication' ]
[ , [ @show_push = ] 'show_push' ]

参数

[@publisher =] 'publisher'

是远程服务器名。publisher 的数据类型为 sysname，默认值为 %，表示返回所有发布服务器。

[@publisher_db =] 'publisher_db'

是发布服务器数据库名。publisher_db 的数据类型为 sysname，默认值为 %，表示返回所有发布服务器数据库。

[@publication =] 'publication'

是发布名。publication 的数据类型为 sysname，默认值为 %，表示返回所有发布。

[@show_push =] 'show_push'

表示是否返回所有强制订阅。show_push 的数据类型为 nvarchar(5)，默认值为 FALSE，表示不返回所有强制订阅。

结果集
列名 | 数据类型 | 描述
publisher | sysname | 发布服务器名。
publisher database | sysname | 发布服务器数据库名。
publication | sysname | 发布名。
independent_agent | bit | 表明该发布是否有独立的分发代理程序。
subscription type | int | 对发布的订阅类型。
distribution agent | nvarchar(100) | 处理订阅的分发代理程序。
publication description | nvarchar(255) | 对发布的描述。
last updating time | date | 订阅信息上次更新的时间。这是由 ISO 日期 (114) 和 ODBC 时间 (121) 组成的 UNICODE 字符串。格式是 yyyymmdd hh:mi:sss.mmm，其中"yyyy"是年，"mm"是月，"dd"是日，"hh"是小时，"mi"是分钟，"sss"是秒，"mmm"是毫秒。
subscription name | varchar(386) | 订阅名。
last transaction timestamp | varbinary(16) | 上一个复制事务的时间戳。
update mode | tinyint | 允许的更新类型。
distribution agent job_id | int | 分发代理程序的作业 ID。
enabled_for_synmgr | int | 表示能否通过 Microsoft® 同步管理器使订阅同步。
subscription guid | binary(16) | 发布上订阅版本的全局标识符。
subid | binary(16) | 匿名订阅的全局标识符。
immediate_sync | bit | 表示每次快照代理程序运行时是否创建或重新创建同步文件。
publisher login | sysname | 在发布服务器上用于 SQL Server 身份验证的登录 ID。
publisher password | nvarchar(524) | 在发布服务器上用于 SQL Server 身份验证的密码（已加密）。
publisher security_mode | int | 在发布服务器上使用的安全模式： 0 = SQL Server 身份验证 1 = Windows 身份验证 2 = 同步触发器使用静态 sysservers 项做 RPC，且必须在 sysservers 表中定义为远程服务器或链接服务器。
distributor | sysname | 发布服务器的名称。
distributor_login | sysname | 在发布服务器上用于 SQL Server 身份验证的登录 ID。
distributor_password | nvarchar(524) | 在发布服务器上用于 SQL Server 身份验证的密码（已加密）。
distributor_security_mode | int | 在分发服务器上使用的安全模式： 0 = SQL Server 身份验证 1 = Windows 身份验证
ftp_address | sysname | 只是为了向后兼容。
ftp_port | int | 只是为了向后兼容。
ftp_login | sysname | 只是为了向后兼容。
ftp_password | nvarchar(524) | 只是为了向后兼容。
alt_snapshot_folder | nvarchar(255) | 存储快照文件夹的位置（如果该位置是默认位置以外的位置。）
working_directory | nvarchar(255) | 目录完全合法的路径，当指定该选项时在目录中使用 FTP 传输快照文件。
use_ftp | bit | 订阅通过 Internet 订阅发布，且配置 FTP 寻址属性。如果为 0，订阅不使用 FTP。如果为 1，订阅使用 FTP。
publication_type | int | 指定发布的复制类型： 0 = 事务发布 1 = 快照发布 2 = 合并发布
dts_package_name | sysname | 指定 DTS 包的名称。
dts_package_location | int | 存储 DTS 包的位置： 0 = 分发服务器 1 = 订阅服务器
offload_agent | bit | 指定是否远程激活代理程序。如果为 0，无法远程激活代理程序。
offload_server | sysname | 指定用于远程激活的服务器的网络名称。
last_sync_status | int | 订阅状态： 0 = 所有作业正等待启动 1 = 一个或多个作业正在启动 2 = 所有作业已成功执行 3 = 至少一个作业正在执行 4 = 所有作业都已调度并处于空闲 5 = 在以前的失败后至少有一个作业正在尝试执行 6 = 至少一个作业不能成功执行
last_sync_summary | sysname | 上一个同步结果的描述。
last_sync_time | datetime | 订阅信息上次更新的时间。这是由 ISO 日期 (114) 和 ODBC 时间 (121) 组成的 UNICODE 字符串。格式是 yyyymmdd hh:mi:sss.mmm，其中"yyyy"是年，"mm"是月，"dd"是日，"hh"是小时，"mi"是分钟，"sss"是秒，"mmm"是毫秒。

注释

sp_helppullsubscription 用于快照复制和事务复制。

权限

执行权限默认授予 public 角色。

请参见

sp_addpullsubscription

sp_droppullsubscription

系统存储过程


sp_helpreplfailovermode

显示即时更新订阅的当前故障转移模式，在发生故障时使用排队更新作为备用更新。此存储过程在订阅服务器的任何数据库上执行。

语法

sp_helpreplfailovermode [ @publisher = ] 'publisher'
[ , [ @publisher_db = ] 'publisher_db' ]
[ , [ @publication = ] 'publication' ]
[ , [ @failover_mode_id = ] 'failover_mode_id'OUTPUT]
[ , [ @failover_mode = ] 'failover_mode'OUTPUT]

参数

[@publisher =] 'publisher'

是参与订阅服务器更新的发布服务器名称。publisher 的数据类型为 sysname，无默认值。必须已将发布服务器配置为可以发布。

[@publisher_db =] 'publisher_db'

是发布数据库名。publisher_db 的数据类型为 sysname，无默认值。

[@publication =] 'publication'

是参与订阅服务器更新的发布名。publication 的数据类型为 sysname，无默认值。

[@failover_mode_id =] 'failover_mode_id' OUTPUT

返回故障转移模式的整形值，且是 OUTPUT 参数。failover_mode_id 的数据类型为 tinyint，默认值为 0。对即时更新返回 0，对排队更新返回 1。

[@failover_mode =] 'failover_mode' OUTPUT

返回订阅服务器上的数据修改模式。failover_mode 的数据类型为 nvarchar(10)，默认值为 NULL。是 OUTPUT 参数。

值 | 描述
immediate | 即时更新：使用两阶段提交协议 (2PC)，将订阅服务器上的更新立即传播到发布服务器。
queued | 排队更新：将订阅服务器上的更新存储在队列中。

返回代码值

0（成功）或 1（失败）

注释

sp_helpreplfailovermode 用于启用了即时更新订阅的快照复制或事务复制，并在发生故障时使用排队更新作为故障转移。

权限

public 角色成员可以执行 sp_helpreplfailovermode。

请参见

sp_setreplfailovermode


sp_helpreplicationdboption

显示已启用复制选项的数据库。此存储过程在发布服务器的发布数据库上执行。

语法

sp_helpreplicationdboption [ [ @dbname =] 'dbname' ]
[ , [ @type = ] 'type' ]

参数

[@dbname =] 'dbname'

是数据库名。dbname 的数据类型为 sysname，默认值为 %。如果为 %，则结果集将包含运行此存储过程的计算机上的所有数据库。

[@type =] 'type'

表示是否允许复制。type 的数据类型为 sysname，可以是下列值之一。

值 | 描述
publish | 允许事务复制。
merge publish | 允许合并复制。
replication allowed（默认值） | 允许事务复制或合并复制。

结果集
列名 | 数据类型 | 描述
name | sysname | 数据库的名称。
id | sysname | 数据库的 ID。

注释

sp_helpreplicationdboption 用于快照复制、事务复制和合并复制。

权限

执行权限默认授予 public 角色。

请参见

系统存储过程


sp_helpreplicationoption

显示为服务器启用的复制选项的类型。此存储过程在发布服务器的发布数据库上执行。

语法

sp_helpreplicationoption [ [ @optname =] 'option_name' ]

参数

[@optname =] 'option_name'

是要查询的复制选项的名称。option_name 的数据类型为 sysname，默认设置为 NULL。如果为 NULL，则结果集将包含该数据库上激活的所有复制选项类型。如果为 transactional，则结果集将只包含有关事务发布的信息。如果为 merge，则结果集将只包含有关合并发布的信息。

结果集
列名 | 数据类型 | 描述
optname | sysname | 复制选项类型的名称。
value | bit | 仅限内部使用。
major_version | int | 仅限内部使用。
minor_version | int | 仅限内部使用。
revision | int | 仅限内部使用。
install_failures | int | 仅限内部使用。

注释

sp_helpreplicationoption 用于获得有关特定服务器上事务复制和合并复制的信息。若要获得有关特定数据库的信息，请使用 sp_helpreplicationdboption。

权限

执行权限默认授予 public 角色。

请参见

系统存储过程


sp_helpsubscriberinfo

显示有关订阅服务器的信息。此存储过程在发布服务器的任何数据库上执行。

语法

sp_helpsubscriberinfo [[@subscriber =] 'subscriber']

参数

[@subscriber =] 'subscriber'

是订阅服务器名。subscriber 的数据类型为 sysname，默认值为 %，表示返回所有信息。

结果集
列名 | 数据类型 | 描述
publisher | sysname | 发布服务器名。
subscriber | sysname | 订阅服务器名。
type | tinyint | 订阅服务器的类型： 0 = Microsoft® SQL Server™ 数据库 1 = ODBC 数据源
login | sysname | SQL Server 身份验证的登录 ID。
password | sysname | SQL Server 身份验证的密码。
commit_batch_size | int | 不支持。
status_batch_size | int | 不支持。
flush_frequency | int | 不支持。
frequency_type | int | 分发代理程序运行的频率： 1 = 一次 2 = 按需 4 = 每天 8 = 每周 16 = 每月 32 = 每月相对信息 64 = 自动启动 124 = 反复出现
frequency_interval | int | 应用于由 frequency_type 设置的频率的值。
frequency_relative_interval | int | 当 frequency_type 设置为 32（每月相对信息）时使用的分发代理程序日期： 1 = 第一个 2 = 第二个 4 = 第三个 8 = 第四个 16 = 最后一个
frequency_recurrence_factor | int | frequency_type 使用的重复发生因子。
frequency_subday | int | 在定义的周期内的重新调度频率： 1 = 一次 2 = 秒 4 = 分钟 8 = 小时
frequency_subday_interval | int | frequency_subday 的间隔。
active_start_time_of_day | int | 第一次调度分发代理程序的时间，格式为 HHMMSS。
active_end_time_of_day | int | 停止调度分发代理程序的时间，格式为 HHMMSS。
active_start_date | int | 第一次调度分发代理程序的日期，格式为 YYYYMMDD。
active_end_date | int | 停止调度分发代理程序的日期，格式为 YYYYMMDD。
retryattempt | int | 不支持。
retrydelay | int | 不支持。
description | nvarchar(255) | 对订阅服务器的文本描述。
security_mode | int | 实现的安全模式： 0 = SQL Server 身份验证 1 = Windows 身份验证

注释

sp_helpsubscriberinfo 用于快照复制、事务复制和合并复制。

权限

只有 sysadmin 固定服务器角色成员才能执行 sp_helpsubscriberinfo。

请参见

sp_adddistpublisher

sp_addsubscriber

sp_changesubscriber

sp_dboption

sp_dropsubscriber

sp_helpdistributor

sp_helpserver

系统存储过程


sp_helpsubscription

列出与特定的发布、项目、订阅服务器或订阅集关联的订阅信息。此存储过程在发布服务器的发布数据库上执行。

语法

sp_helpsubscription [ [ @publication = ] 'publication' ]
[ , [ @article = ] 'article' ]
[ , [ @subscriber = ] 'subscriber' ]
[ , [ @destination_db = ] 'destination_db' ]
[ , [ @found =] found OUTPUT ]

参数

[@publication =] 'publication'

是关联的发布名。publication 的数据类型为 sysname，默认值为 %，表示返回该服务器的所有订阅信息。

[@article =] 'article'

是项目名。article 的数据类型为 sysname，默认值为 %，表示返回选定发布和订阅服务器的所有订阅信息。如果为 all，则表示只为发布上的完整订阅返回一项。

[@subscriber =] 'subscriber'

是获得其订阅信息的订阅服务器名称。subscriber 的数据类型为 sysname，默认值为 %，表示为选定的发布和项目返回所有订阅信息。

[@destination_db = ] 'destination_db'

是目的数据库名。destination_db 的数据类型为 sysname，默认值为 %。

[@found =] 'found' OUTPUT

是表示返回行的标记。found 的数据类型为 int，而且是 OUTPUT 参数，默认值为 23456。1 表示已找到发布。0 表示未找到发布。

结果集
列名 | 数据类型 | 描述
subscriber | sysname | 订阅服务器名。
publication | sysname | 发布名。
article | sysname | 项目名。
destination database | sysname | 用于存放复制数据的目的数据库的名称。
subscription status | tinyint | 订阅状态： 0 = 非活动 1 = 已订阅 2 = 活动
synchronization type | tinyint | 订阅同步类型： 1 = 自动 2 = 无
subscription type | int | 订阅的类型： 0 = 强制 1 = 请求 2 = 匿名
full subscription | bit | 表示订阅是否针对发布中的所有项目： 0 = 否 1 = 是
subscription name | nvarchar(255) | 订阅名。
update mode | int | 0 = 只读 1 = 即时更新订阅
distribution job id | binary(16) | 分发代理程序的作业 ID。
loopback_detection | bit | 0 = 否 1 = 是
offload_enabled | bit | 指定复制代理程序的卸载执行是否已设置为在订阅服务器上运行。如果为 0，则代理程序在发布服务器上运行。如果为 1，则代理程序在订阅服务器上运行。
offload_server | sysname | 为远程代理程序激活启用的服务器名称。如果为 NULL，则使用在 MSDistribution_agents 表中列出的当前 offload_server。
dts_package_name | sysname | 指定 DTS 包的名称。
dts_package_location | int | 如果将一个包指派给订阅，则为此 DTS 包的位置。如果有一个包，则数值 0 指定此包位于分发服务器上。而数值 1 指定位于订阅服务器上。

注释

sp_helpsubscription 用于快照复制、事务复制和合并复制。

权限

执行权限默认授予 public 角色。但是，sysadmin 固定服务器角色或 db_owner 固定数据库角色可以查看所有订阅，而其他用户得到的结果集仅列出了他们各自的订阅。

请参见

sp_addsubscription

sp_changesubstatus

sp_dropsubscription

系统存储过程


sp_helpsubscription_properties

从 MSsubscription_properties 表中检索安全信息。此存储过程在存储 DTS 包的计算机上执行。

语法

sp_helpsubscription_properties [ [ @publisher = ] 'publisher' ]
[ , [ @publisher_db =] 'publisher_db' ]
[ , [ @publication =] 'publication' ]
[ , [ @publication_type = ] publication_type ]

参数

[@publisher =] 'publisher'

是发布服务器名。publisher 的数据类型为 sysname，默认值为 %，表示将返回所有发布服务器上的信息。

[@publisher_db =] 'publisher_db'

是发布服务器数据库名。publisher_db 的数据类型为 sysname，默认值为 %，表示将返回所有发布服务器数据库上的信息。

[@publication =] 'publication'

是发布名。publication 的数据类型为 sysname，默认值为 %，表示将返回所有发布上的信息。

[@publication_type =] publication_type

是发布类型。publication_type 的数据类型为 int，默认值为 NULL。

结果集
列名 | 数据类型 | 描述
publisher | sysname | 发布服务器名。
publisher_db | sysname | 发布服务器数据库名。
publication | sysname | 发布名。
publication_type | int | 发布类型： 0 = 快照 1 = 事务 2 = 合并
publisher_login | sysname | 在发布服务器上用于 SQL Server 身份验证的登录 ID。
publisher_password | sysname | 在发布服务器上用于 SQL Server 身份验证的密码（已加密）。
publisher_security_mode | int | 在发布服务器上使用的安全模式： 0 = SQL Server 身份验证 1 = Windows 身份验证
distributor | sysname | 发布服务器的名称。
distributor_login | sysname | 分发服务器登录。
distributor_password | sysname | 分发服务器密码（已加密）。
distributor_security_mode | int | 在分发服务器上使用的安全模式： 0 = SQL Server 身份验证 1 = Windows 身份验证
ftp_address | sysname | 只是为了向后兼容。分发服务器的 FTP 服务网络地址。
ftp_port | int | 只是为了向后兼容。分发服务器的 FTP 服务端口号。
ftp_login | sysname | 只是为了向后兼容。用于连接到 FTP 服务的用户名称。
ftp_password | sysname | 只是为了向后兼容。用于连接到 FTP 服务的用户密码。
alt_snapshot_folder | nvarchar(255) | 指定快照的备用文件夹的位置。
working_directory | nvarchar(255) | 用于存储数据和架构文件的工作目录的名称。
use_ftp | bit | 指定使用 FTP 而非常规协议检索快照。如果为 1，使用 FTP。
dts_package_name | sysame | 指定 DTS 包的名称。
dts_package_password | nvarchar(524) | 指定包上的密码，如果有的话。值 NULL 意味着包没有密码。
dts_package_location | int | 存储 DTS 包的位置。如果为 0，包的位置在分发服务器上。如果为 1，包的位置在订阅服务器上。
offload_agent | bit | 指定是否可以远程激活代理程序。如果为 0，无法远程激活代理程序。
offload_server | sysname | 指定用于远程激活的服务器的网络名称。
dynamic_snapshot_location | nvarchar(255) | 指定保存快照文件的文件夹的路径。

注释

sp_helpsubscription_properties 用于快照复制、事务复制和合并复制。

权限

只有 sysadmin 固定服务器角色成员才能执行 sp_helpsubscription_properties。

请参见

系统存储过程


sp_ivindexhasnullcols

验证索引视图的聚集索引是否唯一，而且当索引视图将要用于创建事务发布时其聚集索引不包含任何可能为空的列。此存储过程在发布服务器的发布数据库上执行。

语法

sp_ivindexhasnullcols [ @viewname = ] 'view_name'
, [ @fhasnullcols= ] field_has_null_columns OUTPUT

参数

[@viewname = ] 'view_name'

是要验证的视图名。view_name 的数据类型为 sysname，无默认值。

[@fhasnullcols = ] field_has_null_columns OUTPUT

是表示视图索引是否包含允许 NULL 值的列的标记。view_name 的数据类型为 sysname，无默认值。如果视图索引包含允许 NULL 值的列，则返回 1。如果视图不包含允许 NULL 值的列，则返回 0。请注意，如果此存储过程本身返回一个返回代码 1，则意味着执行此存储过程失败，则值将变成 0，应该忽略该值。

返回代码值

0（成功）或 1（失败）

注释

sp_ivindexhasnullcols 用于事务复制。

默认情况下，发布中的索引视图项目创建为订阅服务器上的表。但是，当索引列允许 NULL 值时，索引视图创建为订阅服务器上的索引视图而不是表。通过执行此存储过程，可以警告用户当前索引视图中是否存在此问题。

权限

public 角色成员可以执行 sp_ivindexhasnullcols。

请参见

系统存储过程


sp_link_publication

设置所有可更新订阅的同步触发器在连接到发布服务器时所使用的配置和安全信息。此存储过程在订阅服务器的订阅数据库上执行。

语法

sp_link_publication [ @publisher = ] 'publisher'
, [ @publisher_db = ] 'publisher_db'
, [ @publication = ] 'publication'
, [ @security_mode = ] security_mode
[ , [ @login =] 'login' ]
[ , [ @password = ] 'password' ]
[, [ @distributor = ] 'distributor' ]

参数

[@publisher =] 'publisher'

是要链接到的发布服务器名。publisher 的数据类型为 sysname，无默认值。

[@publisher_db =] 'publisher_db'

是要链接到的发布服务器数据库名。publisher_db 的数据类型为 sysname，无默认值。

[@publication =] 'publication'

是要链接到的发布名。publication 的数据类型为 sysname，无默认值。

[@security_mode =] security_mode

是链接到发布服务器时使用的安全模式。security_mode 的数据类型为 int，无默认值。如果为 0，则表示同步触发器使用到发布服务器的动态 RPC 连接。如果为 2，则表示同步触发器使用静态 sysservers 项完成 RPC，而且必须在 sysservers 表内将 publisher 定义为远程服务器或链接服务器。

[ @login = ] 'login'

是登录。login 的数据类型为 sysname，默认值为 NULL。

[@password = ] 'password'

是密码。password 的数据类型为 sysname，默认值为 NULL。

[@distributor = ] 'distributor'

是分发服务器名。distributor 的数据类型为 sysname，默认值为 NULL。

返回代码值

0（成功）或 1（失败）

注释

sp_link_publication 由快照复制和事务复制中的所有可更新订阅使用。

sp_link_publication 既可以用于强制订阅，也可以用于请求订阅。在创建订阅之前或之后都可以调用此过程。在 MSsubscription_properties 系统表内插入或更新了一项。使用 sp_helpsubscription_properties 查看设置的值（publisher_security_mode、publisher_login、publisher_password）。

对于强制订阅，可以使用 sp_subscription_cleanup 清除该项。对于请求订阅，可以使用 sp_droppullsubscription 或 sp_subscription_cleanup 清除该项。出于安全考虑，也可以用 NULL 密码调用 sp_link_publisher 以清除 MSsubscription_properties 系统表内的该项。

当即时更新订阅服务器连接到发布服务器时，它使用的默认模式不允许使用 Windows 身份验证进行连接。若要用 Windows 身份验证模式进行连接，必须设置到发布服务器的链接服务器，且即时更新订阅服务器在更新订阅服务器时应使用该连接。这要求 sp_link_publication 以 security_mode = 2 运行。

权限

只有 sysadmin 固定服务器角色成员才能执行 sp_link_publication。

请参见

sp_droppullsubscription

sp_helpsubscription_properties

sp_subscription_cleanup

系统存储过程


sp_marksubscriptionvalidation

将当前打开的事务标记为指定订阅服务器的订阅级验证事务。必须与 sp_article_validation 一起使用，并使 @subscription_level 等于 1。还可以和其它对 sp_marksubscriptionvalidation 的调用一起使用，为其它订阅服务器标记当前打开的事务。此存储过程在发布服务器的发布数据库上执行。

语法

sp_marksubscriptionvalidation [ @publication = ] 'publication'
, [ @subscriber = ] 'subscriber'
, [ @destination_db = ] 'destination_db'

参数

[@publication =] 'publication'

是发布名。Publication 的数据类型为 sysname，无默认值。

[@subscriber = ] 'subscriber'

是订阅服务器名称。subscriber 的数据类型为 sysname，无默认值。

[@destination_db =] 'destination_db'

是目的数据库名。destination_db 的数据类型为 sysname，无默认值。

返回代码值

0（成功）或 1（失败）

注释

sp_marksubscriptionvalidation

用于所有类型的复制。此存储过程不支持异类订阅服务器。

权限

只有 sysadmin 固定服务器角色成员或 db_owner 固定数据库角色成员才能执行 sp_marksubscriptionvalidation。

示例

下面的查询可应用到发布数据库，以发布订阅级验证命令。下列命令将由指定的订阅服务器的分发代理程序挑选。

begin tran

exec sp_marksubscriptionvalidation @publication = 'pub1',
 @subscriber = 'Sub', @destination_db = 'SubDB'

exec sp_marksubscriptionvalidation @publication = 'pub1',
 @subscriber = 'Sub2', @destination_db = 'SubDB'

exec sp_article_validation @publication = 'pub1', @article = 'art1',
 @rowcount_only = 0, @full_or_fast = 0, @shutdown_agent = 0,
 @subscription_level = 1

commit tran

begin tran

exec sp_marksubscriptionvalidation @publication = 'pub1',
 @subscriber = 'Sub', @destination_db = 'SubDB'

exec sp_marksubscriptionvalidation @publication = 'pub1',
 @subscriber = 'Sub2', @destination_db = 'SubDB'

exec sp_article_validation @publication = 'pub1', @article = 'art2',
 @rowcount_only = 0, @full_or_fast = 0, @shutdown_agent = 0,
 @subscription_level = 1

commit tran

请注意，第一个事务验证项目"art1"，而第二个事务验证"art2"。还请注意，已把对 sp_marksubscriptionvalidation 和 sp_articlevalidation 的调用封装进了事务中。建议每个事务只调用一次 sp_articlevalidation。这是因为在事务的生存周期内，sp_article_validation 在源表上控制一个共享表锁。应尽量缩短事务以使并发最大化。

请参见

系统存储过程

验证已复制的数据


sp_mergearticlecolumn

对合并发布进行垂直分区。此存储过程在发布服务器的发布数据库上执行。

语法

sp_mergearticlecolumn [ @publication = ] 'publication'
, [ @article = ] 'article'
[ , [ @column = ] 'column'
[ , [ @operation = ] 'operation'
[ , [ @schema_replication = ] 'schema_replication' ]
[ , [ @force_invalidate_snapshot = ] force_invalidate_snapshot ]
[ , [ @force_reinit_subscription = ] force_reinit_subscription ]

参数

[@publication =] 'publication'

是发布名。Publication 的数据类型为 sysname，无默认值。

[@article =] 'article'

是发布中的项目名。article 的数据类型为 sysname，无默认值。

[@column =] 'column'

标识在其上创建垂直分区的列。column 的数据类型为 sysname，默认值为 NULL。如果为 NULL，则默认情况下将复制表中由项目引用的所有列。

[@operation =] 'operation'

是复制状态。operation 的数据类型为 nvarchar(4)，默认值为 ADD。add 将列标记为复制。drop 不标记列。

[@schema_replication=] 'schema_replication'

指定当分发代理程序或合并代理程序运行时，将传播架构更改。schema_replication 的数据类型为 nvarchar(5)，默认值为 FALSE。如果为 false，将不传播架构更改。

[@force_invalidate_snapshot = ] force_invalidate_snapshot

启用或禁用使快照无效的能力。force_invalidate_snapshot 的数据类型为 bit，默认值为 0。0 指定合并项目的更改不会导致快照无效。1 指定合并项目的更改可能导致快照无效，如果真是这样，则值 1 提供产生新快照的权限。

[@force_reinit_subscription = ] force_reinit_subscription

启用或禁用使订阅重新初始化的能力。force_reinit_subscription 的数据类型为 bit，默认值为 0。0 指定合并项目的更改不会导致订阅重新初始化。1 指定合并项目的更改可能导致订阅重新初始化，如果真是这样，则值 1 提供重新初始化订阅的权限。

返回代码值

0（成功）或 1（失败）

注释

sp_mergearticlecolumn 用于合并复制。

如果创建初始快照后，应用程序设置了新的垂直分区，则一定会生成新的快照且应用到每个订阅。当下一个已调度的快照和分发或合并代理程序运行时应用快照。

权限

只有 sysadmin 固定服务器角色成员或 db_owner 固定数据库角色成员才能执行 sp_mergearticlecolumn。

请参见

合并复制的工作机制

如何通过使用创建发布向导垂直地筛选发布（企业管理器）

系统存储过程


sp_mergecleanupmetadata

允许管理员清理 MSmerge_contents 和 MSmerge_tombstone 系统表中的元数据。此存储过程在发布服务器的发布数据库上执行。

语法

sp_mergecleanupmetadata [ [ @publication = ] 'publication' ]
[ , [ @reinitialize_subscriber = ] 'reinitialize_subscriber' ]

参数

[@publication =] 'publication'

是发布名。publication 的数据类型为 sysname，默认值为 %，表示将返回所有发布的信息。如果显式指定发布，则此发布必须已存在。

[@reinitialize_subscriber =] 'subscriber'

指定是否重新初始化订阅服务器。reinitialize_subscriber 的数据类型为 nvarchar(5)，可以是 true 或 false，默认值为 TRUE。如果为 true，则订阅标记为重新初始化。如果为 false，则订阅不标记为重新初始化。

返回代码值

0（成功）或 1（失败）

注释

sp_mergecleanupmetadata 用于合并复制，并使管理员得以清除 MSmerge_contents 和 MSmerge_tombstone 系统表中的元数据。尽管这些表可以无限扩展，但在某些情形下清理其中的元数据可提高合并性能。此过程通过压缩发布服务器和订阅服务器中上述表的大小以节省空间。

默认情况下，@reinitialize_subscriber 参数设置为 true，而所有的订阅都标记为重新初始化。如果将参数 @reinitialize_subscriber 设置为 false，则订阅不标记为重新初始化。将参数设置为 false 时必须慎重，因为如果选择不对订阅进行重新初始化，则必须确保发布服务器与订阅服务器上的数据同步。

在没有将订阅标记为重新初始化时，若要运行 sp_mergecleanupmetadata，需执行以下步骤：

  • 同步所有订阅服务器。

  • 停止所有对发布及订阅数据库的更新。

  • 运行合并代理程序执行合并。运行合并代理程序时，建议在每个订阅服务器上都使用 –Validate 代理程序命令行选项。

  • 执行 sp_mergecleanupmetadata。此过程运行后，可允许用户重新在发布和订阅数据库上修改数据。

运行此存储过程时，请注意在运行此存储过程的计算机上，日志文件不得已而且有可能增长得很大。

重要 运行了合并元数据清除后应执行发布数据库的备份。如果没有这样做，会在发布数据库还原后导致合并失败。

如果有正在进行的合并进程，而该进程在唤醒调用此存储过程时正在尝试向发布服务器上载更改，则 sp_mergecleanupmetadata 将失败。尝试仅当包括连续模式合并在内的所有合并都已完成时才运行此存储过程。

管理员可以停用发布并在合并清除完成后重新激活它。下面是示例代码，说明管理员如何完成此任务。

  1. 在发布服务器上执行此存储过程。此存储过程确保任何正在轮询发布状态的连续模式合并失败，这将停用发布服务器。
EXEC central..sp_changemergepublication @publication = 'dynpart_pubn', @property = 'status', @value = 'inactive'
  2. 当所有的连续模式合并都已终止后，执行下列存储过程。下列存储过程运行元数据清除，然后重新激活连续模式合并。
EXEC central..sp_mergecleanupmetadata @publication = 'dynpart_pubn', @reinitialize_subscriber = 'false'
EXEC central..sp_changemergepublication @publication = 'dynpart_pubn', @property = 'status', @value = 'active'

如果将合并清除传播到作为再次发布者的订阅服务器，而此再次发布者还未激活，则将返回一个错误，说明由于存在正在进行的合并进程，不能在再次发布者上执行元数据的清除。

权限

只有 sysadmin 固定服务器角色成员或 db_owner 固定数据库角色成员才能执行 sp_mergesubscription。

若要使用此存储过程，发布服务器必须运行 Microsoft® SQL Server™ 2000。订阅服务器必须运行 Microsoft SQL Server 2000 或 Microsoft SQL Server 7.0 Service Pack 2。

请参见

合并复制的工作机制

MSmerge_contents

MSmerge_tombstone


sp_mergedummyupdate

在给定的行上进行虚更新，以便在下次合并时将该行再次送出。此存储过程可在发布服务器的发布数据库上或在订阅服务器的订阅数据库上执行。

语法

sp_mergedummyupdate [ @source_object =] 'source_object'
, [ @rowguid =] 'rowguid'

参数

[@source_object =] 'source_object'

是源对象名。source_object 的数据类型为 nvarchar(386)，无默认值。

[@rowguid =] 'rowguid'

是行标识符。rowguid 的数据类型为 uniqueidentifier，无默认值。

返回代码值

0（成功）或 1（失败）

注释

sp_mergedummyupdate 用于合并复制。

如果想编写自己的选项以替换复制冲突查看器 (Wzcnflct.exe)，则 sp_mergedummyupdate 很有用。

权限

只有 db_owner 固定数据库角色成员才能执行 sp_mergedummyupdate。

请参见

系统存储过程


sp_mergesubscription_cleanup

当除去订阅服务器上的合并订阅时，删除元数据（如触发器以及 sysmergesubscriptions 和 sysmergearticles 中的项）。此存储过程在发布服务器的任何数据库上执行。

语法

sp_mergesubscription_cleanup [ @publisher =] 'publisher'
, [ @publisher_db = ] 'publisher_db'
, [ @publication = ] 'publication '

参数

[@publisher =] 'publisher'

是发布服务器名。publisher 的数据类型为 sysname，无默认值。

[@publisher_db =] 'publisher_db'

是发布服务器数据库名。publisher_db 的数据类型为 sysname，无默认值。

[@publication =] 'publication'

是发布名。publication 的数据类型为 sysname，无默认值。

返回代码值

0（成功）或 1（失败）

注释

sp_mergesubscription_cleanup 用于合并复制。

sp_mergesubscription_cleanup 定期检查各合并发布的所有订阅状态。如果其中的一些订阅已过期，也就是说，有太长的时间与发布服务器失去联系，则声明发布已过期并在发布服务器上清除该订阅的跟踪。

权限

只有 sysadmin 固定服务器角色成员或 db_owner 固定数据库角色成员才能执行 sp_mergesubscription_cleanup。

请参见

sp_expired_subscription_cleanup

sp_subscription_cleanup

系统存储过程


sp_publication_validation

启动对指定发布中的各项目的项目验证请求。此存储过程在发布服务器的发布数据库上执行。

语法

sp_publication_validation [ @publication = ] 'publication'
[@rowcount_only =] type_of_check_requested
[ , [ @rowcount_only = ] type_of_check_requested ]
[ , [ @shutdown_agent = ] shutdown_agent ]

参数

[@publication =] 'publication'

是发布名。publication 的数据类型为 sysname，无默认值。

[@rowcount_only =] type_of_check_requested

表示是否只返回表的行数。rowcount_only 的数据类型为 smallint，其默认值为 1。type_of_check_requested 的数据类型为 smallint，其默认值为 1，如果是 0，则执行 SQL Server 7.0 兼容的校验值。如果为 1，则只执行行数检查。如果为 2，则执行行数和校验值。

[@full_or_fast =] full_or_fast

是计算行数的方法。full_or_fast 的数据类型为 tinyint，默认值为 2，可以是下列值之一。

值 | 描述
0 | 用 COUNT(*) 进行完整计数。
1 | 从 sysindexes.rows 进行快速计数。在 sysindexes 中对行进行计数比在实表中计数快得多。但由于很少对 sysindexes 进行更新，所以行计数可能不准确。
2（默认值） | 首先使用快速方法进行条件快速计数。如果快速方法显示出差异，则转而使用完整方法。如果 expected_rowcount 的值为 NULL，而且正在使用存储过程获取该值，则始终使用完整 COUNT(*)。

[@shutdown_agent =] shutdown_agent

表示分发代理程序是否应在完成验证后立即关闭。shutdown_agent 的数据类型为 bit，默认值 0。如果为 0，表示复制代理程序不关闭。如果为 1，则表示在验证完最后一个项目后，复制代理程序将关闭。

返回代码值

0（成功）或 1（失败）

注释

sp_publication_validation 用于快照复制和事务复制。

激活了与发布关联的项目后可以随时调用 sp_publication_validation。可以手工运行一次此过程，或将其作为验证数据的定期调度作业的一部分。

如果应用程序有即时更新订阅服务器，则 sp_publication_validation 可以检测虚假的错误。sp_publication_validation 先计算发布服务器上的行数或校验值，然后计算订阅服务器上的行数或校验值。因为在发布服务器上验证完行数和校验值后，但是在订阅服务器上验证行数或校验值之前，即时更新触发器可能将更新从订阅服务器传播到发布服务器，所以该值无法更改。为确保订阅服务器和发布服务器上的值在验证发布期间不更改，请在验证期间停止发布服务器上的 MSDTC 服务。

权限

除非由 sysadmin 或 db_owner 的成员执行，否则，必须在项目中使用的基表的所有列上具有 SELECT 权限（即时项目为垂直分区）才能执行 sp_publication_validation。

请参见

sp_article_validation

sp_table_validation

系统存储过程


sp_refreshsubscriptions

对于所有现有的订阅服务器，将对其请求订阅中的新项目的订阅添加到发布中。此存储过程在发布服务器的发布数据库上执行。

语法

sp_refreshsubscriptions [ @publication = ] 'publication'

参数

[@publication =] 'publication'

是要为其刷新订阅的发布。publication 的数据类型为 sysname，无默认值。

返回代码值

0（成功）或 1（失败）

结果集

无

注释

sp_refreshsubscriptions 用于快照复制、事务复制和合并复制。

sp_refreshsubscriptions 由 sp_addarticle 调用以用于即时更新发布。

权限

只有 sysadmin 固定服务器角色成员或 db_owner 固定数据库角色成员才能执行 sp_refreshsubscriptions。

请参见

sp_addarticle

系统存储过程


sp_reinitmergepullsubscription

将合并请求订阅标记为在合并代理程序下一次运行时重新初始化。此存储过程在订阅服务器的订阅数据库上执行。

语法

sp_reinitmergepullsubscription [ [ @publisher = ] 'publisher' ]
[ , [ @publisher_db = ] 'publisher_db' ]
[ , [ @publication = ] 'publication' ]
[ , [ @upload_first = ] 'upload_first'

参数

[@publisher =] 'publisher'

是发布服务器名。publisher 的数据类型为 sysname，默认值为 ALL。

[@publisher_db =] 'publisher_db'

是发布服务器数据库名。publisher_db 的数据类型为 sysname，默认值为 ALL。

[@publication =] 'publication'

是发布名。publication 的数据类型为 sysname，默认值为 ALL。

[@upload_first =] 'upload_first'

是订阅服务器数据库名。upload_first 的数据类型为 nvarchar(5)，默认值为 FALSE。如果为 true，则在重新初始化订阅之前上载更改。如果为 false，则不上载更改。

返回代码值

0（成功）或 1（失败）

注释

sp_reinitmergepullsubscription 用于合并复制。

可以从订阅服务器调用 sp_reinitmergepullsubscription。

权限

只有 sysadmin 固定服务器角色成员或 db_owner 固定数据库角色成员才能执行 sp_reinitmergepullsubscription。

请参见

系统存储过程


sp_reinitmergesubscription

将合并订阅标记为在合并代理程序下一次运行时重新初始化。此存储过程在发布服务器的发布数据库上执行。

语法

sp_reinitmergesubscription [ [ @publication = ] 'publication'
[ , [ @subscriber = ] 'subscriber'
[ , [ @subscriber_db = ] 'subscriber_db'
[ , [ @upload_first = ] 'upload_first'

参数

[@publication =] 'publication'

是发布名。publication 的数据类型为 sysname，默认值为 all。

[@subscriber =] 'subscriber'

是订阅服务器名。subscriber 的数据类型为 sysname，默认值为 all。

[@subscriber_db =] 'subscriber_db'

是订阅服务器数据库名。subscriber_db 的数据类型为 sysname，默认值为 all。

[@upload_first =] 'upload_first'

是订阅服务器数据库名。upload_first 的数据类型为 nvarchar(5)，默认值为 FALSE。如果为 true，则在重新初始化订阅之前上载更改。如果为 false，则不上载更改。

返回代码值

0（成功）或 1（失败）

注释

sp_reinitmergesubscription 用于合并复制。

可从发布服务器调用 sp_reinitmergesubscription 以重新初始化合并订阅。建议还重新运行快照代理程序。

权限

只有 sysadmin 固定服务器角色成员或 db_owner 固定数据库角色成员才能执行 sp_reinitmergesubscription。

请参见

系统存储过程


sp_reinitpullsubscription

将事务请求订阅或匿名订阅标记为在分发代理程序下一次运行时重新初始化。此存储过程在订阅服务器的请求订阅数据库上执行。

语法

sp_reinitpullsubscription [ @publisher = ] 'publisher'
, [ @publisher_db = ] 'publisher_db'
, [ @publication = ] 'publication'

参数

[@publisher =] 'publisher'

是发布服务器名。publisher 的数据类型为 sysname，无默认值。

[@publisher_db =] 'publisher_db'

是发布服务器数据库名。publisher_db 的数据类型为 sysname，无默认值。

[@publication =] 'publication'

是发布名。publication 的数据类型为 sysname，默认值为 all，表示将所有订阅标记为重新初始化。

返回代码值

0（成功）或 1（失败）

注释

sp_reinitpullsubscription 用于事务复制。

在分发代理程序下一次运行时，可从订阅服务器调用 sp_reinitpullsubscription 以重新初始化订阅。注意不能从订阅服务器重新初始化 non_immediate_sync 类型发布的订阅。

通过在订阅服务器上执行 sp_reinitpullsubscription 或在发布服务器上执行 sp_reinitsubscription，可以重新初始化请求订阅。

权限

只有 sysadmin 固定服务器角色成员或 db_owner 固定数据库角色成员才能执行 sp_reinitpullsubscription。

请参见

系统存储过程


sp_reinitsubscription

将订阅标记为重新初始化。此存储过程在发布服务器的强制订阅上执行。

语法

 sp_reinitsubscription [ [ @publication = ] 'publication' ]
[ , [ @article = ] 'article' ]
, [ @subscriber = ] 'subscriber'
[ , [ @destination_db = ] 'destination_db']
[ , [ @for_schema_change = ] 'for_schema_change']

参数

[@publication =] 'publication'

是发布名。publication 的数据类型为 sysname，默认值为 all。

[@article =] 'article'

是项目名。article 的数据类型为 sysname，默认值为 all。对于即时更新发布，article 必须是 all；否则，此存储过程将跳过该发布并报告错误。

[@subscriber =] 'subscriber'

是订阅服务器名。subscriber 的数据类型为 sysname，无默认值。

[@destination_db =] 'destination_db'

是目的数据库名。destination_db 的数据类型为 sysname，默认值为 all。

[@for_schema_change =] 'for_schema_change'

表示发布数据库上的架构更改时是否重新初始化。for_schema_change 的数据类型为 bit，默认值为 0。如果为 0，则只要重新初始化整个发布而不只是其中的某些项目，就将重新激活允许即时更新的发布的活动订阅。这表示架构更改时将调用重新初始化。如果为 1，则直到运行快照代理程序时才重新激活活动订阅。

返回代码值

0（成功）或 1（失败）

注释

sp_reinitsubscription 用于事务复制。

对于自动应用初始快照和发布不允许可更新订阅的订阅，执行此存储过程之后必须运行快照代理程序，以便准备架构和大容量复制程序文件，并使分发代理程序随后能够重新同步订阅。

对于自动应用初始快照和发布允许可更新订阅的订阅，分发代理程序使用先前由快照代理程序创建的最新架构和大容量复制程序文件重新同步订阅。如果分发代理程序不忙，则在用户执行 sp_reinitsubscription 后，分发代理程序将立即重新同步订阅；否则，可能会在消息间隔（由分发代理程序命令提示符参数：MessageInterval 指定）后进行同步。

对于手工应用初始快照的订阅，由用户负责确保订阅服务器上的表与发布服务器上的表同步，并且在执行此存储过程前没有订阅服务器挂起的未送达复制命令。

若要使匿名订阅与发布重新同步，请将 all 或 NULL 作为 subscriber 传递。

事务复制支持项目级的订阅重新初始化。当项目被标记为重新初始化后，在下一个同步过程中将在订阅服务器上重新应用项目快照。但是，如果有相关的项目也由同一个订阅服务器订阅，那么在项目上重新应用快照可能会失败，除非发布中的相关项目在某些情况下也自动重新初始化：

  • 如果项目上的预创建命令是"除去"，则项目基对象上的架构绑定视图和架构绑定存储过程也将被标记为重新初始化。

  • 如果项目上的架构选项包括在主键上创建声明引用完整性脚本，则基表同重新初始化项目的基表有外键关系的项目也将被标记为重新初始化。
权限

只有 sysadmin 固定服务器角色成员、db_owner 固定数据库角色成员或订阅创建者才能执行 sp_reinitsubscription。

请参见

系统存储过程


sp_removedbreplication

从数据库中删除所有复制对象，但不更新分发服务器上的数据。此存储过程在发布服务器的发布数据库或订阅服务器的订阅数据库上执行。

语法

sp_removedbreplication [ @dbname = ] 'dbname'

参数

[@dbname =] 'dbname'

是数据库名。dbname 的数据类型为 sysname，无默认值。

返回代码值

0（成功）或 1（失败）

注释

sp_removedbreplication 用于所有类型的复制。

当还原的复制数据库中没有需要还原的复制对象时，sp_removedbreplication 很有用。

权限

只有 sysadmin 固定服务器角色成员才能执行 sp_removedbreplication。

请参见

系统存储过程


sp_repladdcolumn

将列添加到已发布的现有表项目中。允许将新列添加到发布该表的所有发布服务器，或者只将新列添加到发布该表的特定发布中。此存储过程在发布服务器的发布数据库上执行。

语法

sp_repladdcolumn [ @source_object = ] 'source_object'
, [ @column = ] 'column' ]
[ , [ @typetext = ] 'typetext' ]
[ , [ @publication_to_add = ] 'publication_to_add' ]
[ , [ @schema_change_script = ] 'schema_change_script' ]
[ , [ @force_invalidate_snapshot = ] force_invalidate_snapshot ]
[ , [ @force_reinit_subscription = ] force_reinit_subscription ]

参数

[@source_object =] 'source_object'

是包含要添加的新列的表项目名。source_object 的数据类型为 nvarchar(358)，无默认值。

[@column =] 'column'

是表中将添加为复制的列名。column 的数据类型为 sysname，无默认值。

[@typetext =] 'typetext'

是正添加的列的定义。typetext 的数据类型为 nvarchar(3000)，无默认值。例如，如果正添加列 order_filled，且该列是单字符字段，而不是 NULL，并且有默认值 N，则 order_filled 将是 column 参数，而列定义"char(1) NOT NULL DEFAULT 'N'"将是 typetext 参数值。

[@publication_to_add =] 'publication_to_add'

是将新列添加到的发布名。publication_to_add 的数据类型为 nvarchar(4000)，默认值为 ALL。如果为 all，则将影响所有包含该表的发布。如果已指定 publication_to_add，则只将新列添加到此发布中。

[@schema_change_script =] 'schema_change_script'

是 SQL 脚本的路径。schema_change_script 的数据类型为 nvarchar(4000)，默认值为 NULL。

[@force_invalidate_snapshot = ] force_invalidate_snapshot

启用或禁用使快照无效的能力。force_invalidate_snapshot 的数据类型为 bit，默认值为 1。1 指定项目的更改可能导致快照无效，如果真是这样，则值 1 提供产生新快照的权限。0 指定项目的更改不会导致快照无效。

[@force_reinit_subscription = ] force_reinit_subscription

启用或禁用使订阅重新初始化的能力。force_reinit_subscription 的数据类型为 bit，默认值为 0。0 指定项目的更改不会导致订阅重新初始化。1 指定项目的更改可能导致订阅重新初始化，如果真是这样，则值 1 提供重新初始化订阅的权限。

返回代码值

0（成功）或 1（失败）

注释

sp_repladdcolumn 用于所有类型的复制。

当使用 sp_repladdcolumn 时，如果对某个项目的架构做了更改，而该项目所属的发布使用 DTS 包，则架构更改不会传播到订阅服务器，并且在订阅服务器上不会重新生成 INSERT/UPDATE/DELETE 的自定义过程。用户需要手工重新生成 DTS 包，并在订阅服务器上生成相应的架构更改。如果不应用架构更新，则分发代理程序应用随后的修改将失败。生成架构更改之前，确保没有要传送的挂起事务。有关更多信息，请参见如何转换已发布数据。

对于字符模式的发布，将筛选出时间戳列和计算列。如果使用 sp_repladdcolumn 添加时间戳或计算列，则这些发布的订阅不接收此新列。

重要 应在执行 sp_repladdcolumn 后执行发布数据库的备份。如果没有这样做，会在发布数据库还原后导致合并失败。


sp_replcmds

将在给定的数据库内运行 sp_replcmds 的第一个客户端视为日志读取器。返回被标记为复制的事务的命令。此存储过程在发布服务器的发布数据库上执行。

语法

sp_replcmds [ @maxtrans = ] maxtrans

参数

[@maxtrans =] maxtrans

是返回其信息的事务数。maxtrans 的数据类型为 int，默认值为 1，表示指定下一个等待分发的事务。

结果集

sp_replcmds 由日志读取器进程使用。此过程返回有关其执行时所在的发布数据库的信息。它使您得以查看当前没有随命令分发的事务（那些保留在事务日志中的、没有被发送到分发服务器的事务），并且返回项目 ID、partial_command（真或假）、命令、页、行和时间截。

注释

sp_replcmds 用于事务复制。

此过程可以为所有者限定的表或未限定的表名（默认值）生成命令。添加限定的表名允许将数据从一个数据库内的特定用户所拥有的表复制到这个用户在另一个数据库内所拥有的表中。

说明 由于源数据库内的表名是由所有者名称限定的，所以目标数据库内的表所有者必须具有相同的所有者名称。

尝试在同一数据库内运行 sp_replcmds 的客户端会收到 18752 号错误，直到第一个客户端断开连接为止。当第一个客户端断开连接后，另一个客户端可以运行 sp_replcmds，并成为新的日志读取器。

说明 应只在解决与复制有关的问题时才运行 sp_replcmds 过程。

如果因为在同一个事务中没有检索到文本指针而导致 sp_replcmds 无法复制文本命令，则将在 Microsoft® SQL Server™ 错误日志和 Microsoft Windows NT® 应用程序日志中添加 18759 号警告消息。

权限

只有 sysadmin 固定服务器角色成员或 db_owner 固定数据库角色成员才能执行 sp_replcmds。

请参见

错误信息

sp_repldone

sp_replflush

sp_repltrans

系统存储过程


sp_replcounters

为每个发布数据库返回有关滞后时间、吞吐量和事务计数的复制统计信息。此存储过程在发布服务器的任何数据库上执行。

语法

sp_replcounters

结果集
列名 | 数据类型 | 描述
Database | sysname | 数据库的名称。
Replicated transactions | int | 日志中等待传送到分发数据库的事务数。
Replication rate trans/sec | float | 平均每秒传送到分发数据库的事务数。
Replication latency | float | 事务在分发前位于日志中的平均时间（以秒为单位）。
Replbeginlsn | binary(10) | 日志中当前截断点的日志序列号。
Replendlsn | binary(10) | 等待传送到分发数据库的下一个提交记录的日志序列号。

注释

sp_replcounters 用于事务复制。

权限

public 角色成员可以执行 sp_replcounters。

请参见

sp_replcmds

sp_repldone

sp_replflush

系统存储过程


sp_repldone

更新标识服务器的上次分布式事务的记录。此存储过程在发布服务器的发布数据库上执行。

语法

sp_repldone [ @xactid = ] xactid
, [ @xact_seqno = ] xact_seqno
[ , [ @numtrans = ] numtrans ]
[ , [ @time = ] time
[ , [ @reset = ] reset ]

参数

[@xactid =] xactid

是服务器上次分布式事务的第一个记录的日志序列号 (LSN)。xactid 的数据类型为 binary(10)，无默认值。

[@xact_seqno =] xact_seqno

是服务器上次分布式事务的最后一个记录的日志序列号 (LSN)。xact_seqno 的数据类型为 binary(10)，无默认值。

[@numtrans =] numtrans

是分发的事务数。numtrans 的数据类型为 int，无默认值。

[@time =] time

是分发上一批事务所需的毫秒数（如果提供）。time 的数据类型为 int，无默认值。

[@reset =] reset

是重置状态。reset 的数据类型为 int，无默认值。如果是 1，则日志中的所有复制事务都标记为已分发。如果是 0，则事务日志重置为第一个复制事务并且复制事务不标记为已分发。仅当 xactid 和 xact_seqno 均为 NULL 时 reset 才有效。

返回代码值

0（成功）或 1（失败）

注释

sp_repldone 用于事务复制。

sp_repldone 由日志读取器进程用来跟踪已分发的事务。

注意 如果手工执行 sp_repldone，可以使已传送事务的顺序和一致性无效。

通过使用 sp_repldone，可以手工告诉服务器某个事务已复制（已发送到分发服务器）。此过程还使您得以更改标记为下一个等待复制的事务。可以在复制事务列表中前后移动。（小于或等于那个事务的所有事务都标记为已分发。）

可以通过使用 sp_repltrans 或 sp_replcmds 获得必需的参数 xactid 和 xact_seqno。

权限

sysadmin 固定服务器角色成员或 db_owner 固定数据库角色成员可以执行 sp_repldone。

示例

当 xactid 为 NULL、xact_seqno 为 NULL 并且 reset 是 1 时，日志中的所有复制事务都标记为已分发。此过程在事务日志中存在不再有效的复制事务并且想截断该日志时很有用，例如：

EXEC sp_repldone @xactid = NULL, @xact_segno = NULL, @numtrans = 0,    @time = 0, @reset = 1

注意 可以在紧急情况下使用此过程，以允许在有事务挂起复制时截断事务日志。使用此过程可防止 Microsoft® SQL Server™ 2000 在未发布和重新发布数据库之前复制数据库。

请参见

sp_replcmds

sp_replflush

sp_repltrans

系统存储过程


sp_repldropcolumn

从已发布的现有表项目中除去列。此存储过程在发布服务器的发布数据库上执行。

语法

sp_repldropcolumn [ @source_object = ] 'source_object'
, [ @column = ] 'column'
[ , [ @schema_change_script = ] 'schema_change_script' ]
 [ , [ @force_invalidate_snapshot = ] force_invalidate_snapshot ]
[ , [ @force_reinit_subscription = ] force_reinit_subscription ]

参数

[@source_object =] 'source_object'

是包含要除去的列的表项目名。source_object 的数据类型为 nvarchar(258)，无默认值。

[@column =] 'column'

是表中要除去的列名。column 的数据类型为 sysname，无默认值。

[@schema_change_script =] 'schema_change_script'

是 SQL 脚本的路径。schema_change_script 的数据类型为 nvarchar(4000)，默认值为 NULL。

[@force_invalidate_snapshot = ] force_invalidate_snapshot

启用或禁用使快照无效的能力。force_invalidate_snapshot 的数据类型为 bit，默认值为 1。1 指定项目的更改可能导致快照无效，如果真是这样，则值 1 提供产生新快照的权限。0 指定项目的更改不会导致快照无效。

[@force_reinit_subscription = ] force_reinit_subscription

启用或禁用使订阅重新初始化的能力。force_reinit_subscription 的数据类型为 bit，默认值为 0。0 指定项目的更改不会导致订阅重新初始化。1 指定项目的更改可能导致订阅重新初始化，如果真是这样，则值 1 提供重新初始化订阅的权限。

返回代码值

0（成功）或 1（失败）

注释

sp_repldropcolumn 用于所有类型的复制。

当使用 sp_repldropcolumn 时，如果对某个项目的架构做了更改，而该项目所属的发布使用 DTS 包，则架构更改不会传播到订阅服务器，并且在订阅服务器上不会重新生成 INSERT/UPDATE/DELETE 的自定义过程。用户需要手工重新生成 DTS 包，并在订阅服务器上生成相应的架构更改。如果不应用架构更新，则分发代理程序应用随后的修改将失败。生成架构更改之前，确保没有要传送的挂起事务。有关更多信息，请参见如何转换已发布数据。

重要 应在执行 sp_repldropcolumn后执行发布数据库的备份。如果没有这样做，会在发布数据库还原后导致合并失败。


sp_replflush

刷新项目高速缓存。此存储过程在发布服务器的发布数据库上执行。

语法

sp_replflush

返回代码值

0（成功）或 1（失败）

注释

sp_replflush 用于事务复制。

为获得高效率，项目定义存储在高速缓存中。每当修改或除去项目定义时，其它复制存储过程都使用 sp_seplflush。

只有一个客户端连接能够具有对给定数据库的日志读取器访问权。如果某个客户端具有对数据库的日志读取器访问权，则执行 sp_replflush 将导致该客户端释放其访问权。这样，其它的客户端就能使用 sp_replcmds 或 sp_replshowcmds 扫描事务日志。

不必手工执行此过程。

权限

只有 sysadmin 固定服务器角色成员或 db_owner 固定数据库角色成员才能执行 sp_replflush。

请参见

sp_replcmds

sp_repldone

sp_repltrans

系统存储过程


sp_replication_agent_checkup

检查每个分发数据库的复制代理程序，这些复制代理程序正在运行但在指定的心跳信号间隔内没有历史记录。此存储过程在分发服务器的任何数据库上执行。

语法

sp_replication_agent_checkup [ [ @heartbeat_interval = ] heartbeat_interval ]

参数

[@heartbeat_interval =] 'heartbeat_interval'

是代理程序在不记录进度消息的情况下可以运行的最长分钟数。heartbeat_interval 的数据类型为 int，默认值为 10 分钟。

返回代码值

sp_replication_agent_checkup 为检测到的每个置疑代理程序生成 14151 号错误。它还记录关于该代理程序的失败历史记录消息。

注释

sp_replication_agent_checkup 用于快照复制、事务复制和合并复制。

权限

只有 sysadmin 固定服务器角色成员才能执行 sp_replication_agent_checkup。

请参见

系统存储过程


sp_replicationdboption

为当前数据库设置复制数据库选项。此存储过程在发布服务器的任何数据库上执行。

语法

sp_replicationdboption [ @dbname = ] 'db_name' ,
[ @optname = ] 'optname' ,
[@value =] 'value'
[ , [ @ignore_distributor = ] ignore_distributor ]
[ , [ @from_scripting = ] from_scripting ]

参数

[@dbname =] 'dbname'

是要除去的数据库。db_name 的数据类型为 sysname，无默认值。

[@optname =] 'optname'

是要创建或除去的选项。optname 的数据类型为 sysname，可以是下列值之一。

值 | 描述
merge publish | 数据库可用于合并发布。
publish | 数据库可用于其它的发布类型。

[@value =] 'value'

表示是否创建或除去给定复制数据库的选项。value 的数据类型为 sysname，可以是 true 或 false。false 还除去合并订阅。

[@ignore_distributor =] ignore_distributor

表示是否在不连接到分发服务器的情况下执行此存储过程。ignore_distributor 的数据类型为 bit，默认值为 0，表示应连接到分发服务器并使用发布数据库的新状态进行更新。只有当无法访问分发服务器以及正使用 sp_replicationdboption 禁用发布时才应指定值 1。

[@from_scripting =] from_scripting

仅限内部使用。

返回代码值

0（成功）或 1（失败）

注释

sp_replicationdboption 用于快照复制、事务复制和合并复制。

此过程根据给定的选项创建或除去特定的复制系统表、安全帐户，等等。在 master.sysdatabases 系统表中设置相应的分类位并创建必要的系统表。

权限

只有 sysadmin 固定服务器角色成员才能执行 sp_replicationdboption。

请参见

sysdatabases

系统存储过程


sp_replsetoriginator

用于在事务复制中唤醒调用环回检测和处理。此存储过程在发布服务器的发布数据库上执行。

语法

sp_replsetoriginator [ @server_name = ] 'server_name'
 [@database_name =] 'database_name'

参数

[@server_name =] 'server_name'

是正应用该事务的服务器名。originating_server 的数据类型为 sysname，无默认值。

[@database_name =] 'database_name'

是正应用该事务的数据库名。originating_db 的数据类型为 sysname，无默认值。

返回代码值

0（成功）或 1（失败）

注释

sp_replsetoriginator 由分发代理程序用来记录复制所应用的事务源。这些信息用于为具有环回属性集的事务订阅唤醒调用环回检测。即时更新订阅和双向事务复制用于为订阅设置环回检测属性。

权限

public 角色成员可以执行 sp_replsetoriginator。

请参见

系统存储过程


sp_replshowcmds

以可读格式返回被标记为复制的事务的命令。只有当客户端连接（包括当前连接）没有从日志中读取复制事务时才能运行 sp_replshowcmds。此存储过程在发布服务器的发布数据库上执行。

语法

sp_replshowcmds [ @maxtrans = ] maxtrans

参数

[@maxtrans =] maxtrans

是返回有关其信息的事务数。maxtrans 的数据类型为 int，默认值为 1，用以指定 sp_replshowcmds 将为其返回信息的事务挂起复制的最大数。

结果集

sp_replshowcmds 是一个诊断过程，返回有关此过程执行时所在的发布数据库的信息。

列名 | 数据类型 | 描述
xact_seqno | binary(10) | 命令的序列号。
originator_id | int | 命令创建人的 ID，始终为 0。
publisher_database_id | int | 发布服务器数据库的 ID，始终为 0。
article_id | int | 项目的 ID。
type | int | 命令的类型。
command | nvarchar(1024) | Transact-SQL 命令。

注释

sp_replshowcmds 用于事务复制。

通过使用 sp_replshowcmds，可以查看当前没有分发的事务（保留在事务日志中尚未发送到分发服务器的事务）。

在同一数据库内运行 sp_replshowcmds 和 sp_replcmds 的客户端会收到 18752 号错误。

若要避免此错误，必须断开第一个客户端，或者必须执行 sp_replflush 释放该客户端作为日志读取器的角色。在所有客户端都与日志读取器断开连接后，可以成功运行 sp_replshowcmds。

说明 只有在解决与复制有关的问题时才应运行 sp_replshowcmds。

权限

只有 sysadmin 固定服务器角色成员或 db_owner 固定数据库角色成员才能执行 sp_replshowcmds。

请参见

错误信息

sp_replcmds

sp_repldone

sp_replflush

sp_repltrans

系统存储过程


sp_repltrans

返回由发布数据库事务日志中所有标记为复制、但没有标记为已分发的事务组成的结果集。此存储过程在发布服务器的发布数据库上执行。

语法

sp_repltrans

结果集

sp_repltrans 返回有关其执行时所在的发布数据库的信息，这使您得以查看当前没有分发的事务（保留在事务日志中尚未发送到分发服务器的事务）。结果集显示每个事务的第一个和最后一个记录的日志序列号。sp_repltrans 与 sp_replcmds 相似，但不为事务返回命令。

注释

sp_repltrans 用于事务复制。

权限

只有 sysadmin 固定服务器角色成员或 db_owner 固定数据库角色成员才能执行 sp_repltrans。

请参见

sp_replcmds

sp_repldone

sp_replflush

系统存储过程


sp_restoredbreplication

如果将数据库还原到本来无法运行复制进程的非发起服务器、数据库或系统，则删除复制设置。当将已复制数据库还原到执行备份的服务器或数据库以外的其它服务器或数据库时，无法保留复制设置。在还原时，服务器直接调用 sp_restoredbreplication 以从还原的数据库中自动删除复制元数据。

语法

sp_restoredbreplication [ @srv_orig = ] 'original_server_name'
, [ @db_orig = ] 'original_database_name'
[ , [ @keep_replication = ] keep_replication ]

参数

[@srv_orig =] 'original_server_name'

执行备份的服务器名称。original_server_name 的数据类型为 sysname，无默认值。

[ @db_orig = ] 'original_database_name'

执行备份的数据库名称。original_database_name 的数据类型为 sysname，无默认值。

[@keep_replication =] keep_replication

仅限内部使用。

注释

sp_restoredbreplication 用于所有类型的复制。

权限

只有 sysadmin 固定服务器角色成员或 db_owner 固定数据库角色成员才能执行 sp_restoredbreplication。


sp_resyncmergesubscription

将合并订阅重新同步到指定的已知验证状态。这使您得以将订阅数据库强制集中或同步到特定的即时点（如上次成功验证的时间）或指定的日期。使用此方法重新同步订阅时，不重新应用快照。此存储过程不用于快照复制订阅和事务复制订阅。此存储过程在发布服务器的发布数据库上或订阅服务器的订阅数据库上执行。

语法

sp_resyncmergesubscription [ [ @publisher = ] 'publisher' ]
[ , [ @publisher_db = ] 'publisher_db' ]
, [ @publication = ] 'publication '
[ , [ @subscriber = ] 'subscriber' ]
[ , [ @subscriber_db = ] 'subscriber_db' ]
[ , [ @resync_type = ] resync_type ]
[ , [ @resync_date_str = ] resync_date_string ]

参数

[@publisher =] 'publisher'

是发布服务器名称。publisher 的数据类型为 sysname，默认设置为 NULL。如果此存储过程运行在发布服务器上，则 NULL 值有效。如果此存储过程运行在订阅服务器上，则必须指定发布服务器。

[@publisher_db =] 'publisher_db'

是发布数据库名。publisher_db 的数据类型为 sysname，默认值为 NULL。如果此存储过程运行在发布服务器的发布数据库上，则 NULL 值有效。如果此存储过程运行在订阅服务器上，则必须指定发布服务器。

[@publication =] 'publication'

是发布名。publication 的数据类型为 sysname，无默认值。

[@subscriber =] 'subscriber'

是订阅服务器名。subscriber 的数据类型为 sysname，默认设置为 NULL。如果此存储过程运行在订阅服务器上，则 NULL 值有效。如果此存储过程运行在发布服务器上，则必须指定订阅服务器。

[@subscriber_db = ] 'subscriber_db'

是订阅数据库名称。subscription_db 的数据类型为 sysname，默认设置为 NULL。如果此存储过程运行在订阅服务器的订阅数据库上，则 NULL 值有效。如果此存储过程运行在发布服务器上，则必须指定订阅服务器。

[@resync_type =] resync_type

定义重新同步的开始时间。resync_type 的数据类型为 int，可以是下列值之一：

值 | 描述
0 | 同步从初始快照后开始。这是占用资源最多的选项，因为自初始快照后的所有更改都重新应用于订阅服务器。
1 | 同步从上次成功验证后开始。所有自上次成功验证后发生的所有新的或未完成的生成都将重新应用于订阅服务器。
2 | 同步从 resync_date_str 中给定的日期开始。所有在该日期后发生的新的或未完成的生成都将重新应用于订阅服务器。

[@resync_date_str =] resync_date_string

定义重新同步的开始日期。resync_type 的数据类型为 nvarchar(30)，默认值为 NULL。当 resync_type 的值为 2 时使用此参数。给定的日期将转换为等价的 datetime 值。

返回代码值

0（成功）或 1（失败）

注释

sp_resyncmergesubscription 用于合并复制。

resync_type 参数的值为 0，表示重新应用自初始快照后发生的所有更改。该值可能需要大量资源，但可能比完全重新初始化占用的资源少得多。例如，如果初始快照是一个月前做的，则该值将重新应用上个月的数据。如果初始快照包含 1 GB 数据，但上个月的更改量包含 2 MB 的更改数据，则重新应用更改的数据比重新应用完整的 1 GB 快照更有效。

权限

只有 sysadmin 固定服务器角色成员或 db_owner 固定数据库角色成员才能执行 sp_resyncmergesubscription。

请参见

datetime 和 smalldatetime

系统存储过程

验证已复制的数据


sp_revoke_publication_access

从发布访问列表中删除登录。此存储过程在发布服务器的发布数据库上执行。

语法

sp_revoke_publication_access [ @publication = ] 'publication'
, [ @login = ] 'login'

参数

[@publication =] 'publication'

是要访问的发布名。publication 的数据类型为 sysname，无默认值。

[ @login = ] 'login'

是登录 ID。login 的数据类型为 sysname，无默认值。

返回代码值

0（成功）或 1（失败）

注释

sp_revoke_publication_access 用于快照复制、事务复制和合并复制。

sp_revoke_publication_access 可反复调用。

权限

只有 sysadmin 固定服务器角色成员或 db_owner 固定数据库角色成员才能执行 sp_revoke_publication_access。

请参见

sp_grant_publication_access

sp_help_publication_access

系统存储过程


sp_script_synctran_commands

生成一个脚本以包含将在可更新订阅的订阅服务器上应用的 sp_addsynctrigger 调用。发布中的每个项目都有一个 sp_addsynctrigger 调用。此存储过程在发布服务器的发布数据库上执行。

语法

sp_script_synctran_commands [@publication =] 'publication'
[ , [@article =] 'article']

参数

[@publication =] 'publication'

是要写入脚本的发布名。publication 的数据类型为 sysname，无默认值。

[@article =] 'article'

是要写入脚本的项目名。article 的数据类型为 sysname，默认值为 all，表示指定将所有项目都写入脚本。

返回代码值

0（成功）或 1（失败）

结果集

sp_script_synctran_commands 返回由单个 nvarchar(4000) 列组成的结果集。该结果集将形成一个完整的脚本，该脚本对于创建将应用在订阅服务器上的 sp_addsynctrigger 调用是必需的。

注释

sp_script_synctran_commands 用于快照复制和事务复制。

权限

执行权限默认授予 public 角色。

请参见

sp_addsynctriggers

系统存储过程


sp_setreplfailovermode

使您得以为订阅（为将排队更新设置为故障转移的即时更新而启用）设置故障转移操作模式。此存储过程在订阅服务器的订阅数据库上执行。

语法

sp_setreplfailovermode [ @publisher = ] 'publisher'
[ , [ @publisherdb = ] 'publisher_db' ]
[ , [ @publication = ] 'publication' ]
[ , [ @failover_mode = ] 'failover_mode' ]

参数

[@publisher =] 'publisher'

是发布名。publication 的数据类型为 sysname，无默认值。发布必须已存在。

[@publisher_db =] 'publisher_db'

是发布数据库名。publisher_db 的数据类型为 sysname，无默认值。

[@publication =] 'publication'

是发布名。publication 的数据类型为 sysname，无默认值。

[@failover_mode =] 'failover_mode'

是订阅的故障转移模式。failover_mode 的数据类型为 nvarchar(20)，可以是下列值之一：

值 | 描述
immediate | 订阅服务器上的数据修改将被大容量复制到发布服务器。
queued | 数据修改将存储在 SQL Server 队列或消息队列中。

返回代码值

0（成功）或 1（失败）

注释

sp_setreplfailovermode 用于启用了即时更新订阅的快照复制或事务复制，发生故障时将排队更新作为故障转移。

权限

只有 sysadmin 固定服务器角色成员或 db_owner 固定数据库角色成员才能执行 sp_addmergesubscription。


sp_showrowreplicainfo

显示有关在合并复制中用作项目的表中的行的信息。此存储过程在存储该表的计算机和数据库中执行。

语法

sp_showrowreplicainfo [ [ @ownername = ] 'ownername' ]
    , [ @tablename =] 'tablename'
, [ @rowguid =] 'rowguid'
[ , [ @show = ] 'show' ]

参数

[@ownername = ] 'ownername'

是表所有者的名称。publication 的数据类型为 sysname，默认值为 NULL。如果数据库包含多个具有同一名称的表，但每个表的所有者不同时，此参数对区分这些表很有用。

[@tablename =] 'tablename'

是包含所返回的信息行的表的名称，tablename 的数据类型为 sysname，没有默认设置。

[@rowguid =] 'rowguid'

是行的唯一标识符。rowguid 的数据类型为 uniqueidentifier，无默认值。

[@show = ] 'show'

决定结果集中将返回的信息量。show 的数据类型为 nvarchar(20)，默认设置为 BOTH。如果为 row，则只返回行版本信息。如果为 columns，则只返回列版本信息。如果为 both，则将同时返回行信息和列信息。

行信息的结果集
列名 | 数据类型 | 描述
server_name |  | 宿主数据库并生成行版本项目的服务器的名称。
db_name |  | 生成此项目的数据库的名称。
db_nickname |  | 生成此项目的数据库的别名。
version |  | 项目的版本。
rowversion_table |  | 表明行版本存储在 MSmerge_contents 表还是 MSmerge_tombstone 表中。
comment |  | 有关此行版本项目的附加信息。通常，此字段为空。

列信息的结果集
列名 | 数据类型 | 描述
server_name |  | 宿主数据库并生成列版本项目的服务器的名称。
db_name |  | 生成此项目的数据库的名称。
db_nickname |  | 生成此项目的数据库的别名。
version |  | 项目的版本。
colname |  | 列版本项目代表的项目列的名称。
comment |  | 有关此列版本项目的附加信息。通常，该字段为空。

二者的结果集

如果为 @show 选择值 both，则将同时返回行结果集和列结果集。

注释

sp_showrowreplicainfo 用于合并复制。

权限

public 角色的成员可以执行 sp_showrowreplicainfo。

请参见

合并复制冲突的检测和解决

系统存储过程


sp_subscription_cleanup

当在订阅服务器上除去订阅时删除元数据。对于普通的订阅，元数据在系统表 MSreplication_subscriptions 中包括一项。对于同步事务订阅，还包括即时更新触发器。此存储过程在订阅服务器的订阅数据库上执行。

语法

sp_subscription_cleanup [ @publisher = ] 'publisher'
, [ @publisher_db = ] 'publisher_db'
[ , [ @publication = ] 'publication']
[ , [ @reserved = ] 'reserved']

参数

[@publisher =] 'publisher'

是发布服务器名。publisher 的数据类型为 sysname，无默认值。

[@publisher_db =] 'publisher_db'

是发布服务器数据库名。publisher_db 的数据类型为 sysname，无默认值。

[@publication =] 'publication'

是发布名。publication 的数据类型为 sysname，默认值为 NULL。如果为 NULL，则将删除发布数据库中使用共享代理程序发布的订阅。

[@reserved =] 'reserved'

仅限内部使用。

返回代码值

0（成功）或 1（失败）

注释

sp_subscription_cleanup 用于所有类型的复制。

权限

只有 sysadmin 固定服务器角色成员或 db_owner 固定数据库角色成员才能执行 sp_subscription_cleanup。

请参见

sp_expired_subscription_cleanup

sp_mergesubscription_cleanup

系统存储过程


sp_table_validation

或者返回有关表或索引视图的行数或校验值信息，或者将提供的行数或校验值信息与指定的表或索引视图进行比较。此存储过程在发布服务器的发布数据库上执行。

语法

sp_table_validation [ @table = ] 'table'
[ , [ @expected_rowcount = ] type_of_check_requested OUTPUT]
[ , [ @expected_checksum = ] expected_checksum OUTPUT]
[ , [ @rowcount_only = ] rowcount_only ]
[ , [ @owner = ] 'owner' ]
[ , [ @full_or_fast = ] full_or_fast ]
[ , [ @shutdown_agent = ] shutdown_agent ]
[ , [ @table_name = ] table_name ]
[ , [ @column_list = ] 'column_list' ]

参数

[@table =] 'table'

是表名。table 的数据类型为 sysname，无默认值。

[@expected_rowcount =] expected_rowcount OUTPUT

指定是否返回表中的预期行数。expected_rowcount 的数据类型为 int，默认值为 NULL。如果为 NULL，则表示将实际的行数作为输出参数返回。如果提供了值，则将对照实际的行数检查该值以确定任何差异。

[@expected_checksum =] expected_checksum OUTPUT

指定是否返回表的预期校验值。expected_checksum 的数据类型为 numeric，默认值为 NULL。如果为 NULL，则表示将实际的校验值作为输出参数返回。如果提供了值，则将对照实际的校验值检查该值以确定任何差异。

[@rowcount_only =] type_of_check_requested

指定执行的校验值类型或行数。type_of_check_requested 的数据类型为 smallint，默认值为 1。如果为 0，则执行 SQL Server 7.0 兼容的校验值。如果为 1，则只执行行数检查。如果为 2，则执行行数和校验值。

[@owner =] 'owner'

是表所有者的名称。owner 的数据类型为 sysname，默认值为 NULL。

[@full_or_fast =] full_or_fast

是计算行数的方法。full_or_fast 的数据类型为 tinyint，默认值为 2，可以是下列值之一。

值 | 描述
0 | 用 COUNT(*) 进行完整计数。
1 | 从 sysindexes.rows 进行快速计数。在 sysindexes 中对行进行计数比在实表中计数快得多。但由于很少对 sysindexes 进行更新，所以行计数可能不准确。
2（默认值） | 首先使用快速方法进行条件快速计数。如果快速方法显示出差异，则转而使用完整方法。如果 expected_rowcount 的值为 NULL，而且正在使用存储过程获取该值，则始终使用完整 COUNT(*)。

[@shutdown_agent =] shutdown_agent

如果分发代理程序正在执行 sp_table_validation，则指定分发代理程序是否在验证完成后立即关闭。shutdown_agent 的数据类型为 bit，默认值为 0。如果为 0，则复制代理程序不关闭。如果为 1，则将产生 20578 号错误，并通知复制代理程序关闭。

[@table_name =] table_name

是用于输出消息的视图的表名。table_name 的数据类型为 sysname，默认值为 @table。

[@column_list = ] 'column_list'

是用于 binary_checksum 函数的列的列表。column_list 的数据类型为 nvarchar(4000)，默认值为 NULL。启用合并项目验证，以指定排除计算列和时间戳列的列的列表。

返回代码值

如果执行校验值验证并且预期的校验值与表中的校验值相等，sp_table_validation 将返回一条消息指出该表已通过校验值验证。否则，将返回一条消息指出表可能不同步，并报告预期的行数和实际行数之间的差异。

如果执行行数验证并且预期的行数与表中的行数相等，sp_table_validation 将返回一条消息指出该表已通过行数验证。否则，将返回一条消息指出表可能不同步，并报告预期的行数和实际行数之间的差异。

注释

sp_table_validation 用于所有类型的复制。

校验值在页的整个行映像上计算 32 位循环冗余检查 (CRC)。它不是有选择地检查列，并且不能在视图或表的垂直分区上操作。另外，校验值跳过 text 和 image 列的内容（根据设计）。

执行校验值检查时，两个服务器的表结构必须完全相同；也就是说，表中包含的列必须相同，且列的顺序、数据类型和长度以及 NULL/NOT NULL 条件都必须相同。例如，如果发布服务器使用 CREATE TABLE，然后使用 ALTER TABLE 添加列，但是发布服务器上应用的脚本是一个简单的 CREATE 表，则表结构不相同。如果不能确定两个表的结构是否相同，可以查看 syscolumns 并确定每个表中的偏移量是否相同。

如果使用了字符模式的 bcp（当发布中包含异类订阅服务器时会发生这种情况），则浮点值很可能产生校验值差异。这是由于在进行字符模式转换时，精度上存在不可避免的微小差异。

权限

只有 sysadmin 固定服务器角色成员或 db_owner 固定数据库角色成员才能执行 sp_table_validation。

请参见

sp_article_validation

sp_publication_validation

系统存储过程


sp_update_agent_profile

更新某类复制代理程序的配置。此存储过程在分发服务器的分发数据库上执行。

语法

sp_update_agent_profile [@agent_type =] agent_type
, [ @agent_id = ] agent_id
, [ @profile_id = ] profile_id

参数

[ @agent_type = ] 'agent_type'

是代理程序的类型。agent_type 的数据类型为 int，无默认值，可以是下列值之一。

值 | 描述
1 | 快照代理程序。
2 | 日志读取器代理程序。
3 | 分发代理程序。
4 | 合并代理程序。
9 | 队列读取器代理程序。

[@agent_id = ] agent_id

是代理程序的 ID。agent_id 的数据类型为 int，无默认值。

[@profile_id = ] profile_id

是这类代理程序的默认配置 ID。profile_id 的数据类型为 int，无默认值。

返回代码值

0（成功）或 1（失败）

注释

sp_update_agent_profile 用于所有类型的复制。

权限

只有 sysadmin 固定服务器角色成员才能执行 sp_update_agent_profile。

请参见

sp_add_agent_profile

sp_change_agent_profile

sp_drop_agent_profile

sp_help_agent_profile

系统存储过程


sp_validatemergepublication

执行整个发布范围内的验证，一次性地验证所有订阅（强制、请求和匿名）。此存储过程在发布服务器的发布数据库上执行。

语法

sp_validatemergepublication [@publication =] 'publication'
, [ @level = ] level

参数

[@publication =] 'publication'

是发布名。publication 的数据类型为 sysname，无默认值。

[@level = ] level

是要执行的验证类型。level 的数据类型为 tinyint，无默认值。级别可以是下列值之一：

级别值 | 描述
1 | 只验证行数。
2 | 验证行数和校验值。
3 | 验证行数和二进制校验值。

验证级别 3 仅当订阅服务器运行 Microsoft® SQL Server™ 2000 时有效。

返回代码值

0（成功）或 1（失败）

注释

sp_validatemergepublication 用于合并复制。

权限

只有 sysadmin 固定服务器角色成员才能执行 sp_validatemergepublication。

请参见

系统存储过程

验证已复制的数据


sp_validatemergesubscription

执行对指定订阅的验证。此存储过程在发布服务器的发布数据库上执行。

语法

sp_validatemergesubscription [@publication =] 'publication'
, [ @subscriber = ] 'subscriber'
, [ @subscriber_db = ] 'subscriber_db'
, [ @level = ] level

参数

[@publication =] 'publication'

是发布名。publication 的数据类型为 sysname，无默认值。

[@subscriber =] 'subscriber'

是订阅服务器名。subscriber 的数据类型为 sysname，无默认值。

[@subscriber_db =] 'subscriber_db'

是订阅数据库名。subscriber_db 的数据类型为 sysname，无默认值。

[@level = ] level

是要执行的验证类型。level 的数据类型为 tinyint，无默认值。级别可以是下列值之一：

级别值 | 描述
1 | 只验证行数。
2 | 验证行数和校验值。
3 | 验证行数和二进制校验值。

返回代码值

0（成功）或 1（失败）

注释

sp_validatemergesubscription 用于合并复制。

权限

只有 sysadmin 固定服务器角色成员才能执行 sp_validatemergesubscription。

请参见

系统存储过程

验证已复制的数据

验证订阅服务器信息


sp_vupgrade_replication

从 SQL Server 7.0 或更高版本升级复制服务器时由安装程序激活。根据需要升级架构和系统数据，以支持当前产品级别上的复制。在系统和用户数据库中创建新的复制系统对象。此存储过程在要发生复制更新的计算机上执行。

语法

sp_vupgrade_replication [ [@login =] 'login' ]
[ , [ @password = ] 'password' ]
[ , [ @ver_old = ] 'old_version' ]
[ , [ @force_remove = ] 'force_removal' ]
[ , [ @security_mode = ] security_mode ]

参数

[ @login = ] 'login'

是在分发数据库中创建新系统对象时使用的系统管理员登录。login 的数据类型为 sysname，默认值为 SA。如果 security_mode 设置为 1（NT 身份验证），则不需要此参数。

[@password = ] 'password'

是在分发数据库中创建新系统对象时使用的系统管理员密码。password 的数据类型为 sysname，默认值为 ''（空字符串）。如果 security_mode 设置为 1（NT 身份验证），则不需要此参数。

[@ver_old = ] 'old_version'

仅限内部使用。

[@force_remove = ] 'force_removal'

仅限内部使用。

[@security_mode =] security_mode

是在分发数据库中创建新系统对象时使用的登录安全模式。security_mode 的数据类型为 bit，默认值为 0。如果为 0，则将使用 SQL Server 身份验证。如果为 1，则将使用 NT 身份验证。

返回代码值

0（成功）或 1（失败）

注释

从 SQL Server 6.5 升级时不使用 sp_vupgrade_replication。

权限

只有 sysadmin 固定服务器角色成员才能执行 sp_vupgrade_replication。

请参见

安装 SQL Server 2000 概述

复制概述

系统存储过程

复制相关帮助

从 SQL Server 7.0 升级到 SQL Server 2000

验证已复制的数据

验证订阅服务器信息


sql_replqueuemonitor

列出 SQL Server 队列或消息队列中指定发布的排队更新订阅的队列消息。如果使用 SQL Server 队列，则此存储过程在订阅服务器的订阅数据库上执行。如果使用 Microsoft 消息队列，则此存储过程在分发服务器的分发数据库上执行。

语法

sp_replqueuemonitor [ @publisher = ] 'publisher'
[ , [ @publisherdb = ] 'publisher_db' ]
[ , [ @publication = ] 'publication' ]
[ , [ @tranid = ] 'tranid' ]
[ , [ @queuetype = ] 'queuetype' ]

参数

[@publisher =] 'publisher'

是发布服务器名称。publisher 的数据类型为 sysname，默认设置为 NULL。该服务器必须配置为可以用于发布。对所有发布服务器均为 NULL。

[ @publisherdb = ] 'publisher_db' ]

是发布数据库名。publisher_db 的数据类型为 sysname，默认值为 NULL。对所有发布数据库均为 NULL。

[ @publication = ] 'publication' ]

是发布名。publication 的数据类型为 sysname，默认值为 NULL。对所有发布均为 NULL。

[ @tranid = ] 'tranid' ]

是事务 ID。tranid 的数据类型为 sysname，默认设置为 NULL。对所有事务均为 NULL。

[ @queuetype = ] 'queuetype' ]

是存储事务的队列类型。queuetype 的数据类型为 tinyint，默认值为 0，可以下列值之一。

值 | 描述
0 | 所有队列类型
1 | 消息队列
2 | SQL Server 队列

返回代码值

0（成功）或 1（失败）

注释

sp_replqueuemonitor 用于已启用排队更新订阅的快照复制或事务复制。不显示不包含 SQL 命令的队列消息，也不显示作为跨越式 SQL 命令的一部分的队列消息。

权限

只有 sysadmin 固定服务器角色成员或 db_owner 固定数据库角色成员才能执行 sp_addmergesubscription。

请参见

系统存储过程

排队更新组件

排队更新


信息架构视图

Microsoft® SQL Server™ 提供下面两种获取元数据的方法：系统存储过程和信息架构视图。

说明 若要获取元数据，请使用系统存储过程、系统函数或只是这些系统提供的视图。如果在将来的版本中对系统表进行修改，那么直接查询系统表可能不会提供准确的信息。

这些视图提供关于 SQL Server 元数据的独立于系统表的内部视图。即使已经对系统表进行了重要的修改，信息架构视图也允许应用程序正常地工作。SQL Server 中包含的信息架构视图符合 SQL-92 标准针对 INFORMATION_SCHEMA 的定义。

SQL Server 支持使用三段命名规则引用当前的服务器。SQL-92 标准也支持三段命名规则。但是，在两个命名规则中使用的名称是不同的。这些视图在一个名为 INFORMATION_SCHEMA 的特殊架构中定义。每个数据库都包含这个架构。每个 INFORMATION_SCHEMA 视图中都包含特定数据库中存储的所有数据对象的元数据。下表描述 SQL Server 名称和 SQL-92 标准名称之间的关系。

SQL Server 名称 | 映射到下面等价的 SQL-92 名称
数据库 | 目录
所有者 | 架构
对象 | 对象
用户定义数据类型 | 域

这个命名规则映射适用于那些与 SQL Server SQL-92 兼容的视图。这些视图在一个名为 INFORMATION_SCHEMA 的特殊架构中定义。每个数据库都包含这个架构。每个 INFORMATION_SCHEMA 视图中都包含特定数据库中存储的所有数据对象的元数据。

  • CHECK_CONSTRAINTS

  • COLUMN_DOMAIN_USAGE

  • COLUMN_PRIVILEGES

  • COLUMNS

  • CONSTRAINT_COLUMN_USAGE

  • CONSTRAINT_TABLE_USAGE

  • DOMAIN_CONSTRAINTS

  • DOMAINS

  • KEY_COLUMN_USAGE

  • PARAMETERS

  • REFERENTIAL_CONSTRAINTS

  • ROUTINES

  • ROUTINE_COLUMNS

  • SCHEMATA

  • TABLE_CONSTRAINTS

  • TABLE_PRIVILEGES

  • TABLES

  • VIEW_COLUMN_USAGE

  • VIEW_TABLE_USAGE

  • VIEWS

此外，有些视图还包含对不同数据类（例如字符数据或二进制数据）的引用。

引用信息架构视图时，必须在通常指定用户名称的位置使用包含 INFORMATION_SCHEMA 架构名称的完全合格的名称。例如：

SELECT *
FROM Northwind.INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = N'Customers'

请参见

数据类型

系统存储过程


CHECK_CONSTRAINTS

当前数据库的每个 CHECK 约束在该视图中占一行。该信息架构视图返回当前用户对其拥有权限的对象的有关信息。INFORMATION_SCHEMA.CHECK_CONSTRAINTS 视图以 sysobjects 和 syscomments 系统表为基础。

若要从这些视图中检索信息，请指定完全合格的 INFORMATION_SCHEMA view_name 名称。

列名 | 数据类型 | 描述
CONSTRAINT_CATALOG | nvarchar(128) | 约束限定符。
CONSTRAINT_SCHEMA | nvarchar(128) | 约束所有者。
CONSTRAINT_NAME | sysname | 约束名称。
CHECK_CLAUSE | nvarchar(4000) | Transact-SQL 定义语句的实际文本。

请参见

syscomments

sysobjects


COLUMN_DOMAIN_USAGE

当前数据库中每个带有用户定义数据类型的列在该视图中占一行。该信息架构视图返回当前用户对其拥有权限的对象的有关信息。INFORMATION_SCHEMA.COLUMN_DOMAIN_USAGE 视图以 sysobjects、syscolumns 和 systypes 系统表为基础。

若要从这些视图中检索信息，请指定完全合格的 INFORMATION_SCHEMA view_name 名称。

列名 | 数据类型 | 描述
DOMAIN_CATALOG | nvarchar(128) | 用户定义数据类型所在的数据库。
DOMAIN_SCHEMA | nvarchar(128) | 创建用户定义的数据类型的用户名。
DOMAIN_NAME | sysname | 用户定义数据类型。
TABLE_CATALOG | nvarchar(128) | 表限定符。
TABLE_SCHEMA | nvarchar(128) | 表所有者。
TABLE_NAME | sysname | 使用用户定义数据类型的表。
COLUMN_NAME | sysname | 使用用户定义数据类型的列。

请参见

syscomments

sysobjects

systypes


COLUMN_PRIVILEGES

每一个带有特权的列在该视图中占一行，这个特权是由当前数据库中的当前用户授予的，或者授予了当前数据库中的当前用户。INFORMATION_SCHEMA.COLUMN_PRIVILEGES 视图以 sysprotects、sysobjects 和 syscolumns 系统表为基础。

若要从这些视图中检索信息，请指定完全合格的 INFORMATION_SCHEMA view_name 名称。

列名 | 数据类型 | 描述
GRANTOR | nvarchar(128) | 特权授予方。
GRANTEE | nvarchar(128) | 特权被授予方。
TABLE_CATALOG | nvarchar(128) | 表限定符。
TABLE_SCHEMA | nvarchar(128) | 表所有者。
TABLE_NAME | sysname | 表名。
COLUMN_NAME | sysname | 列名。
PRIVILEGE_TYPE | varchar(10) | 特权的类型。
IS_GRANTABLE | varchar(3) | 指定被授权方是否能够将权限授予其他人。

请参见

syscomments

sysobjects

sysprotects


COLUMNS

当前数据库中当前用户可以访问的每一个列在该视图中占一行。INFORMATION_SCHEMA.COLUMNS 视图以 sysobjects、spt_data type_info、systypes、syscolumns、syscomments、sysconfigures 以及 syscharsets 系统表为基础。

若要从这些视图中检索信息，请指定完全合格的 INFORMATION_SCHEMA view_name 名称。

列名 | 数据类型 | 描述
TABLE_CATALOG | nvarchar(128) | 表限定符。
TABLE_SCHEMA | nvarchar(128) | 表所有者。
TABLE_NAME | nvarchar(128) | 表名。
COLUMN_NAME | nvarchar(128) | 列名。
ORDINAL_POSITION | smallint | 列标识号。
COLUMN_DEFAULT | nvarchar(4000) | 列的默认值。
IS_NULLABLE | varchar(3) | 列的为空性。如果列允许 NULL，那么该列返回 YES。否则，返回 NO。
DATA_TYPE | nvarchar(128) | 系统提供的数据类型。
CHARACTER_MAXIMUM_LENGTH | smallint | 以字符为单位的最大长度，适于二进制数据、字符数据，或者文本和图像数据。否则，返回 NULL。有关更多信息，请参见数据类型。
CHARACTER_OCTET_LENGTH | smallint | 以字节为单位的最大长度，适于二进制数据、字符数据，或者文本和图像数据。否则，返回 NULL。
NUMERIC_PRECISION | tinyint | 近似数字数据、精确数字数据、整型数据或货币数据的精度。否则，返回 NULL。
NUMERIC_PRECISION_RADIX | smallint | 近似数字数据、精确数字数据、整型数据或货币数据的精度基数。否则，返回 NULL。
NUMERIC_SCALE | tinyint | 近似数字数据、精确数字数据、整数数据或货币数据的小数位数。否则，返回 NULL。
DATETIME_PRECISION | smallint | datetime 及 SQL-92 interval 数据类型的子类型代码。对于其它数据类型，返回 NULL。
CHARACTER_SET_CATALOG | varchar(6) | 如果列是字符数据或 text 数据类型，那么返回 master，指明字符集所在的数据库。否则，返回 NULL。
CHARACTER_SET_SCHEMA | varchar(3) | 如果列是字符数据或 text 数据类型，那么返回 DBO，指明字符集的所有者名称。否则，返回 NULL。
CHARACTER_SET_NAME | nvarchar(128) | 如果该列是字符数据或 text 数据类型，那么为字符集返回唯一的名称。否则，返回 NULL。
COLLATION_CATALOG | varchar(6) | 如果列是字符数据或 text 数据类型，那么返回 master，指明在其中定义排序次序的数据库。否则此列为 NULL。
COLLATION_SCHEMA | varchar(3) | 返回 DBO，为字符数据或 text 数据类型指明排序次序的所有者。否则，返回 NULL。
COLLATION_NAME | nvarchar(128) | 如果列是字符数据或 text 数据类型，那么为排序次序返回唯一的名称。否则，返回 NULL。
DOMAIN_CATALOG | nvarchar(128) | 如果列是一种用户定义数据类型，那么该列是某个数据库名称，在该数据库名中创建了这种用户定义数据类型。否则，返回 NULL。
DOMAIN_SCHEMA | nvarchar(128) | 如果列是一种用户定义数据类型，那么该列是这种用户定义数据类型的创建者。否则，返回 NULL。
DOMAIN_NAME | nvarchar(128) | 如果列是一种用户定义数据类型，那么该列是这种用户定义数据类型的名称。否则，返回 NULL。

请参见

syscharsets

syscolumns

syscomments

sysconfigures

sysobjects

systypes


CONSTRAINT_COLUMN_USAGE

当前数据库中定义了约束的每一列在该视图中占一行。该信息架构视图返回当前用户对其拥有权限的对象的有关信息。INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE 视图以 sysobjects、syscolumns 和 systypes 系统表为基础。

若要从这些视图中检索信息，请指定完全合格的 INFORMATION_SCHEMA view_name 名称。

列名 | 数据类型 | 描述
TABLE_CATALOG | nvarchar(128) | 表限定符
TABLE_SCHEMA | nvarchar(128) | 表的所有者
TABLE_NAME | nvarchar(128) | 表名
COLUMN_NAME | nvarchar(128) | 列名
CONSTRAINT_CATALOG | nvarchar(128) | 约束限定符
CONSTRAINT_SCHEMA | nvarchar(128) | 约束所有者
CONSTRAINT_NAME | nvarchar(128) | 约束名

请参见

syscolumns

sysobjects

systypes


CONSTRAINT_TABLE_USAGE

当前数据库中定义了约束的每一个表在该视图中占一行。该信息架构视图返回当前用户对其拥有权限的对象的有关信息。INFORMATION_SCHEMA.CONSTRAINT_TABLE_USAGE 视图以 sysobjects 系统表为基础。

若要从这些视图中检索信息，请指定完全合格的 INFORMATION_SCHEMA view_name 名称。

列名 | 数据类型 | 描述
TABLE_CATALOG | nvarchar(128) | 表限定符
TABLE_SCHEMA | nvarchar(128) | 表的所有者
TABLE_NAME | sysname | 表名
CONSTRAINT_CATALOG | nvarchar(128) | 约束限定符
CONSTRAINT_SCHEMA | nvarchar(128) | 约束所有者
CONSTRAINT_NAME | sysname | 约束名

请参见

sysobjects


DOMAIN_CONSTRAINTS

每个这样的用户定义数据类型在该视图中占一行：当前数据库中的当前用户可以访问该用户定义数据类型，而且有一个规则被绑定到该类型。INFORMATION_SCHEMA.DOMAIN_CONSTRAINTS 视图以 sysobjects 和 systypes 系统表为基础。

若要从这些视图中检索信息，请指定完全合格的 INFORMATION_SCHEMA view_name 名称。

列名 | 数据类型 | 描述
CONSTRAINT_CATALOG | nvarchar(128) | 规则所在的数据库。
CONSTRAINT_SCHEMA | nvarchar(128) | 规则所有者。
CONSTRAINT_NAME | sysname | 规则名称。
DOMAIN_CATALOG | nvarchar(128) | 用户定义数据类型所在的数据库。
DOMAIN_SCHEMA | nvarchar(128) | 创建用户定义的数据类型的用户。
DOMAIN_NAME | sysname | 用户定义数据类型。
IS_DEFERRABLE | varchar(2) | 指定限制检查是否可延迟。总是返回 NO。
INITIALLY_DEFERRED | varchar(2) | 指定最初是否延迟限制检查。总是返回 NO。

请参见

sysobjects

systypes


DOMAINS

当前数据库中的当前用户可以访问的每个用户定义数据类型在该视图中占一行。INFORMATION_SCHEMA.DOMAINS 视图以 spt_data type_info、systypes、syscomments、sysconfigures 以及 syscharsets 系统表为基础。

若要从这些视图中检索信息，请指定完全合格的 INFORMATION_SCHEMA view_name 名称。

列名 | 数据类型 | 描述
DOMAIN_CATALOG | nvarchar(128) | 用户定义数据类型所在的数据库。
DOMAIN_SCHEMA | nvarchar(128) | 创建用户定义的数据类型的用户。
DOMAIN_NAME | sysname | 用户定义数据类型。
DATA_TYPE | sysname | 系统提供的数据类型。
CHARACTER_MAXIMUM_LENGTH | smallint | 以字符为单位的最大长度，适于二进制数据、字符数据，或者文本和图像数据。否则，返回 NULL。有关更多信息，请参见数据类型。
CHARACTER_OCTET_LENGTH | smallint | 以字节为单位的最大长度，适于二进制数据、字符数据，或者文本和图像数据。否则，返回 NULL。
COLLATION_CATALOG | varchar(6) | 如果列是字符数据或 text 数据类型，那么返回 master，指明在其中定义排序次序的数据库。否则此列为 NULL。
COLLATION_SCHEMA | varchar(3) | 返回 DBO，为字符数据或 text 数据类型指明排序次序的所有者。否则，返回 NULL。
COLLATION_NAME | nvarchar(128) | 如果列是字符数据或 text 数据类型，那么为排序次序返回唯一的名称。否则，返回 NULL。
CHARACTER_SET_CATALOG | varchar(6) | 如果列是字符数据或 text 数据类型，那么返回 master，指明字符集所在的数据库。否则，返回 NULL。
CHARACTER_SET_SCHEMA | varchar(3) | 如果列是字符数据或 text 数据类型，那么返回 DBO，指明字符集的所有者名称。否则，返回 NULL。
CHARACTER_SET_NAME | nvarchar(128) | 如果该列是字符数据或 text 数据类型，那么为字符集返回唯一的名称。否则，返回 NULL。
NUMERIC_PRECISION | tinyint | 近似数字数据、精确数字数据、整型数据或货币数据的精度。否则，返回 NULL。
NUMERIC_PRECISION_RADIX | smallint | 近似数字数据、精确数字数据、整型数据或货币数据的精度基数。否则，返回 NULL。
NUMERIC_SCALE | tinyint | 近似数字数据、精确数字数据、整数数据或货币数据的小数位数。否则，返回 NULL。
DATETIME_PRECISION | smallint | datetime 及 SQL-92 interval 数据类型的子类型代码。对于其它数据类型，该列返回 NULL。
DOMAIN_DEFAULT | nvarchar(4000) | 定义 Transact-SQL 语句的实际文本。

请参见

syscharsets

syscomments

sysconfigures

systypes


KEY_COLUMN_USAGE

当前数据库中作为键约束的每个列在该视图中占一行。该信息架构视图返回当前用户对其拥有权限的对象的有关信息。INFORMATION_SCHEMA.KEY_COLUMN_USAGE 视图以 sysobjects、syscolumns、sysreferences、spt_values 以及 sysindexes 系统表为基础。

若要从这些视图中检索信息，请指定完全合格的 INFORMATION_SCHEMA view_name 名称。

列名 | 数据类型 | 描述
CONSTRAINT_CATALOG | nvarchar(128) | 约束限定符
CONSTRAINT_SCHEMA | nvarchar(128) | 约束所有者名称
CONSTRAINT_NAME | nvarchar(128) | 约束名
TABLE_CATALOG | nvarchar(128) | 表限定符
TABLE_SCHEMA | nvarchar(128) | 表所有者名称
TABLE_NAME | nvarchar(128) | 表名
COLUMN_NAME | nvarchar(128) | 列名
ORDINAL_POSITION | int | 列顺序位置

请参见

syscolumns

sysindexes

sysobjects

sysreferences


PARAMETERS

当前数据库中当前用户可以访问的用户定义函数或存储过程的每个参数在该视图中占一行。对于函数，该视图还会返回一行返回值信息。

INFORMATION_SCHEMA.PARAMETERS 视图以 sysobjects 和 syscolumns 系统表为基础。

若要从这些视图中检索信息，请指定完全合格的 INFORMATION_SCHEMA view_name 名称。

列名 | 数据类型 | 描述
SPECIFIC_CATALOG | nvarchar(128) | 以此为参数的 ROUTINE 的目录名。
SPECIFIC_SCHEMA | nvarchar(128) | 以此为参数的 ROUTINE 的所有者名称。
SPECIFIC_NAME | nvarchar(128) | 以此为参数的 ROUTINE 的名称。
ORDINAL_POSITION | smallint | 参数的顺序位置，这个顺序位置从 1 开始。对于函数的返回值来说，这个值为 0。
PARAMETER_MODE | nvarchar(10) | 如果是输入参数，则返回 IN；如果是输出参数，则返回 OUT；如果是输入/输出参数，则返回 INOUT。
IS_RESULT | nvarchar(10) | 如果指明例程（该例程是一个函数）的结果，则返回 YES。否则，返回 NO。
AS_LOCATOR | nvarchar(10) | 如果声明为定位器，则返回 YES。否则，返回 NO。
PARAMETER_NAME | nvarchar(128) | 参数的名称。如果该名称与函数的返回值一致，则为 NULL。
DATA_TYPE | nvarchar(128) | 参数的数据类型。
CHARACTER_MAXIMUM_LENGTH | int | 以字符为单位的最大长度，适于二进制或字符数据类型。否则，返回 NULL。
CHARACTER_OCTET_LENGTH | int | 以字节为单位的最大长度，适于二进制或字符数据类型。否则，返回 NULL。
COLLATION_CATALOG | nvarchar(128) | 参数排序规则的目录名。如果不是一种字符类型，则返回 NULL。
COLLATION_SCHEMA | nvarchar(128) | 参数排序规则的架构名。如果不是一种字符类型，则返回 NULL。
COLLATION_NAME | nvarchar(128) | 参数排序规则的名称。如果不是一种字符类型，则返回 NULL。
CHARACTER_SET_CATALOG | nvarchar(128) | 参数字符集的目录名。如果不是一种字符类型，则返回 NULL。
CHARACTER_SET_SCHEMA | nvarchar(128) | 参数字符集的所有者名。如果不是一种字符类型，则返回 NULL。
CHARACTER_SET_NAME | nvarchar(128) | 参数字符集的名称。如果不是一种字符类型，则返回 NULL。
NUMERIC_PRECISION | tinyint | 近似数字数据、精确数字数据、整型数据或货币数据的精度。否则，返回 NULL。
NUMERIC_PRECISION_RADIX | smallint | 近似数字数据、精确数字数据、整型数据或货币数据的精度基数。否则，返回 NULL。
NUMERIC_SCALE | tinyint | 近似数字数据、精确数字数据、整数数据或货币数据的小数位数。否则，返回 NULL。
DATETIME_PRECISION | smallint | 如果参数类型是 datetime 或 smalldatetime，则为秒的小数精度。否则，返回 NULL。
INTERVAL_TYPE | nvarchar(30) | NULL。留作以后使用。
INTERVAL_PRECISION | smallint | NULL。留作以后使用。
USER_DEFINED_TYPE_CATALOG | nvarchar(128) | NULL。留作以后使用。
USER_DEFINED_TYPE_SCHEMA | nvarchar(128) | NULL。留作以后使用。
USER_DEFINED_TYPE_NAME | nvarchar(128) | NULL。留作以后使用。
SCOPE_CATALOG | nvarchar(128) | NULL。留作以后使用。
SCOPE_SCHEMA | nvarchar(128) | NULL。留作以后使用。
SCOPE_NAME | nvarchar(128) | NULL。留作以后使用。

请参见

syscolumns

sysobjects


REFERENTIAL_CONSTRAINTS

当前数据库中的每个外约束在该视图中占一行。该信息架构视图返回当前用户对其拥有权限的对象的有关信息。INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS 视图以 sysreferences、sysindexes 和 sysobjects 系统表为基础。

若要从这些视图中检索信息，请指定完全合格的 INFORMATION_SCHEMA view_name 名称。

列名 | 数据类型 | 描述
CONSTRAINT_CATALOG | nvarchar(128) | 约束限定符。
CONSTRAINT_SCHEMA | nvarchar(128) | 约束所有者。
CONSTRAINT_NAME | sysname | 约束名称。
UNIQUE_CONSTRAINT_CATALOG | nvarchar(128) | 唯一的约束限定符。
UNIQUE_CONSTRAINT_SCHEMA | nvarchar(128) | 唯一的约束所有者。
UNIQUE_CONSTRAINT_NAME | sysname | 唯一的约束。
MATCH_OPTION varchar(7) 引用约束匹配条件。始终返回 NONE，表示没有定义匹配。下列情况下，则将条件视为匹配
  • 外键列中至少有一个值为 NULL；

    或

  • 外键列中的所有值都不为 NULL 且主键表中有一行含有完全相同的键。
UPDATE_RULE varchar(9) 当 Transact-SQL 语句违反了该约束定义的引用完整性时将采取的操作。

返回 NO ACTION 或 CASCADE。如果对于该约束，在 ON UPDATE 上指定了 NO ACTION，那么对该约束中引用的主键的更新不会传播到外键。如果因为至少有一个外键包含相同的值，而导致主键的这种更新违反引用完整性，那么 SQL Server 将不会对父表和涉及的表执行任何更改。SQL Server 还将产生一个错误。

如果对于该约束，在 ON UPDATE 上指定了 CASCADE，那么对主键值所做的任何更改都将自动地传播到外键值。
DELETE_RULE varchar(9) 当 Transact-SQL 语句违反了该约束定义的引用完整性时将采取的操作。

返回 NO ACTION 或 CASCADE。如果对于该约束，在 ON DELETE 上定义了 NO ACTION，那么对该约束中引用的主键所做的删除将不会传播到外键。如果因为至少有一个外键包含相同的值，而导致主键的这种删除违反引用完整性，那么 SQL Server 将不会对父表和涉及的表执行任何更改。SQL Server 还将产生一个错误。

如果对于该约束，在 ON DELETE 上指定了 CASCADE，那么对主键值所做的任何更改都将自动地传播到外键值。

请参见

sysindexes

sysobjects

sysreferences


ROUTINE_COLUMNS

当前数据库中当前用户可访问的表值函数所返回的每一列在该视图中占一行。

INFORMATION_SCHEMA.ROUTINE_COLUMNS 视图以 sysobjects 和 syscolumns 系统表为基础。

若要从这些视图中检索信息，请指定完全合格的 INFORMATION_SCHEMA view_name 名称。

列名 | 数据类型 | 描述
TABLE_CATALOG | nvarchar(128) | 表值函数的目录或数据库名称。
TABLE_SCHEMA | nvarchar(128) | 表值函数的所有者。
TABLE_NAME | nvarchar(128) | 表值函数的名称。
COLUMN_NAME | nvarchar(128) | 列名。
ORDINAL_POSITION | smallint | 列标识号。
COLUMN_DEFAULT | nvarchar(4000) | 列的默认值。
IS_NULLABLE | varchar(3) | 如果该列允许 NULL，那么返回 YES。否则，返回 NO。
DATA_TYPE | nvarchar(128) | 系统提供的数据类型。
CHARACTER_MAXIMUM_LENGTH | smallint | 以字符为单位的最大长度，适于二进制数据、字符数据，或者文本和图像数据。否则，返回 NULL。有关更多信息，请参见数据类型。
CHARACTER_OCTET_LENGTH | smallint | 以字节为单位的最大长度，适于二进制数据、字符数据，或者文本和图像数据。否则，返回 NULL。
NUMERIC_PRECISION | tinyint | 近似数字数据、精确数字数据、整型数据或货币数据的精度。否则，返回 NULL。
NUMERIC_PRECISION_RADIX | smallint | 近似数字数据、精确数字数据、整型数据或货币数据的精度基数。否则，返回 NULL。
NUMERIC_SCALE | tinyint | 近似数字数据、精确数字数据、整数数据或货币数据的小数位数。否则，返回 NULL。
DATETIME_PRECISION | smallint | datetime 及 SQL-92 integer 数据类型的子类型代码。对于其它数据类型，返回 NULL。
CHARACTER_SET_CATALOG | varchar(6) | 如果列是字符数据或 text 数据类型，那么返回 master，指明字符集所在的数据库。否则，返回 NULL。
CHARACTER_SET_SCHEMA | varchar(3) | 如果列是字符数据或 text 数据类型，那么返回 DBO，指明字符集的所有者名称。否则，返回 NULL。
CHARACTER_SET_NAME | nvarchar(128) | 如果该列是字符数据或 text 数据类型，那么为字符集返回唯一的名称。否则，返回 NULL。
COLLATION_CATALOG | varchar(6) | 如果列是字符数据或 text 数据类型，那么返回 master，指明在其中定义排序次序的数据库。否则，返回 NULL。
COLLATION_SCHEMA | varchar(3) | 返回 DBO，为字符数据或 text 数据类型指明排序次序的所有者。否则，返回 NULL。
COLLATION_NAME | nvarchar(128) | 如果列是字符数据或 text 数据类型，那么为排序次序返回唯一的名称。否则，返回 NULL。
DOMAIN_CATALOG | nvarchar(128) | 如果列是一种用户定义数据类型，那么该列是某个数据库名称，在该数据库名中创建了这种用户定义数据类型。否则，返回 NULL。
DOMAIN_SCHEMA | nvarchar(128) | 如果列是一种用户定义数据类型，那么该列是这种用户定义数据类型的创建者。否则，返回 NULL。
DOMAIN_NAME | nvarchar(128) | 如果列是一种用户定义数据类型，那么该列是这种用户定义数据类型的名称。否则，返回 NULL。

请参见

syscolumns

sysobjects


ROUTINES

当前数据库中的当前用户可以访问的每个存储过程及函数在该视图中占一行。描述返回值的那些列只适用于函数。对于存储过程，这些列将为 NULL。

INFORMATION_SCHEMA.ROUTINES 视图以 sysobjects 和 syscolumns 系统表为基础。

若要从这些视图中检索信息，请指定完全合格的 INFORMATION_SCHEMA view_name 名称。

说明 ROUTINE_DEFINITION 列包含创建函数、存储过程或触发器的源语句。这些源语句有可能包含嵌入式回车符。如果将该列返回给某个以文本格式显示结果的应用程序，那么 ROUTINE_DEFINITION 结果中的嵌入式回车符可能会影响全部结果集的格式。如果选择 ROUTINE_DEFINITION 列，那么必须对嵌入式回车符进行调整，例如，通过将结果集返回到一个网格或者将 ROUTINE_DEFINITION 返回到其自己的文本框。

列名 | 数据类型 | 描述
SPECIFIC_CATALOG | nvarchar(128) | 特定的目录名称。 对于 SQL Server 2000，该名称与 ROUTINE_CATALOG 相同。
SPECIFIC_SCHEMA | nvarchar(128) | 特定的目录名称。 对于 SQL Server 2000，该名称与 ROUTINE_SCHEMA 相同。
SPECIFIC_NAME | nvarchar(128) | 特定的目录名称。 对于 SQL Server 2000，该名称与 ROUTINE_NAME 相同。
ROUTINE_CATALOG | nvarchar(128) | 函数的目录名。
ROUTINE_SCHEMA | nvarchar(128) | 函数的所有者名称。
ROUTINE_NAME | nvarchar(128) | 函数的名称。
ROUTINE_TYPE | nvarchar(20) | 为存储过程返回 PROCEDURE；为函数返回 FUNCTION。
MODULE_CATALOG | nvarchar(128) | NULL。留作以后使用。
MODULE_SCHEMA | nvarchar(128) | NULL。留作以后使用。
MODULE_NAME | nvarchar(128) | NULL。留作以后使用。
UDT_CATALOG | nvarchar(128) | NULL。留作以后使用。
UDT_SCHEMA | nvarchar(128) | NULL。留作以后使用。
UDT_NAME | nvarchar(128) | NULL。留作以后使用。
DATA_TYPE | nvarchar(128) | 函数返回值的数据类型。如果是表值函数，那么返回 table。
CHARACTER_MAXIMUM_LENGTH | int | 以字符为单位的最大长度（如果返回类型是字符类型）。
CHARACTER_OCTET_LENGTH | int | 以字节为单位的最大长度（如果返回类型是字符类型）。
COLLATION_CATALOG | nvarchar(128) | 返回值的排序规则名的目录部分。对于非字符类型，返回 NULL。
COLLATION_SCHEMA | nvarchar(128) | 返回值的排序规则名的架构部分。对于非字符类型，返回 NULL。
COLLATION_NAME | nvarchar(128) | 返回值的排序规则名。对于非字符类型，返回 NULL。
CHARACTER_SET_CATALOG | nvarchar(128) | 返回值的字符集的目录名。对于非字符类型，返回 NULL。
CHARACTER_SET_SCHEMA | nvarchar(128) | 返回值的字符集的架构名。对于非字符类型，返回 NULL。
CHARACTER_SET_NAME | nvarchar(128) | 返回值的字符集的名称。对于非字符类型，返回 NULL。
NUMERIC_PRECISION | smallint | 返回值的数字精度。对于非数字类型，返回 NULL。
NUMERIC_PRECISION_RADIX | smallint | 返回值的数字精度基数。对于非数字类型，返回 NULL。
NUMERIC_SCALE | smallint | 返回值的小数位数。对于非数字类型，返回 NULL。
DATETIME_PRECISION | smallint | 秒的小数精度（如果返回值是 datetime 类型）。否则，返回 NULL。
INTERVAL_TYPE | nvarchar(30) | NULL。留作以后使用。
INTERVAL_PRECISION | smallint | NULL。留作以后使用。
TYPE_UDT_CATALOG | nvarchar(128) | NULL。留作以后使用。
TYPE_UDT_SCHEMA | nvarchar(128) | NULL。留作以后使用。
TYPE_UDT_NAME | nvarchar(128) | NULL。留作以后使用。
SCOPE_CATALOG | nvarchar(128) | NULL。留作以后使用。
SCOPE_SCHEMA | nvarchar(128) | NULL。留作以后使用。
SCOPE_NAME | nvarchar(128) | NULL。留作以后使用。
MAXIMUM_CARDINALITY | bigint | NULL。留作以后使用。
DTD_IDENTIFIER | nvarchar(128) | NULL。留作以后使用。
ROUTINE_BODY | nvarchar(30) | 对于 T-SQL 函数，返回 SQL；对于外部编写的函数，返回 EXTERNAL。 在 SQL Server 2000 中，函数总是 SQL。
ROUTINE_DEFINITION | nvarchar(4000) | 函数或存储过程的定义文本（如果没有对函数或存储过程加密）。否则，返回 NULL。
EXTERNAL_NAME | nvarchar(128) | NULL。留作以后使用。
EXTERNAL_LANGUAGE | nvarchar(30) | NULL。留作以后使用。
PARAMETER_STYLE | nvarchar(30) | NULL。留作以后使用。
IS_DETERMINISTIC | nvarchar(10) | 如果例程是确定性的，那么返回 YES。 如果例程是不确定性的，那么返回 NO。 对于存储过程，总是返回 NO。
SQL_DATA_ACCESS | nvarchar(30) | 返回下面四个值中的一个： NONE = 函数不包含 SQL。 CONTAINS = 函数可能包含 SQL。 READS = 函数可能读取 SQL 数据。 MODIFIES = 函数可能修改 SQL 数据。 在 SQL Server 2000 中，为所有函数返回 READS，为所有存储过程返回 MODIFIES。
IS_NULL_CALL | nvarchar(10) | 指明如果例程的任何参数为 NULL，是否调用该例程。 在 SQL Server 2000 中，总是返回 YES。
SQL_PATH | nvarchar(128) | NULL。留作以后使用。
SCHEMA_LEVEL_ROUTINE | nvarchar(10) | 如果是架构级函数，那么返回 YES；如果不是架构级函数，则返回 NO。 在 SQL Server 2000 中，总是返回 YES。
MAX_DYNAMIC_RESULT_SETS | smallint | 例程返回的动态结果集的最大数。 如果是函数，则返回 0；如果是存储过程，则返回 TBD。
IS_USER_DEFINED_CAST | nvarchar(10) | 如果是用户定义投影函数，则返回 YES；如果不是用户定义投影函数，则返回 NO。 在 SQL Server 2000 中，总是返回 NO。
IS_IMPLICITLY_INVOCABLE | nvarchar(10) | 如果例程可隐式地调用，那么返回 YES；如果函数不可隐式地调用，那么返回 NO。 在 SQL Server 2000 中，总是返回 NO。
CREATED | datetime | 创建例程的时间。
LAST_ALTERED | datetime | 最后一次修改函数的时间。

请参见

syscolumns

sysobjects


SCHEMATA

当前用户具有权限的每个数据库在该视图中占一行。INFORMATION_SCHEMA.SCHEMATA 视图以 sysdatabases、sysconfigures 和 syscharsets 系统表为基础。

若要从这些视图中检索信息，请指定完全合格的 INFORMATION_SCHEMA view_name 名称。

列名 | 数据类型 | 描述
CATALOG_NAME | sysname | 当前用户具有权限的数据库的名称。
SCHEMA_NAME | nvarchar(128) | 返回对象的架构所有者的名称。
SCHEMA_OWNER | nvarchar(128) | 架构所有者名称。
DEFAULT_CHARACTER_SET_CATALOG | varchar(6) | 返回 master，指明在其中定义默认字符集的数据库。
DEFAULT_CHARACTER_SET_SCHEMA | varchar(3) | 返回 DBO，指明默认字符集所有者的名称。
DEFAULT_CHARACTER_SET_NAME | sysname | 返回默认字符集的名称。

请参见

syscharsets

sysconfigures

sysdatabases


TABLE_CONSTRAINTS

当前数据库中的每个表约束在该视图中占一行。该信息架构视图返回当前用户对其拥有权限的对象的有关信息。INFORMATION_SCHEMA.TABLE_CONSTRAINTS 视图以 sysobjects 系统表为基础。

若要从这些视图中检索信息，请指定完全合格的 INFORMATION_SCHEMA view_name 名称。

列名 | 数据类型 | 描述
CONSTRAINT_CATALOG | nvarchar(128) | 约束限定符。
CONSTRAINT_SCHEMA | nvarchar(128) | 约束所有者。
CONSTRAINT_NAME | sysname | 约束名称。
TABLE_CATALOG | nvarchar(128) | 表限定符。
TABLE_SCHEMA | nvarchar(128) | 表所有者。
TABLE_NAME | sysname | 表名。
CONSTRAINT_TYPE | varchar(11) | 约束的类型。可以是 CHECK、UNIQUE、PRIMARY KEY 或 FOREIGN KEY。
IS_DEFERRABLE | varchar(2) | 指定限制检查是否可延迟。总是返回 NO。
INITIALLY_DEFERRED | varchar(2) | 指定最初是否延迟限制检查。总是返回 NO。

请参见

sysobjects


TABLE_PRIVILEGES

当前数据库中每个授予当前用户的表特权或由当前用户授予的表特权在该视图中占一行。INFORMATION_SCHEMA.TABLE_PRIVILEGES 视图以 sysprotects 和 sysobjects 系统表为基础。

若要从这些视图中检索信息，请指定完全合格的 INFORMATION_SCHEMA view_name 名称。

列名 | 数据类型 | 描述
GRANTOR | nvarchar(128) | 特权授予方。
GRANTEE | nvarchar(128) | 特权被授予方。
TABLE_CATALOG | nvarchar(128) | 表限定符。
TABLE_SCHEMA | nvarchar(128) | 表所有者。
TABLE_NAME | sysname | 表名。
PRIVILEGE_TYPE | varchar(10) | 特权的类型。
IS_GRANTABLE | varchar(3) | 指定被授权方是否能够将权限授予其他人。

请参见

sysobjects

sysprotects


TABLES

当前用户具有权限的当前数据库中的每个表在该视图中占一行。INFORMATION_SCHEMA.TABLES 视图以 sysobjects 系统表为基础。

若要从这些视图中检索信息，请指定完全合格的 INFORMATION_SCHEMA view_name 名称。

列名 | 数据类型 | 描述
TABLE_CATALOG | nvarchar(128) | 表限定符。
TABLE_SCHEMA | nvarchar(128) | 表所有者。
TABLE_NAME | sysname | 表名。
TABLE_TYPE | varchar(10) | 表的类型。可以是 VIEW 或 BASE TABLE。

请参见

sysobjects


VIEW_COLUMN_USAGE

当前数据库中视图定义使用的每个列在该视图中占一行。该信息架构视图返回当前用户对其拥有权限的对象的有关信息。INFORMATION_SCHEMA.VIEW_COLUMN_USAGE 以 sysobjects 和 sysdepends 系统表为基础。

若要从这些视图中检索信息，请指定完全合格的 INFORMATION_SCHEMA view_name 名称。

列名 | 数据类型 | 描述
VIEW_CATALOG | nvarchar(128) | 视图限定符
VIEW_SCHEMA | nvarchar(128) | 视图所有者
VIEW_NAME | sysname | 视图名
TABLE_CATALOG | nvarchar(128) | 表限定符
TABLE_SCHEMA | nvarchar(128) | 表的所有者
TABLE_NAME | sysname | 基表
COLUMN_NAME | sysname | 列名

请参见

sysdepends

sysobjects


VIEW_TABLE_USAGE

当前数据库中视图使用的每个表在该视图中占一行。该信息架构视图返回当前用户对其拥有权限的对象的有关信息。INFORMATION_SCHEMA.VIEW_TABLE_USAGE 视图以 sysobjects 和 sysdepends 系统表为基础。

若要从这些视图中检索信息，请指定完全合格的 INFORMATION_SCHEMA view_name 名称。

列名 | 数据类型 | 描述
VIEW_CATALOG | nvarchar(128) | 视图限定符。
VIEW_SCHEMA | nvarchar(128) | 视图所有者。
VIEW_NAME | sysname | 视图名。
TABLE_CATALOG | nvarchar(128) | 表限定符。
TABLE_SCHEMA | nvarchar(128) | 基表所有者。
TABLE_NAME | sysname | 视图所基于的基表。

请参见

sysdepends

sysobjects


VIEWS

当前数据库中的当前用户可以访问的视图在该视图中占一行。INFORMATION_SCHEMA.VIEWS 以 sysobjects 和 syscomments 系统表为基础。

若要从这些视图中检索信息，请指定完全合格的 INFORMATION_SCHEMA view_name 名称。

列名 | 数据类型 | 描述
TABLE_CATALOG | nvarchar(128) | 视图限定符。
TABLE_SCHEMA | nvarchar(128) | 视图所有者。
TABLE_NAME | nvarchar(128) | 视图名。
VIEW_DEFINITION | nvarchar(4000) | 如果定义的长度大于 nvarchar(4000)，那么该列为 NULL；否则，该列为视图定义文本。
CHECK_OPTION | varchar(7) | WITH CHECK OPTION 的类型。如果最初的视图是使用 WITH CHECK OPTION 创建的，那么就为 CASCADE。否则，返回 NONE。
IS_UPDATABLE | varchar(2) | 指定视图是否可更新。总是返回 NO。

请参见

syscomments


游标

Microsoft® SQL Server™ 语句产生完整的结果集，但有时候最好对结果进行逐行处理。打开结果集中的游标，即可对结果集进行逐行处理。在 SQL Server 7.0 版中，还可以将游标指派给带有 cursor 数据类型的变量或参数。

下面这些语句支持游标操作：

CLOSE

CREATE PROCEDURE

DEALLOCATE

DECLARE CURSOR

DECLARE @local_variable

DELETE

FETCH

OPEN

UPDATE

SET

下面这些系统函数和系统存储过程也支持游标：

@@CURSOR_ROWS

CURSOR_STATUS

@@FETCH_STATUS

sp_cursor_list

sp_describe_cursor

sp_describe_cursor_columns

sp_describe_cursor_tables

请参见

游标


运算符

运算符是一种符号，用来指定要在一个或多个表达式中执行的操作。Microsoft® SQL Server™ 2000 使用下列几类运算符：

  • 算术运算符

  • 赋值运算符

  • 位运算符

  • 比较运算符

  • 逻辑运算符

  • 字符串串联运算符

  • 一元运算符
算术运算符

算术运算符在两个表达式上执行数学运算，这两个表达式可以是数字数据类型分类的任何数据类型。有关数据类型分类的更多信息，请参见 Transact-SQL 语法规则。

运算符 | 含义
+（加） | 加法。
-（减） | 减法。
*（乘） | 乘法。
/（除） | 除法。
%（模） | 返回一个除法的整数余数。例如，12 % 5 = 2，这是因为 12 除以 5，余数为 2。

加 (+) 和减 (–) 运算符也可用于对 datetime 及 smalldatetime 值执行算术运算。

有关算术运算结果的精度和小数位数的更多信息，请参见精度、小数位数及长度。

赋值运算符

Transact-SQL 有一个赋值运算符，即等号 (=)。在下面的示例中，创建了 @MyCounter 变量。然后，赋值运算符将 @MyCounter 设置成一个由表达式返回的值。

DECLARE @MyCounter INT
SET @MyCounter = 1

也可以使用赋值运算符在列标题和为列定义值的表达式之间建立关系。下面的示例显示名为 FirstColumnHeading 和 SecondColumnHeading 的两个列标题。在 FirstColumnHeading 列标题中为所有的行都显示字符串 xyz。然后，在 SecondColumnHeading 列标题中列出来自 Products 表的每个产品 ID。

USE Northwind
GO
SELECT FirstColumnHeading = 'xyz',
       SecondColumnHeading = ProductID
FROM Products
GO
按位运算符

位运算符在两个表达式之间执行位操作，这两个表达式可以为整型数据类型分类中的任何数据类型。

运算符 | 含义
&（按位 AND） | 按位 AND（两个操作数）。
|（按位 OR） | 按位 OR（两个操作数）。
^（按位互斥 OR） | 按位互斥 OR（两个操作数）。

位运算符的操作数可以是整型或二进制字符串数据类型分类中的任何数据类型（但 image 数据类型除外），此外，两个操作数不能同时是二进制字符串数据类型分类中的某种数据类型。下表显示所支持的操作数数据类型。

左边操作数 | 右边操作数
binary | int、smallint 或 tinyint
bit | int、smallint、tinyint 或 bit
int | int、smallint、tinyint、binary 或 varbinary
smallint | int、smallint、tinyint、binary 或 varbinary
tinyint | int、smallint、tinyint、binary 或 varbinary
varbinary | int、smallint 或 tinyint

比较运算符

比较运算符测试两个表达式是否相同。除了 text、ntext 或 image 数据类型的表达式外，比较运算符可以用于所有的表达式。

运算符 | 含义
=（等于） | 等于
>（大于） | 大于
<（小于） | 小于
>=（大于或等于） | 大于等于
<=（小于或等于） | 小于等于
<>（不等于） | 不等于
!=（不等于） | 不等于（非 SQL-92 标准）
!< （不小于） | 不小于（非 SQL-92 标准）
!> （不大于） | 不大于（非 SQL-92 标准）

比较运算符的结果有布尔数据类型，它有三种值：TRUE、FALSE 及 UNKNOWN。那些返回布尔数据类型的表达式被称为布尔表达式。

和其它 SQL Server 数据类型不同，不能将布尔数据类型指定为表列或变量的数据类型，也不能在结果集中返回布尔数据类型。

当 SET ANSI_NULLS 为 ON 时，带有一个或两个 NULL 表达式的运算符返回 UNKNOWN。当 SET ANSI_NULLS 为 OFF 时，上述规则同样适用，只不过如果两个表达式都为 NULL，那么等号运算符返回 TRUE。例如，如果 SET ANSI_NULLS 是 OFF，那么 NULL = NULL 就返回 TRUE。

在 WHERE 子句中使用带有布尔数据类型的表达式，可以筛选出符合搜索条件的行，也可以在流控制语言语句（例如 IF 和 WHILE）中使用这种表达式。例如：

USE Northwind
GO
DECLARE @MyProduct int
SET @MyProduct = 10
IF (@MyProduct <> 0)
   SELECT *
   FROM Products
   WHERE ProductID = @MyProduct
GO
逻辑运算符

逻辑运算符对某个条件进行测试，以获得其真实情况。逻辑运算符和比较运算符一样，返回带有 TRUE 或 FALSE 值的布尔数据类型。

运算符 | 含义
ALL | 如果一系列的比较都为 TRUE，那么就为 TRUE。
AND | 如果两个布尔表达式都为 TRUE，那么就为 TRUE。
ANY | 如果一系列的比较中任何一个为 TRUE，那么就为 TRUE。
BETWEEN | 如果操作数在某个范围之内，那么就为 TRUE。
EXISTS | 如果子查询包含一些行，那么就为 TRUE。
IN | 如果操作数等于表达式列表中的一个，那么就为 TRUE。
LIKE | 如果操作数与一种模式相匹配，那么就为 TRUE。
NOT | 对任何其它布尔运算符的值取反。
OR | 如果两个布尔表达式中的一个为 TRUE，那么就为 TRUE。
SOME | 如果在一系列比较中，有些为 TRUE，那么就为 TRUE。

有关逻辑运算符的更多信息，请参见专门的逻辑运算符主题。

字符串串联运算符

字符串串联运算符允许通过加号 (+) 进行字符串串联，这个加号也被称为字符串串联运算符。其它所有的字符串操作都可以通过字符串函数（例如 SUBSTRING）进行处理。

默认情况下，对于 varchar 数据类型的数据，在 INSERT 或赋值语句中，将空的字符串解释为空字符串。在串联 varchar、char 或 text 数据类型的数据时，空的字符串被解释为空字符串。例如，将 'abc' + '' + 'def' 存储为 'abcdef'。但是，如果 sp_dbcmptlevel 兼容性级别设置为 65，那么将空的常量当作一个空格字符，这样就将 'abc' + '' + 'def' 存储为 'abc def'。有关空字符串的解释的更多信息，请参见 sp_dbcmptlevel。

当两字符串串联时，根据排序规则的优先规则设置结果表达式的排序规则。有关更多信息，请参见排序规则的优先顺序。

一元运算符

一元运算符只对一个表达式执行操作，这个表达式可以是数字数据类型分类中的任何一种数据类型。

运算符 | 含义
+ （正） | 数值为正。
- （负） | 数值为负。
~（按位 NOT） | 返回数字的补数。

+ （正）和 - （负）运算符可以用于数字数据类型分类的任何数据类型的表达式。~ （按位 NOT）运算符只可以用于整型数据类型分类的任何数据类型的表达式。

运算符的优先顺序

当一个复杂的表达式有多个运算符时，运算符优先性决定执行运算的先后次序。执行的顺序可能严重地影响所得到的值。

运算符有下面这些优先等级。在较低等级的运算符之前先对较高等级的运算符进行求值。

  • +（正）、-（负）、~（按位 NOT）

  • *（乘）、/（除）、%（模）

  • +（加）、（+ 串联）、-（减）

  • =, >, <, >=, <=, <>, !=, !>, !< 比较运算符

  • ^（位异或）、&（位与）、|（位或）

  • NOT

  • AND

  • ALL、ANY、BETWEEN、IN、LIKE、OR、SOME

  • =（赋值）

当一个表达式中的两个运算符有相同的运算符优先等级时，基于它们在表达式中的位置来对其从左到右进行求值。例如，在下面的示例中，在 SET 语句中使用的表达式中，在加号运算符之前先对减号运算符进行求值。

DECLARE @MyNumber int
SET @MyNumber = 4 - 2 + 27
-- Evaluates to 2 + 27 which yields an expression result of 29.
SELECT @MyNumber

在表达式中可以使用括号替代所定义的运算符的优先性。首先对括号中的内容进行求值，从而产生一个值，然后括号外的运算符才可以使用这个值。

例如在下面的示例中，在 SET 语句所使用的表达式中，乘运算符比加运算符有更高的优先权，所以先对乘运算符进行求值；表达式的结果是 13。

DECLARE @MyNumber int
SET @MyNumber = 2 * 4 + 5
-- Evaluates to 8 + 5 which yields an expression result of 13.
SELECT @MyNumber

在下面的示例中，在 SET 语句使用的表达式中，括号使得首先执行加法；表达式结果是 18。

DECLARE @MyNumber int
SET @MyNumber = 2 * (4 + 5)
-- Evaluates to 2 * 9 which yields an expression result of 18.
SELECT @MyNumber

如果表达式有嵌套的括号，那么首先对嵌套最深的表达式求值。下面的示例中包含嵌套的括号，其中表达式 5 - 3 在嵌套最深的那对括号中。该表达式产生一个值 2。然后加运算符将这个结果与 4 相加，这样就得出一个为 6 的值。最后将 6 与 2 相乘，产生一个表达式结果 12。

DECLARE @MyNumber int
SET @MyNumber = 2 * (4 + (5 - 3) )
-- Evaluates to 2 * (4 + 2) which further evaluates to 2 * 6, and
-- yields an expression result of 12.
SELECT @MyNumber

请参见

函数


VFP 8

SQL语言参考资料

资料整理 ：LXH2002

资料来源：SQL SERVER 2000 帮助系统

未经许可不得转载